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 SOUNDPOOLTHREAD_H_
182e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#define SOUNDPOOLTHREAD_H_
192e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
202e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/threads.h>
212e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <utils/Vector.h>
222e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include <media/AudioTrack.h>
232e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
24559bf2836f5da25b75bfb229fec0d20d540ee426James Dong#include <media/SoundPool.h>
252e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
262e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentnamespace android {
272e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
282e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPoolMsg {
292e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic:
302e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    enum MessageType { INVALID, KILL, LOAD_SAMPLE };
312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    SoundPoolMsg() : mMessageType(INVALID), mData(0) {}
322e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    SoundPoolMsg(MessageType MessageType, int data) :
332e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent        mMessageType(MessageType), mData(data) {}
342e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    uint16_t         mMessageType;
352e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    uint16_t         mData;
362e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent};
372e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
382e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent/*
392e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent * This class handles background requests from the SoundPool
402e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent */
412e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentclass SoundPoolThread {
422e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentpublic:
432e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    SoundPoolThread(SoundPool* SoundPool);
442e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    ~SoundPoolThread();
452e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    void loadSample(int sampleID);
462e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    void quit();
472e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    void write(SoundPoolMsg msg);
482e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
492e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentprivate:
502e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    static const size_t maxMessages = 5;
512e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
522e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    static int beginThread(void* arg);
532e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    int run();
542e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    void doLoadSample(int sampleID);
552e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    const SoundPoolMsg read();
562e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
572e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    Mutex                   mLock;
582e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    Condition               mCondition;
592e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    Vector<SoundPoolMsg>    mMsgQueue;
602e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    SoundPool*              mSoundPool;
612e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent    bool                    mRunning;
622e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent};
632e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
642e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} // end namespace android
652e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent
662e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#endif /*SOUNDPOOLTHREAD_H_*/
67