Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68eff053 authored by Eric Laurent's avatar Eric Laurent
Browse files

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
parent 433ccf7d
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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:
            // 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:
+4 −0
Original line number Diff line number Diff line
@@ -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 */