19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "SoundPoolThread"
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h"
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SoundPoolThread.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksvoid SoundPoolThread::write(SoundPoolMsg msg) {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock lock(&mLock);
27f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    while (mMsgQueue.size() >= maxMessages) {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCondition.wait(mLock);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks
31f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    // if thread is quitting, don't add to queue
32f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    if (mRunning) {
33f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mMsgQueue.push(msg);
34f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mCondition.signal();
35f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksconst SoundPoolMsg SoundPoolThread::read() {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock lock(&mLock);
40f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    while (mMsgQueue.size() == 0) {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCondition.wait(mLock);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    SoundPoolMsg msg = mMsgQueue[0];
44f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    mMsgQueue.removeAt(0);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mCondition.signal();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return msg;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksvoid SoundPoolThread::quit() {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock lock(&mLock);
51f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    if (mRunning) {
52f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mRunning = false;
53f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mMsgQueue.clear();
54f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mMsgQueue.push(SoundPoolMsg(SoundPoolMsg::KILL, 0));
55f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mCondition.signal();
56f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mCondition.wait(mLock);
57f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("return from quit");
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSoundPoolThread::SoundPoolThread(SoundPool* soundPool) :
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mSoundPool(soundPool)
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
64f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    mMsgQueue.setCapacity(maxMessages);
6509468dbbe9d91214a171a2b2f43bd37795f0b8c1Steve Howard    if (createThreadEtc(beginThread, this, "SoundPoolThread")) {
66f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        mRunning = true;
67f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSoundPoolThread::~SoundPoolThread()
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
72f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    quit();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint SoundPoolThread::beginThread(void* arg) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("beginThread");
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SoundPoolThread* soundPoolThread = (SoundPoolThread*)arg;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return soundPoolThread->run();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint SoundPoolThread::run() {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("run");
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (;;) {
84f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        SoundPoolMsg msg = read();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGV("Got message m=%d, mData=%d", msg.mMessageType, msg.mData);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.mMessageType) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SoundPoolMsg::KILL:
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGV("goodbye");
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SoundPoolMsg::LOAD_SAMPLE:
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            doLoadSample(msg.mData);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGW("run: Unrecognized message %d\n",
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    msg.mMessageType);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SoundPoolThread::loadSample(int sampleID) {
102f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    write(SoundPoolMsg(SoundPoolMsg::LOAD_SAMPLE, sampleID));
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid SoundPoolThread::doLoadSample(int sampleID) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <Sample> sample = mSoundPool->findSample(sampleID);
107f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    status_t status = -1;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sample != 0) {
109f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks        status = sample->doLoad();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
111f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks    mSoundPool->notify(SoundPoolEvent(SoundPoolEvent::SAMPLE_LOADED, sampleID, status));
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // end namespace android
115