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