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:
@@ -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)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user