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; }