12e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent/* 22e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * Copyright (C) 2007 The Android Open Source Project 32e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * 42e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 52e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * you may not use this file except in compliance with the License. 62e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * You may obtain a copy of the License at 72e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * 82e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 92e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * 102e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * Unless required by applicable law or agreed to in writing, software 112e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 122e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * See the License for the specific language governing permissions and 142e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * limitations under the License. 152e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent */ 162e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 172e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#ifndef SOUNDPOOL_H_ 182e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#define SOUNDPOOL_H_ 192e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 202e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/threads.h> 212e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/List.h> 222e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/Vector.h> 232e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/KeyedVector.h> 242e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <media/AudioTrack.h> 253d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent#include <binder/MemoryHeapBase.h> 263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent#include <binder/MemoryBase.h> 272e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 282e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentnamespace android { 292e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 302e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentstatic const int IDLE_PRIORITY = -1; 312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 322e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// forward declarations 332e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundEvent; 342e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPoolThread; 352e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPool; 362e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 372e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// for queued events 382e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPoolEvent { 392e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic: 402e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolEvent(int msg, int arg1=0, int arg2=0) : 412e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsg(msg), mArg1(arg1), mArg2(arg2) {} 422e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mMsg; 432e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mArg1; 442e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mArg2; 452e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent enum MessageType { INVALID, SAMPLE_LOADED }; 462e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent}; 472e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 482e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// callback function prototype 492e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurenttypedef void SoundPoolCallback(SoundPoolEvent event, SoundPool* soundPool, void* user); 502e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 512e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// tracks samples used by application 522e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass Sample : public RefBase { 532e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic: 542e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent enum sample_state { UNLOADED, LOADING, READY, UNLOADING }; 552e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Sample(int sampleID, const char* url); 562e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Sample(int sampleID, int fd, int64_t offset, int64_t length); 572e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ~Sample(); 582e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int sampleID() { return mSampleID; } 592e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int numChannels() { return mNumChannels; } 602e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int sampleRate() { return mSampleRate; } 612e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent audio_format_t format() { return mFormat; } 622e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent size_t size() { return mSize; } 632e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int state() { return mState; } 642e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent uint8_t* data() { return static_cast<uint8_t*>(mData->pointer()); } 652e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent status_t doLoad(); 662e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void startLoad() { mState = LOADING; } 672e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp<IMemory> getIMemory() { return mData; } 682e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 692e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // hack 7085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten void init(int numChannels, int sampleRate, audio_format_t format, size_t size, 7185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IMemory> data ) { 7285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten mNumChannels = numChannels; mSampleRate = sampleRate; mFormat = format; mSize = size; 7385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten mData = data; } 742e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 752e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentprivate: 762e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void init(); 772e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 782e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent size_t mSize; 792e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent volatile int32_t mRefCount; 802e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent uint16_t mSampleID; 812e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent uint16_t mSampleRate; 822e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent uint8_t mState : 3; 832e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent uint8_t mNumChannels : 2; 842e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent audio_format_t mFormat; 852e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mFd; 862e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int64_t mOffset; 872e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int64_t mLength; 882e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent char* mUrl; 892e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp<IMemory> mData; 903d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<MemoryHeapBase> mHeap; 912e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent}; 922e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 932e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// stores pending events for stolen channels 942e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundEvent 952e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent{ 962e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic: 972e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundEvent() : mChannelID(0), mLeftVolume(0), mRightVolume(0), 982e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mPriority(IDLE_PRIORITY), mLoop(0), mRate(0) {} 992e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void set(const sp<Sample>& sample, int channelID, float leftVolume, 1002e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float rightVolume, int priority, int loop, float rate); 1012e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp<Sample> sample() { return mSample; } 1022e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int channelID() { return mChannelID; } 1032e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float leftVolume() { return mLeftVolume; } 1042e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float rightVolume() { return mRightVolume; } 1052e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int priority() { return mPriority; } 1062e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int loop() { return mLoop; } 1072e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float rate() { return mRate; } 1082e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void clear() { mChannelID = 0; mSample.clear(); } 1092e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1102e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentprotected: 1112e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp<Sample> mSample; 1122e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mChannelID; 1132e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float mLeftVolume; 1142e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float mRightVolume; 1152e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mPriority; 1162e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mLoop; 1172e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent float mRate; 1182e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent}; 1192e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1202e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// for channels aka AudioTracks 1212e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundChannel : public SoundEvent { 1222e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic: 1232e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent enum state { IDLE, RESUMING, STOPPING, PAUSED, PLAYING }; 1242799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten SoundChannel() : mState(IDLE), mNumChannels(1), 1252e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mPos(0), mToggle(0), mAutoPaused(false) {} 1262e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ~SoundChannel(); 1272e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void init(SoundPool* soundPool); 1282e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void play(const sp<Sample>& sample, int channelID, float leftVolume, float rightVolume, 1292e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int priority, int loop, float rate); 1302e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setVolume_l(float leftVolume, float rightVolume); 1312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setVolume(float leftVolume, float rightVolume); 1322e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void stop_l(); 1332e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void stop(); 1342e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void pause(); 1352e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void autoPause(); 1362e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void resume(); 1372e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void autoResume(); 1382e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setRate(float rate); 1392e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int state() { return mState; } 1402e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setPriority(int priority) { mPriority = priority; } 1412e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setLoop(int loop); 1422e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int numChannels() { return mNumChannels; } 1432e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void clearNextEvent() { mNextEvent.clear(); } 1442e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void nextEvent(); 1452e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int nextChannelID() { return mNextEvent.channelID(); } 1462e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void dump(); 1472e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1482e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentprivate: 1492e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent static void callback(int event, void* user, void *info); 1502e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void process(int event, void *info, unsigned long toggle); 1512e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent bool doStop_l(); 1522e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1532e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPool* mSoundPool; 1542799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten sp<AudioTrack> mAudioTrack; 1552e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundEvent mNextEvent; 1562e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex mLock; 1572e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mState; 1582e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mNumChannels; 1592e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mPos; 1602e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mAudioBufferSize; 1612e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent unsigned long mToggle; 1622e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent bool mAutoPaused; 1632e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent}; 1642e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1652e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent// application object for managing a pool of sounds 1662e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPool { 1672e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent friend class SoundPoolThread; 1682e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent friend class SoundChannel; 1692e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic: 170df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi SoundPool(int maxChannels, const audio_attributes_t* pAttributes); 1712e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ~SoundPool(); 1722e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int load(const char* url, int priority); 1732e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int load(int fd, int64_t offset, int64_t length, int priority); 1742e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent bool unload(int sampleID); 1752e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int play(int sampleID, float leftVolume, float rightVolume, int priority, 1762e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int loop, float rate); 1772e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void pause(int channelID); 1782e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void autoPause(); 1792e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void resume(int channelID); 1802e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void autoResume(); 1812e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void stop(int channelID); 1822e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setVolume(int channelID, float leftVolume, float rightVolume); 1832e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setPriority(int channelID, int priority); 1842e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setLoop(int channelID, int loop); 1852e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setRate(int channelID, float rate); 186df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi const audio_attributes_t* attributes() { return &mAttributes; } 1872e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1882e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // called from SoundPoolThread 1892e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void sampleLoaded(int sampleID); 1902e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1912e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // called from AudioTrack thread 1922e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void done_l(SoundChannel* channel); 1932e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1942e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // callback function 1952e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void setCallback(SoundPoolCallback* callback, void* user); 1962e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void* getUserData() { return mUserData; } 1972e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1982e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentprivate: 1992e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPool() {} // no default constructor 2002e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent bool startThreads(); 2012e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void doLoad(sp<Sample>& sample); 2022e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); } 2032e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundChannel* findChannel (int channelID); 2042e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundChannel* findNextChannel (int channelID); 2052e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundChannel* allocateChannel_l(int priority); 2062e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void moveToFront_l(SoundChannel* channel); 2072e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void notify(SoundPoolEvent event); 2082e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void dump(); 2092e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 2102e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // restart thread 2112e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void addToRestartList(SoundChannel* channel); 2122e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void addToStopList(SoundChannel* channel); 2132e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent static int beginThread(void* arg); 2142e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int run(); 2152e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void quit(); 2162e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 2172e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex mLock; 2182e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex mRestartLock; 2192e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Condition mCondition; 2202e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolThread* mDecodeThread; 2212e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundChannel* mChannelPool; 2222e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent List<SoundChannel*> mChannels; 2232e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent List<SoundChannel*> mRestart; 2242e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent List<SoundChannel*> mStop; 2252e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent DefaultKeyedVector< int, sp<Sample> > mSamples; 2262e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mMaxChannels; 227df813a3ba59109ca519ce0cb00a1a9144074f40eJean-Michel Trivi audio_attributes_t mAttributes; 2282e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mAllocated; 2292e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mNextSampleID; 2302e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent int mNextChannelID; 2312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent bool mQuit; 2322e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 2332e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // callback 2342e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex mCallbackLock; 2352e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolCallback* mCallback; 2362e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent void* mUserData; 2372e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent}; 2382e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 2392e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} // end namespace android 2402e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 2412e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#endif /*SOUNDPOOL_H_*/ 242