diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp index d54d043d8e..6da63e83b9 100644 --- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp +++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp @@ -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: diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.h b/media/libaaudio/src/legacy/AudioStreamTrack.h index 550f6936a7..93a1ff4e68 100644 --- a/media/libaaudio/src/legacy/AudioStreamTrack.h +++ b/media/libaaudio/src/legacy/AudioStreamTrack.h @@ -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 */