AAudio AudioStreamLegacy: refine handling of AudioTrack teardown

Do not systematically request a stream disconnect upon
EVENT_NEW_IAUDIOTRACK received AudioTrack but only if the new
audio Track properties have changed in such a way that the initial
contract is broken.

Bug: 139763500
Test: OboeTester TEST DISCONNECT
Test: OboeTester TEST OUTPUT while enabling/disabling Live Caption
Change-Id: I3b43275a888e23471fcd1ce20725f5731a77a255
gugelfrei
Eric Laurent 4 years ago
parent 433ccf7dca
commit 68eff05308

@ -215,6 +215,9 @@ aaudio_result_t AudioStreamTrack::open(const AudioStreamBuilder& builder)
: (aaudio_session_id_t) mAudioTrack->getSessionId();
setSessionId(actualSessionId);
mInitialBufferCapacity = getBufferCapacity();
mInitialFramesPerBurst = getFramesPerBurst();
mAudioTrack->addAudioDeviceCallback(mDeviceCallback);
// Update performance mode based on the actual stream flags.
@ -265,7 +268,16 @@ void AudioStreamTrack::processCallback(int event, void *info) {
// Stream got rerouted so we disconnect.
case AudioTrack::EVENT_NEW_IAUDIOTRACK:
processCallbackCommon(AAUDIO_CALLBACK_OPERATION_DISCONNECTED, info);
// request stream disconnect if the restored AudioTrack has properties not matching
// what was requested initially
if (mAudioTrack->channelCount() != getSamplesPerFrame()
|| mAudioTrack->format() != getFormat()
|| mAudioTrack->getSampleRate() != getSampleRate()
|| mAudioTrack->getRoutedDeviceId() != getDeviceId()
|| getBufferCapacity() != mInitialBufferCapacity
|| getFramesPerBurst() != mInitialFramesPerBurst) {
processCallbackCommon(AAUDIO_CALLBACK_OPERATION_DISCONNECTED, info);
}
break;
default:

@ -104,6 +104,10 @@ private:
// TODO add 64-bit position reporting to AudioTrack and use it.
aaudio_wrapping_frames_t mPositionWhenPausing = 0;
// initial AudioTrack frame count and notification period
int32_t mInitialBufferCapacity = 0;
int32_t mInitialFramesPerBurst = 0;
};
} /* namespace aaudio */

Loading…
Cancel
Save