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