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