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: 40372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 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), 117372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen mPos(0), mToggle(0), mAutoPaused(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); 124372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void stop_l(); 125372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void stop(); 126372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void pause(); 127372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void autoPause(); 128372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void resume(); 129372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void autoResume(); 130372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setRate(float rate); 131372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int state() { return mState; } 132372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setPriority(int priority) { mPriority = priority; } 133372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setLoop(int loop); 134372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int numChannels() { return mNumChannels; } 135372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void clearNextEvent() { mNextEvent.clear(); } 136372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void nextEvent(); 137372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int nextChannelID() { return mNextEvent.channelID(); } 138372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void dump(); 1390c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung int getPrevSampleID(void) { return mPrevSampleID; } 140372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 141372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate: 142372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen static void callback(int event, void* user, void *info); 143372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void process(int event, void *info, unsigned long toggle); 144372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen bool doStop_l(); 145372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 146372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundPool* mSoundPool; 147372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen sp<AudioTrack> mAudioTrack; 148372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundEvent mNextEvent; 149372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen Mutex mLock; 150372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mState; 151372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mNumChannels; 152372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mPos; 153372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mAudioBufferSize; 154372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen unsigned long mToggle; 155372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen bool mAutoPaused; 1560c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung int mPrevSampleID; 157372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen}; 158372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 159372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen// application object for managing a pool of sounds 160372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPool { 161372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen friend class SoundPoolThread; 162372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen friend class SoundChannel; 163372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic: 164372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundPool(int maxChannels, const audio_attributes_t* pAttributes); 165372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen ~SoundPool(); 166372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int load(int fd, int64_t offset, int64_t length, int priority); 167372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen bool unload(int sampleID); 168372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int play(int sampleID, float leftVolume, float rightVolume, int priority, 169372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int loop, float rate); 170372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void pause(int channelID); 171372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void autoPause(); 172372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void resume(int channelID); 173372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void autoResume(); 174372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void stop(int channelID); 175372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setVolume(int channelID, float leftVolume, float rightVolume); 176372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setPriority(int channelID, int priority); 177372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setLoop(int channelID, int loop); 178372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setRate(int channelID, float rate); 179372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen const audio_attributes_t* attributes() { return &mAttributes; } 180372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 181372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen // called from SoundPoolThread 182372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void sampleLoaded(int sampleID); 1830275a982abecee683f16c827d405eafe51fb67aeAndy Hung sp<Sample> findSample(int sampleID); 184372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 185372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen // called from AudioTrack thread 186372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void done_l(SoundChannel* channel); 187372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 188372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen // callback function 189372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void setCallback(SoundPoolCallback* callback, void* user); 190372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void* getUserData() { return mUserData; } 191372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 192372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate: 193372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundPool() {} // no default constructor 194372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen bool startThreads(); 1950275a982abecee683f16c827d405eafe51fb67aeAndy Hung sp<Sample> findSample_l(int sampleID); 196372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundChannel* findChannel (int channelID); 197372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundChannel* findNextChannel (int channelID); 1980c4b81bd3ef3fd5eb0f7d1b8e2c6168b95020134Andy Hung SoundChannel* allocateChannel_l(int priority, int sampleID); 199372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void moveToFront_l(SoundChannel* channel); 200372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void notify(SoundPoolEvent event); 201372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void dump(); 202372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 203372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen // restart thread 204372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void addToRestartList(SoundChannel* channel); 205372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void addToStopList(SoundChannel* channel); 206372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen static int beginThread(void* arg); 207372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int run(); 208372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void quit(); 209372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 210372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen Mutex mLock; 211372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen Mutex mRestartLock; 212372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen Condition mCondition; 213372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundPoolThread* mDecodeThread; 214372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundChannel* mChannelPool; 215372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen List<SoundChannel*> mChannels; 216372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen List<SoundChannel*> mRestart; 217372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen List<SoundChannel*> mStop; 218372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen DefaultKeyedVector< int, sp<Sample> > mSamples; 219372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mMaxChannels; 220372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen audio_attributes_t mAttributes; 221372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mAllocated; 222372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mNextSampleID; 223372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen int mNextChannelID; 224372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen bool mQuit; 225372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 226372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen // callback 227372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen Mutex mCallbackLock; 228372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen SoundPoolCallback* mCallback; 229372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen void* mUserData; 230372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen}; 231372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 232372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen} // end namespace android 233372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen 234372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#endif /*SOUNDPOOL_H_*/ 235