1372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen/*
2372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * Copyright (C) 2007 The Android Open Source Project
3372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen *
4372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
5372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * you may not use this file except in compliance with the License.
6372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * You may obtain a copy of the License at
7372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen *
8372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
9372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen *
10372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * Unless required by applicable law or agreed to in writing, software
11372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
12372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * See the License for the specific language governing permissions and
14372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * limitations under the License.
15372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen */
16372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
17372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#ifndef SOUNDPOOL_H_
18372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#define SOUNDPOOL_H_
19372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
20372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/threads.h>
21372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/List.h>
22372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/Vector.h>
23372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/KeyedVector.h>
24372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <media/AudioTrack.h>
25372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <binder/MemoryHeapBase.h>
26372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <binder/MemoryBase.h>
27372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
28372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissennamespace android {
29372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
30372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenstatic const int IDLE_PRIORITY = -1;
31372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
32372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// forward declarations
33372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundEvent;
34372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPoolThread;
35372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPool;
36372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
37372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// for queued events
38372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPoolEvent {
39372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
40ae1aadc04f9cee280c3c328a533e2ceeb4b71d47Chih-Hung Hsieh    explicit SoundPoolEvent(int msg, int arg1=0, int arg2=0) :
41372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen        mMsg(msg), mArg1(arg1), mArg2(arg2) {}
42372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int         mMsg;
43372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int         mArg1;
44372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int         mArg2;
45372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    enum MessageType { INVALID, SAMPLE_LOADED };
46372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
47372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
48372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// callback function prototype
49372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissentypedef void SoundPoolCallback(SoundPoolEvent event, SoundPool* soundPool, void* user);
50372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
51372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// tracks samples used by application
52372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass Sample  : public RefBase {
53372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
54372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    enum sample_state { UNLOADED, LOADING, READY, UNLOADING };
55372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Sample(int sampleID, int fd, int64_t offset, int64_t length);
56372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    ~Sample();
57372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int sampleID() { return mSampleID; }
58372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int numChannels() { return mNumChannels; }
59372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int sampleRate() { return mSampleRate; }
60372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    audio_format_t format() { return mFormat; }
61372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    size_t size() { return mSize; }
62372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int state() { return mState; }
63372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    uint8_t* data() { return static_cast<uint8_t*>(mData->pointer()); }
64372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    status_t doLoad();
65372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void startLoad() { mState = LOADING; }
66372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<IMemory> getIMemory() { return mData; }
67372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
68372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate:
69372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void init();
70372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
71372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    size_t              mSize;
72372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    volatile int32_t    mRefCount;
73372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    uint16_t            mSampleID;
74372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    uint16_t            mSampleRate;
75a1c3516a243d00428ff2b470409d47cc9f5c9523Andy Hung    uint8_t             mState;
76a1c3516a243d00428ff2b470409d47cc9f5c9523Andy Hung    uint8_t             mNumChannels;
77372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    audio_format_t      mFormat;
78372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                 mFd;
79372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int64_t             mOffset;
80372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int64_t             mLength;
81372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<IMemory>         mData;
82372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<MemoryHeapBase>  mHeap;
83372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
84372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
85372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// stores pending events for stolen channels
86372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundEvent
87372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen{
88372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
89372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundEvent() : mChannelID(0), mLeftVolume(0), mRightVolume(0),
90372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen            mPriority(IDLE_PRIORITY), mLoop(0), mRate(0) {}
91372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void set(const sp<Sample>& sample, int channelID, float leftVolume,
92372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen            float rightVolume, int priority, int loop, float rate);
93372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<Sample>      sample() { return mSample; }
94372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             channelID() { return mChannelID; }
95372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           leftVolume() { return mLeftVolume; }
96372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           rightVolume() { return mRightVolume; }
97372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             priority() { return mPriority; }
98372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             loop() { return mLoop; }
99372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           rate() { return mRate; }
100372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void            clear() { mChannelID = 0; mSample.clear(); }
101372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
102372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprotected:
103372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<Sample>      mSample;
104372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             mChannelID;
105372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           mLeftVolume;
106372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           mRightVolume;
107372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             mPriority;
108372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int             mLoop;
109372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    float           mRate;
110372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
111372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
112372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// for channels aka AudioTracks
113372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundChannel : public SoundEvent {
114372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
115372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    enum state { IDLE, RESUMING, STOPPING, PAUSED, PLAYING };
116372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundChannel() : mState(IDLE), mNumChannels(1),
1178e48c6939bd81dcbc596f0a4b11bfaea73aed00bJean-Michel Trivi            mPos(0), mToggle(0), mAutoPaused(false), mMuted(false) {}
118372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    ~SoundChannel();
119372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void init(SoundPool* soundPool);
120372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void play(const sp<Sample>& sample, int channelID, float leftVolume, float rightVolume,
121372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen            int priority, int loop, float rate);
122372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setVolume_l(float leftVolume, float rightVolume);
123372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setVolume(float leftVolume, float rightVolume);
1248e48c6939bd81dcbc596f0a4b11bfaea73aed00bJean-Michel Trivi    void mute(bool muting);
125372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void stop_l();
126372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void stop();
127372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void pause();
128372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void autoPause();
129372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void resume();
130372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void autoResume();
131372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setRate(float rate);
132372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int state() { return mState; }
133372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setPriority(int priority) { mPriority = priority; }
134372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setLoop(int loop);
135372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int numChannels() { return mNumChannels; }
136372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void clearNextEvent() { mNextEvent.clear(); }
137372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void nextEvent();
138372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int nextChannelID() { return mNextEvent.channelID(); }
139372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void dump();
1400c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung    int getPrevSampleID(void) { return mPrevSampleID; }
141372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
142372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate:
143372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    static void callback(int event, void* user, void *info);
144372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void process(int event, void *info, unsigned long toggle);
145372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool doStop_l();
146372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
147372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPool*          mSoundPool;
148372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    sp<AudioTrack>      mAudioTrack;
149372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundEvent          mNextEvent;
150372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Mutex               mLock;
151372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                 mState;
152372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                 mNumChannels;
153372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                 mPos;
154372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                 mAudioBufferSize;
155372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    unsigned long       mToggle;
156372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool                mAutoPaused;
1570c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung    int                 mPrevSampleID;
1588e48c6939bd81dcbc596f0a4b11bfaea73aed00bJean-Michel Trivi    bool                mMuted;
159372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
160372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
161372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// application object for managing a pool of sounds
162372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPool {
163372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    friend class SoundPoolThread;
164372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    friend class SoundChannel;
165372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
166372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPool(int maxChannels, const audio_attributes_t* pAttributes);
167372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    ~SoundPool();
168372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int load(int fd, int64_t offset, int64_t length, int priority);
169372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool unload(int sampleID);
170372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int play(int sampleID, float leftVolume, float rightVolume, int priority,
171372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen            int loop, float rate);
172372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void pause(int channelID);
1738e48c6939bd81dcbc596f0a4b11bfaea73aed00bJean-Michel Trivi    void mute(bool muting);
174372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void autoPause();
175372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void resume(int channelID);
176372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void autoResume();
177372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void stop(int channelID);
178372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setVolume(int channelID, float leftVolume, float rightVolume);
179372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setPriority(int channelID, int priority);
180372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setLoop(int channelID, int loop);
181372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setRate(int channelID, float rate);
182372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    const audio_attributes_t* attributes() { return &mAttributes; }
183372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
184372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    // called from SoundPoolThread
185372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void sampleLoaded(int sampleID);
1860a887bcd5c5a8056735d221ad71afcff1f6eb1a6Andy Hung    sp<Sample> findSample(int sampleID);
187372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
188372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    // called from AudioTrack thread
189372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void done_l(SoundChannel* channel);
190372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
191372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    // callback function
192372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void setCallback(SoundPoolCallback* callback, void* user);
193372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void* getUserData() { return mUserData; }
194372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
195372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate:
196372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPool() {} // no default constructor
197372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool startThreads();
1980a887bcd5c5a8056735d221ad71afcff1f6eb1a6Andy Hung    sp<Sample> findSample_l(int sampleID);
199372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundChannel* findChannel (int channelID);
200372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundChannel* findNextChannel (int channelID);
2010c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung    SoundChannel* allocateChannel_l(int priority, int sampleID);
202372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void moveToFront_l(SoundChannel* channel);
203372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void notify(SoundPoolEvent event);
204372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void dump();
205372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
206372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    // restart thread
207372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void addToRestartList(SoundChannel* channel);
208372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void addToStopList(SoundChannel* channel);
209372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    static int beginThread(void* arg);
210372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int run();
211372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void quit();
212372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
213372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Mutex                   mLock;
214372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Mutex                   mRestartLock;
215372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Condition               mCondition;
216372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPoolThread*        mDecodeThread;
217372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundChannel*           mChannelPool;
218372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    List<SoundChannel*>     mChannels;
219372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    List<SoundChannel*>     mRestart;
220372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    List<SoundChannel*>     mStop;
221372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    DefaultKeyedVector< int, sp<Sample> >   mSamples;
222372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                     mMaxChannels;
223372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    audio_attributes_t      mAttributes;
224372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                     mAllocated;
225372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                     mNextSampleID;
226372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int                     mNextChannelID;
227372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool                    mQuit;
2288e48c6939bd81dcbc596f0a4b11bfaea73aed00bJean-Michel Trivi    bool                    mMuted;
229372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
230372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    // callback
231372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Mutex                   mCallbackLock;
232372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPoolCallback*      mCallback;
233372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void*                   mUserData;
234372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
235372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
236372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen} // end namespace android
237372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
238372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#endif /*SOUNDPOOL_H_*/
239