示例#1
0
status_t MidiFile::start()
{
    ALOGV("MidiFile::start");
    Mutex::Autolock lock(mMutex);
    if (!mEasHandle) {
        return ERROR_NOT_OPEN;
    }

    // resuming after pause?
    if (mPaused) {
        if (EAS_Resume(mEasData, mEasHandle) != EAS_SUCCESS) {
            return ERROR_EAS_FAILURE;
        }
        mPaused = false;
        updateState();
    }

    mRender = true;
	mState = EAS_STATE_PLAY;

    // wake up render thread
    ALOGV("  wakeup render thread");
    mCondition.signal();
    return NO_ERROR;
}
status_t MidiFile::start()
{
    ALOGV("MidiFile::start");
    Mutex::Autolock lock(mMutex);
    if (!mEasHandle) {
        return ERROR_NOT_OPEN;
    }

    if (mState == EAS_STATE_STOPPED) {
        int mStartTime = (mPlayTime >= mDuration) ? 0 : mPlayTime;
        if (EAS_Locate(mEasData, mEasHandle, mStartTime, false)
                != EAS_SUCCESS) {
            ALOGE("EAS_Locate failed");
            return ERROR_EAS_FAILURE;
        }
        EAS_GetLocation(mEasData, mEasHandle, &mPlayTime);
    }

    // resuming after pause?
    if (mPaused) {
        if (EAS_Resume(mEasData, mEasHandle) != EAS_SUCCESS) {
            return ERROR_EAS_FAILURE;
        }
        mPaused = false;
        updateState();
    }

    mRender = true;
    // Due to the limitation of EAS_XXX interfaces design, there's no way
    // to restart midi playback again once last track reaches EOS.
    // Here introduces a hack to enforce start again
    mState = EAS_STATE_PLAY;
    if (mState == EAS_STATE_PLAY) {
        sendEvent(MEDIA_STARTED);
    }

    // wake up render thread
    ALOGV("  wakeup render thread");
    mCondition.signal();
    return NO_ERROR;
}