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 SOUNDPOOLTHREAD_H_
18372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#define SOUNDPOOLTHREAD_H_
19372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
20372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/threads.h>
21372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <utils/Vector.h>
22372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include <media/AudioTrack.h>
23372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
24372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#include "SoundPool.h"
25372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
26372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissennamespace android {
27372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
28372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPoolMsg {
29372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
30372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    enum MessageType { INVALID, KILL, LOAD_SAMPLE };
31372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPoolMsg() : mMessageType(INVALID), mData(0) {}
32372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPoolMsg(MessageType MessageType, int data) :
33372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen        mMessageType(MessageType), mData(data) {}
34372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    uint16_t         mMessageType;
35372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    uint16_t         mData;
36372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
37372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
38372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen/*
39372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen * This class handles background requests from the SoundPool
40372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen */
41372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenclass SoundPoolThread {
42372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenpublic:
43ae1aadc04f9cee280c3c328a533e2ceeb4b71d47Chih-Hung Hsieh    explicit SoundPoolThread(SoundPool* SoundPool);
44372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    ~SoundPoolThread();
45372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void loadSample(int sampleID);
46372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void quit();
47372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void write(SoundPoolMsg msg);
48372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
49372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissenprivate:
501f1f4bf91dd66fba527bf4d8765e484e08ddb971Philip Cuadra    static const size_t maxMessages = 128;
51372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
52372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    static int beginThread(void* arg);
53372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    int run();
54372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    void doLoadSample(int sampleID);
55372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    const SoundPoolMsg read();
56372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
57372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Mutex                   mLock;
58372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Condition               mCondition;
59372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    Vector<SoundPoolMsg>    mMsgQueue;
60372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    SoundPool*              mSoundPool;
61372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen    bool                    mRunning;
62372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen};
63372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
64372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen} // end namespace android
65372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen
66372be8970c6ab68c295fb74dbb878ab1d443d90eMarco Nelissen#endif /*SOUNDPOOLTHREAD_H_*/
67