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

Commit e358ec63 authored by Phil Burk's avatar Phil Burk
Browse files

aaudio: use strong pointer to protect callback

Hold a strong pointer to the AudioStream so it cannot get deleted while
the MMAP callback is running.

Also fixes disconnect for shared streams, which was broken
by a previous attempt to fix b/166877425

Bug: 166877425
Bug: 170551030
Test: see bug for details
Test: atest AAudioTestCases
Test: OboeTester V1.5.30 or later, "TEST DISCONNECT"
Change-Id: I236e2d68632070d253d14ddf7b9d7076e068830a
parent 7aed66e7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -407,7 +407,9 @@ void* AudioStream::wrapUserThread() {
// It converts the 'C' function call to a C++ method call.
static void* AudioStream_internalThreadProc(void* threadArg) {
    AudioStream *audioStream = (AudioStream *) threadArg;
    return audioStream->wrapUserThread();
    // Use an sp<> to prevent the stream from being deleted while running.
    android::sp<AudioStream> protectedStream(audioStream);
    return protectedStream->wrapUserThread();
}

// This is not exposed in the API.
+3 −1
Original line number Diff line number Diff line
@@ -65,7 +65,9 @@ void *AAudioServiceEndpointCapture::callbackLoop() {
        result = getStreamInternal()->read(mDistributionBuffer.get(),
                getFramesPerBurst(), timeoutNanos);
        if (result == AAUDIO_ERROR_DISCONNECTED) {
            ALOGV("%s() read() returned AAUDIO_ERROR_DISCONNECTED, break", __func__);
            ALOGD("%s() read() returned AAUDIO_ERROR_DISCONNECTED", __func__);
            // We do not need the returned vector.
            (void) AAudioServiceEndpointShared::disconnectRegisteredStreams();
            break;
        } else if (result != getFramesPerBurst()) {
            ALOGW("callbackLoop() read %d / %d",
+3 −1
Original line number Diff line number Diff line
@@ -145,7 +145,9 @@ void *AAudioServiceEndpointPlay::callbackLoop() {
        result = getStreamInternal()->write(mMixer.getOutputBuffer(),
                                            getFramesPerBurst(), timeoutNanos);
        if (result == AAUDIO_ERROR_DISCONNECTED) {
            ALOGV("%s() write() returned AAUDIO_ERROR_DISCONNECTED, break", __func__);
            ALOGD("%s() write() returned AAUDIO_ERROR_DISCONNECTED", __func__);
            // We do not need the returned vector.
            (void) AAudioServiceEndpointShared::disconnectRegisteredStreams();
            break;
        } else if (result != getFramesPerBurst()) {
            ALOGW("callbackLoop() wrote %d / %d",