diff options
-rw-r--r-- | include/media/ToneGenerator.h | 3 | ||||
-rw-r--r-- | media/libmedia/ToneGenerator.cpp | 27 |
2 files changed, 21 insertions, 9 deletions
diff --git a/include/media/ToneGenerator.h b/include/media/ToneGenerator.h index ea6bf5d..e8df08e 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 4008bfd..d36bec9 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<const AudioTrack::Buffer *>(info); + AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(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: + LOGV("Cbk Stopping\n"); + lpToneGen->mState = TONE_STOPPED; + // Force loop exit + lNumSmp = 0; + break; + case TONE_STOPPED: lpToneGen->mState = TONE_INIT; - LOGV("Cbk Stopping track\n"); - lSignal = true; + 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; } |