diff --git a/include/media/ToneGenerator.h b/include/media/ToneGenerator.h index ea6bf5d0b45b1..e8df08ee76340 100644 --- a/include/media/ToneGenerator.h +++ b/include/media/ToneGenerator.h @@ -167,7 +167,8 @@ private: TONE_STARTING, // ToneGenerator is starting playing TONE_PLAYING, // ToneGenerator is playing TONE_STOPPING, // ToneGenerator is stoping - TONE_RESTARTING // + TONE_STOPPED, // ToneGenerator is stopped: the AudioTrack will be stopped + TONE_RESTARTING // A start request was received in active state (playing or stopping) }; diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 4008bfde39830..d36bec9ab91ee 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -1066,7 +1066,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) { if (event != AudioTrack::EVENT_MORE_DATA) return; - const AudioTrack::Buffer *buffer = static_cast(info); + AudioTrack::Buffer *buffer = static_cast(info); ToneGenerator *lpToneGen = static_cast(user); short *lpOut = buffer->i16; unsigned int lNumSmp = buffer->size/sizeof(short); @@ -1106,14 +1106,14 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) { lWaveCmd = WaveGenerator::WAVEGEN_STOP; lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below break; + case TONE_STOPPED: + LOGV("Stopped Cbk"); + goto audioCallback_EndLoop; default: LOGV("Extra Cbk"); - // Force loop exit - lNumSmp = 0; goto audioCallback_EndLoop; } - // Exit if tone sequence is over if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { @@ -1123,7 +1123,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) { if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { goto audioCallback_EndLoop; } - // fade out before stopping if maximum duraiton reached + // fade out before stopping if maximum duration reached lWaveCmd = WaveGenerator::WAVEGEN_STOP; lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below } @@ -1256,20 +1256,31 @@ audioCallback_EndLoop: lSignal = true; break; case TONE_STOPPING: - lpToneGen->mState = TONE_INIT; - LOGV("Cbk Stopping track\n"); - lSignal = true; - lpToneGen->mpAudioTrack->stop(); - + LOGV("Cbk Stopping\n"); + lpToneGen->mState = TONE_STOPPED; // Force loop exit lNumSmp = 0; break; + case TONE_STOPPED: + lpToneGen->mState = TONE_INIT; + LOGV("Cbk Stopped track\n"); + lpToneGen->mpAudioTrack->stop(); + // Force loop exit + lNumSmp = 0; + buffer->size = 0; + lSignal = true; + break; case TONE_STARTING: LOGV("Cbk starting track\n"); lpToneGen->mState = TONE_PLAYING; lSignal = true; break; + case TONE_PLAYING: + break; default: + // Force loop exit + lNumSmp = 0; + buffer->size = 0; break; }