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//#define LOG_NDEBUG 0 182e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#define LOG_TAG "SoundPoolThread" 192e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include "utils/Log.h" 202e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 212e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent#include "SoundPoolThread.h" 222e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 232e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentnamespace android { 242e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 252e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentvoid SoundPoolThread::write(SoundPoolMsg msg) { 262e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex::Autolock lock(&mLock); 272e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent while (mMsgQueue.size() >= maxMessages) { 282e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.wait(mLock); 292e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 302e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent // if thread is quitting, don't add to queue 322e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent if (mRunning) { 332e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsgQueue.push(msg); 342e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.signal(); 352e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 362e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 372e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 382e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentconst SoundPoolMsg SoundPoolThread::read() { 392e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex::Autolock lock(&mLock); 402e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent while (mMsgQueue.size() == 0) { 412e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.wait(mLock); 422e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 432e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolMsg msg = mMsgQueue[0]; 442e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsgQueue.removeAt(0); 452e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.signal(); 462e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent return msg; 472e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 482e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 492e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentvoid SoundPoolThread::quit() { 502e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent Mutex::Autolock lock(&mLock); 512e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent if (mRunning) { 522e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mRunning = false; 532e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsgQueue.clear(); 542e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsgQueue.push(SoundPoolMsg(SoundPoolMsg::KILL, 0)); 552e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.signal(); 562e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mCondition.wait(mLock); 572e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 582e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGV("return from quit"); 592e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 602e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 612e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric LaurentSoundPoolThread::SoundPoolThread(SoundPool* soundPool) : 622e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mSoundPool(soundPool) 632e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent{ 642e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mMsgQueue.setCapacity(maxMessages); 652e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent if (createThreadEtc(beginThread, this, "SoundPoolThread")) { 662e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mRunning = true; 672e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 682e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 692e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 702e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric LaurentSoundPoolThread::~SoundPoolThread() 712e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent{ 722e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent quit(); 732e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 742e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 752e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentint SoundPoolThread::beginThread(void* arg) { 762e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGV("beginThread"); 772e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolThread* soundPoolThread = (SoundPoolThread*)arg; 782e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent return soundPoolThread->run(); 792e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 802e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 812e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentint SoundPoolThread::run() { 822e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGV("run"); 832e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent for (;;) { 842e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent SoundPoolMsg msg = read(); 852e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGV("Got message m=%d, mData=%d", msg.mMessageType, msg.mData); 862e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent switch (msg.mMessageType) { 872e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent case SoundPoolMsg::KILL: 882e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGV("goodbye"); 892e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent return NO_ERROR; 902e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent case SoundPoolMsg::LOAD_SAMPLE: 912e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent doLoadSample(msg.mData); 922e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent break; 932e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent default: 942e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent ALOGW("run: Unrecognized message %d\n", 952e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent msg.mMessageType); 962e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent break; 972e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 982e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 992e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 1002e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1012e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentvoid SoundPoolThread::loadSample(int sampleID) { 1022e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent write(SoundPoolMsg(SoundPoolMsg::LOAD_SAMPLE, sampleID)); 1032e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 1042e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1052e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurentvoid SoundPoolThread::doLoadSample(int sampleID) { 1062e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent sp <Sample> sample = mSoundPool->findSample(sampleID); 1072e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent status_t status = -1; 1082e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent if (sample != 0) { 1092e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent status = sample->doLoad(); 1102e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent } 1112e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent mSoundPool->notify(SoundPoolEvent(SoundPoolEvent::SAMPLE_LOADED, sampleID, status)); 1122e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} 1132e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent 1142e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric Laurent} // end namespace android 115