am e9bd4788: Merge change 26881 into eclair

Merge commit 'e9bd4788d4370714374d833aed1339d17c5ded09' into eclair-plus-aosp

* commit 'e9bd4788d4370714374d833aed1339d17c5ded09':
  Fix issue 2142613: ToneGenerator: short tones sometimes don't play on sholes or over A2DP.
This commit is contained in:
Eric Laurent
2009-09-25 00:43:43 -07:00
committed by Android Git Automerger
2 changed files with 23 additions and 11 deletions

View File

@@ -167,7 +167,8 @@ private:
TONE_STARTING, // ToneGenerator is starting playing TONE_STARTING, // ToneGenerator is starting playing
TONE_PLAYING, // ToneGenerator is playing TONE_PLAYING, // ToneGenerator is playing
TONE_STOPPING, // ToneGenerator is stoping 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)
}; };

View File

@@ -1066,7 +1066,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {
if (event != AudioTrack::EVENT_MORE_DATA) return; 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); ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
short *lpOut = buffer->i16; short *lpOut = buffer->i16;
unsigned int lNumSmp = buffer->size/sizeof(short); unsigned int lNumSmp = buffer->size/sizeof(short);
@@ -1106,14 +1106,14 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {
lWaveCmd = WaveGenerator::WAVEGEN_STOP; lWaveCmd = WaveGenerator::WAVEGEN_STOP;
lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
break; break;
case TONE_STOPPED:
LOGV("Stopped Cbk");
goto audioCallback_EndLoop;
default: default:
LOGV("Extra Cbk"); LOGV("Extra Cbk");
// Force loop exit
lNumSmp = 0;
goto audioCallback_EndLoop; goto audioCallback_EndLoop;
} }
// Exit if tone sequence is over // Exit if tone sequence is over
if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 ||
lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) {
@@ -1123,7 +1123,7 @@ void ToneGenerator::audioCallback(int event, void* user, void *info) {
if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
goto audioCallback_EndLoop; goto audioCallback_EndLoop;
} }
// fade out before stopping if maximum duraiton reached // fade out before stopping if maximum duration reached
lWaveCmd = WaveGenerator::WAVEGEN_STOP; lWaveCmd = WaveGenerator::WAVEGEN_STOP;
lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
} }
@@ -1256,20 +1256,31 @@ audioCallback_EndLoop:
lSignal = true; lSignal = true;
break; break;
case TONE_STOPPING: case TONE_STOPPING:
lpToneGen->mState = TONE_INIT; LOGV("Cbk Stopping\n");
LOGV("Cbk Stopping track\n"); lpToneGen->mState = TONE_STOPPED;
lSignal = true;
lpToneGen->mpAudioTrack->stop();
// Force loop exit // Force loop exit
lNumSmp = 0; lNumSmp = 0;
break; 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: case TONE_STARTING:
LOGV("Cbk starting track\n"); LOGV("Cbk starting track\n");
lpToneGen->mState = TONE_PLAYING; lpToneGen->mState = TONE_PLAYING;
lSignal = true; lSignal = true;
break; break;
case TONE_PLAYING:
break;
default: default:
// Force loop exit
lNumSmp = 0;
buffer->size = 0;
break; break;
} }