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

Commit 89a64721 authored by jiabin's avatar jiabin
Browse files

Return DISCONNECTED state when calling from API.

The disconnected state is public API and some apps relying on the state
changed to stop and restart a new stream when disconnection happens. In
android U, the disconnected state is separated from stream state in
aaudio implementation. However, the public API should still be able to
return disconnected state so that apps replying on state changed will
not be broken.

Bug: 254928976
Test: repo steps in bug
Change-Id: Ic267933a01839a22f1b39d14291f9d85757c0e0f
parent 265a0690
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -432,7 +432,7 @@ AAUDIO_API int32_t AAudioStream_getSamplesPerFrame(AAudioStream* stream)
AAUDIO_API aaudio_stream_state_t AAudioStream_getState(AAudioStream* stream)
{
    AudioStream *audioStream = convertAAudioStreamToAudioStream(stream);
    return audioStream->getState();
    return audioStream->getStateExternal();
}

AAUDIO_API aaudio_format_t AAudioStream_getFormat(AAudioStream* stream)
+11 −2
Original line number Diff line number Diff line
@@ -411,6 +411,8 @@ void AudioStream::setDisconnected() {
        return; // no change, the stream is already disconnected
    }
    mDisconnected.store(true);
    // Wake up a wakeForStateChange thread if it exists.
    syscall(SYS_futex, &mState, FUTEX_WAKE_PRIVATE, INT_MAX, NULL, NULL, 0);
    // Track transition to DISCONNECTED state.
    android::mediametrics::LogItem(mMetricsId)
            .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_DISCONNECT)
@@ -428,7 +430,7 @@ aaudio_result_t AudioStream::waitForStateChange(aaudio_stream_state_t currentSta
    }

    int64_t durationNanos = 20 * AAUDIO_NANOS_PER_MILLISECOND; // arbitrary
    aaudio_stream_state_t state = getState();
    aaudio_stream_state_t state = getStateExternal();
    while (state == currentState && timeoutNanoseconds > 0) {
        if (durationNanos > timeoutNanoseconds) {
            durationNanos = timeoutNanoseconds;
@@ -447,7 +449,7 @@ aaudio_result_t AudioStream::waitForStateChange(aaudio_stream_state_t currentSta
            return result;
        }

        state = getState();
        state = getStateExternal();
    }
    if (nextState != nullptr) {
        *nextState = state;
@@ -638,6 +640,13 @@ void AudioStream::setDuckAndMuteVolume(float duckAndMuteVolume) {
    doSetVolume(); // apply this change
}

aaudio_stream_state_t AudioStream::getStateExternal() const {
    if (isDisconnected()) {
        return AAUDIO_STREAM_STATE_DISCONNECTED;
    }
    return getState();
}

void AudioStream::MyPlayerBase::registerWithAudioManager(const android::sp<AudioStream>& parent) {
    std::lock_guard<std::mutex> lock(mParentLock);
    mParent = parent;
+2 −0
Original line number Diff line number Diff line
@@ -194,6 +194,8 @@ public:
        return mState.load();
    }

    aaudio_stream_state_t getStateExternal() const;

    virtual int32_t getBufferSize() const {
        return AAUDIO_ERROR_UNIMPLEMENTED;
    }