189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1706aff807c612d1f3b38168d3abcc67bb19ec8d3dJean-Michel Trivi//#define LOG_NDEBUG 0 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "JetPlayer-C" 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/JetPlayer.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic const int MIX_NUM_BUFFERS = 4; 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatic const S_EAS_LIB_CONFIG* pLibConfig = NULL; 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 312e66a7896c9a9da3a15fc6cff9be28b4174d8719Eric LaurentJetPlayer::JetPlayer(void *javaJetPlayer, int maxTracks, int trackBufferSize) : 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback(NULL), 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJavaJetPlayerRef(javaJetPlayer), 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTid(-1), 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRender(false), 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPaused(false), 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMaxTracks(maxTracks), 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEasData(NULL), 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTrackBufferSize(trackBufferSize) 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer constructor"); 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.currentUserID = -1; 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.segmentRepeatCount = -1; 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.numQueuedSegments = -1; 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.paused = true; 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectJetPlayer::~JetPlayer() 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("~JetPlayer"); 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project release(); 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::init() 5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project //Mutex::Autolock lock(&mMutex); 6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_RESULT result; 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // retrieve the EAS library settings 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pLibConfig == NULL) 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pLibConfig = EAS_Config(); 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pLibConfig == NULL) { 6729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::init(): EAS library configuration could not be retrieved, aborting."); 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return EAS_FAILURE; 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init the EAS library 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result = EAS_Init(&mEasData); 73e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (result != EAS_SUCCESS) { 7429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::init(): Error initializing Sonivox EAS library, aborting."); 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_ERROR; 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return result; 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init the JET library with the default app event controller range 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result = JET_Init(mEasData, NULL, sizeof(S_JET_CONFIG)); 80e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (result != EAS_SUCCESS) { 8129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::init(): Error initializing JET library, aborting."); 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_ERROR; 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return result; 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create the output AudioTrack 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioTrack = new AudioTrack(); 883e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten status_t status = mAudioTrack->set(AUDIO_STREAM_MUSIC, //TODO parameterize this 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pLibConfig->sampleRate, 90e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten AUDIO_FORMAT_PCM_16_BIT, 91ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten audio_channel_out_mask_from_count(pLibConfig->numChannels), 92bce50bfc3846ab008bafa75c5d3f29fd7b5395f7Glenn Kasten (size_t) mTrackBufferSize, 930ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent AUDIO_OUTPUT_FLAG_NONE); 943e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten if (status != OK) { 953e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten ALOGE("JetPlayer::init(): Error initializing JET library; AudioTrack error %d", status); 963e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten mAudioTrack.clear(); 973e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten mState = EAS_STATE_ERROR; 983e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten return EAS_FAILURE; 993e98ecd18c906dc3ac2ff1a890f0b3163447272dGlenn Kasten } 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // create render and playback thread 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mMutex); 1043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::init(): trying to start render thread"); 105a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten mThread = new JetPlayerThread(this); 106a23856c0ad1f49a6ebcb71d3f63f329edc999a72Glenn Kasten mThread->run("jetRenderThread", ANDROID_PRIORITY_AUDIO); 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.wait(mMutex); 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mTid > 0) { 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // render thread started, we're ready 1113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::init(): render thread(%d) successfully started.", mTid); 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_READY; 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 11429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::init(): failed to start render thread."); 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_ERROR; 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return EAS_FAILURE; 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return EAS_SUCCESS; 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid JetPlayer::setEventCallback(jetevent_callback eventCallback) 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mMutex); 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback = eventCallback; 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::release() 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::release()"); 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPaused = true; 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRender = false; 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mEasData) { 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_Pause(mEasData); 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_CloseFile(mEasData); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_Shutdown(mEasData); 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_Shutdown(mEasData); 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14108b9e2d113213c37506a416bc95a36789bcab4caMarco Nelissen mIoWrapper.clear(); 1422799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten if (mAudioTrack != 0) { 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioTrack->stop(); 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioTrack->flush(); 1452799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten mAudioTrack.clear(); 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioBuffer) { 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mAudioBuffer; 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioBuffer = NULL; 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEasData = NULL; 152e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return EAS_SUCCESS; 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::render() { 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_RESULT result = EAS_FAILURE; 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_I32 count; 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int temp; 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool audioStarted = false; 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): entering"); 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // allocate render buffer 167e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten mAudioBuffer = 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * MIX_NUM_BUFFERS]; 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // signal main thread that we started 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock l(mMutex); 1730512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten mTid = gettid(); 1743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): render thread(%d) signal", mTid); 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.signal(); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 178e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten while (1) { 179e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMutex.lock(); // [[[[[[[[ LOCK --------------------------------------- 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1821179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project if (mEasData == NULL) { 1831179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project mMutex.unlock(); 1843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): NULL EAS data, exiting render."); 1851179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project goto threadExit; 1861179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project } 187e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // nothing to render, wait for client thread to wake us up 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (!mRender) 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 1913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): signal wait"); 192e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (audioStarted) { 193e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten mAudioTrack->pause(); 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // we have to restart the playback once we start rendering again 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audioStarted = false; 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.wait(mMutex); 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): signal rx'd"); 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 200e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // render midi data into the input buffer 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int num_output = 0; 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_PCM* p = mAudioBuffer; 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project for (int i = 0; i < MIX_NUM_BUFFERS; i++) { 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (result != EAS_SUCCESS) { 20729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::render(): EAS_Render returned error %ld", result); 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project p += count * pLibConfig->numChannels; 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM); 211e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 212e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten // send events that were generated (if any) to the event callback 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fireEventsFromJetQueue(); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // update playback state 2173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("JetPlayer::render(): updating state"); 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_Status(mEasData, &mJetStatus); 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fireUpdateOnStatusChange(); 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPaused = mJetStatus.paused; 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMutex.unlock(); // UNLOCK ]]]]]]]] ----------------------------------- 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // check audio output track 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAudioTrack == NULL) { 22629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::render(): output AudioTrack was not created"); 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto threadExit; 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Write data to the audio hardware 2313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("JetPlayer::render(): writing to audio output"); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if ((temp = mAudioTrack->write(mAudioBuffer, num_output)) < 0) { 23329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("JetPlayer::render(): Error in writing:%d",temp); 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return temp; 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // start audio output if necessary 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!audioStarted) { 2393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::render(): starting audio playback"); 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAudioTrack->start(); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audioStarted = true; 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project }//while (1) 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectthreadExit: 2479d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (mAudioTrack != NULL) { 2481179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project mAudioTrack->stop(); 2491179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project mAudioTrack->flush(); 2501179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project } 2519d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten delete [] mAudioBuffer; 2529d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten mAudioBuffer = NULL; 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMutex.lock(); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTid = -1; 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.signal(); 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMutex.unlock(); 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return result; 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// fire up an update if any of the status fields has changed 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// precondition: mMutex locked 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid JetPlayer::fireUpdateOnStatusChange() 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 266e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if ( (mJetStatus.currentUserID != mPreviousJetStatus.currentUserID) 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ||(mJetStatus.segmentRepeatCount != mPreviousJetStatus.segmentRepeatCount) ) { 268e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (mEventCallback) { 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback( 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JetPlayer::JET_USERID_UPDATE, 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJetStatus.currentUserID, 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJetStatus.segmentRepeatCount, 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJavaJetPlayerRef); 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.currentUserID = mJetStatus.currentUserID; 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.segmentRepeatCount = mJetStatus.segmentRepeatCount; 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 279e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (mJetStatus.numQueuedSegments != mPreviousJetStatus.numQueuedSegments) { 280e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (mEventCallback) { 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback( 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JetPlayer::JET_NUMQUEUEDSEGMENT_UPDATE, 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJetStatus.numQueuedSegments, 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project -1, 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJavaJetPlayerRef); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.numQueuedSegments = mJetStatus.numQueuedSegments; 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 290e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (mJetStatus.paused != mPreviousJetStatus.paused) { 291e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (mEventCallback) { 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback(JetPlayer::JET_PAUSE_UPDATE, 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJetStatus.paused, 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project -1, 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJavaJetPlayerRef); 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPreviousJetStatus.paused = mJetStatus.paused; 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// fire up all the JET events in the JET engine queue (until the queue is empty) 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// precondition: mMutex locked 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid JetPlayer::fireEventsFromJetQueue() 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 308e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (!mEventCallback) { 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // no callback, just empty the event queue 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (JET_GetEvent(mEasData, NULL, NULL)) { } 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_U32 rawEvent; 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (JET_GetEvent(mEasData, &rawEvent, NULL)) { 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mEventCallback( 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JetPlayer::JET_EVENT, 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project rawEvent, 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project -1, 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJavaJetPlayerRef); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::loadFromFile(const char* path) 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::loadFromFile(): path=%s", path); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33208b9e2d113213c37506a416bc95a36789bcab4caMarco Nelissen mIoWrapper = new MidiIoWrapper(path); 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33408b9e2d113213c37506a416bc95a36789bcab4caMarco Nelissen EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator()); 335e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (result != EAS_SUCCESS) 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_ERROR; 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project else 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_OPEN; 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return( result ); 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::loadFromFD(const int fd, const long long offset, const long long length) 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::loadFromFD(): fd=%d offset=%lld length=%lld", fd, offset, length); 347e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 35008b9e2d113213c37506a416bc95a36789bcab4caMarco Nelissen mIoWrapper = new MidiIoWrapper(fd, offset, length); 351e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 35208b9e2d113213c37506a416bc95a36789bcab4caMarco Nelissen EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator()); 353e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (result != EAS_SUCCESS) 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_ERROR; 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project else 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = EAS_STATE_OPEN; 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return( result ); 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::closeFile() 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return JET_CloseFile(mEasData); 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::play() 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::play(): entering"); 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_RESULT result = JET_Play(mEasData); 37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPaused = false; 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRender = true; 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_Status(mEasData, &mJetStatus); 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project this->dumpJetStatus(&mJetStatus); 382e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fireUpdateOnStatusChange(); 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // wake up render thread 3863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::play(): wakeup render thread"); 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCondition.signal(); 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return result; 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::pause() 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPaused = true; 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_RESULT result = JET_Pause(mEasData); 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRender = false; 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JET_Status(mEasData, &mJetStatus); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project this->dumpJetStatus(&mJetStatus); 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project fireUpdateOnStatusChange(); 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return result; 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::queueSegment(int segmentNum, int libNum, int repeatCount, int transpose, 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EAS_U32 muteFlags, EAS_U8 userID) 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::queueSegment segmentNum=%d, libNum=%d, repeatCount=%d, transpose=%d", 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project segmentNum, libNum, repeatCount, transpose); 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 417b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten return JET_QueueSegment(mEasData, segmentNum, libNum, repeatCount, transpose, muteFlags, 418b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten userID); 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::setMuteFlags(EAS_U32 muteFlags, bool sync) 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return JET_SetMuteFlags(mEasData, muteFlags, sync); 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::setMuteFlag(int trackNum, bool muteFlag, bool sync) 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return JET_SetMuteFlag(mEasData, trackNum, muteFlag, sync); 43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::triggerClip(int clipId) 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::triggerClip clipId=%d", clipId); 43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return JET_TriggerClip(mEasData, clipId); 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectint JetPlayer::clearQueue() 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("JetPlayer::clearQueue"); 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mMutex); 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return JET_Clear_Queue(mEasData); 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//------------------------------------------------------------------------------------------------- 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid JetPlayer::dump() 45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus) 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 458e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (pJetStatus!=NULL) 459b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten ALOGV(">> current JET player status: userID=%d segmentRepeatCount=%d numQueuedSegments=%d " 460b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten "paused=%d", 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pJetStatus->currentUserID, pJetStatus->segmentRepeatCount, 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pJetStatus->numQueuedSegments, pJetStatus->paused); 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project else 46429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE(">> JET player status is NULL"); 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android 469