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

Commit 5cc83c3b authored by Phil Burk's avatar Phil Burk
Browse files

aaudio: fix some state transitions

Now requestStop() and requestPause() do the appropriate thing
based on state.
Flush is allowed when OPEN, PAUSED or STOPPED because there might
be pre-roll data.

Bug: 69810494
Test: test_various.cpp
Change-Id: Ie1b306b17734a58fa71b1742bb186482893656b7
parent bb8ad0e6
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ typedef enum aaudio_service_event_e : uint32_t {
    AAUDIO_SERVICE_EVENT_PAUSED,
    AAUDIO_SERVICE_EVENT_STOPPED,
    AAUDIO_SERVICE_EVENT_FLUSHED,
    AAUDIO_SERVICE_EVENT_CLOSED,
    AAUDIO_SERVICE_EVENT_DISCONNECTED,
    AAUDIO_SERVICE_EVENT_VOLUME,
    AAUDIO_SERVICE_EVENT_XRUN
+6 −15
Original line number Diff line number Diff line
@@ -340,8 +340,13 @@ aaudio_result_t AudioStreamInternal::stopCallback()
    }
}

aaudio_result_t AudioStreamInternal::requestStopInternal()
aaudio_result_t AudioStreamInternal::requestStop()
{
    aaudio_result_t result = stopCallback();
    if (result != AAUDIO_OK) {
        return result;
    }

    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
        ALOGE("requestStopInternal() mServiceStreamHandle invalid = 0x%08X",
              mServiceStreamHandle);
@@ -355,16 +360,6 @@ aaudio_result_t AudioStreamInternal::requestStopInternal()
    return mServiceInterface.stopStream(mServiceStreamHandle);
}

aaudio_result_t AudioStreamInternal::requestStop()
{
    aaudio_result_t result = stopCallback();
    if (result != AAUDIO_OK) {
        return result;
    }
    result = requestStopInternal();
    return result;
}

aaudio_result_t AudioStreamInternal::registerThread() {
    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
        ALOGE("registerThread() mServiceStreamHandle invalid");
@@ -483,10 +478,6 @@ aaudio_result_t AudioStreamInternal::onEventFromServer(AAudioServiceMessage *mes
                onFlushFromServer();
            }
            break;
        case AAUDIO_SERVICE_EVENT_CLOSED:
            ALOGD("%s - got AAUDIO_SERVICE_EVENT_CLOSED", __func__);
            setState(AAUDIO_STREAM_STATE_CLOSED);
            break;
        case AAUDIO_SERVICE_EVENT_DISCONNECTED:
            // Prevent hardware from looping on old data and making buzzing sounds.
            if (getDirection() == AAUDIO_DIRECTION_OUTPUT) {
+0 −2
Original line number Diff line number Diff line
@@ -121,8 +121,6 @@ protected:

    aaudio_result_t processCommands();

    aaudio_result_t requestStopInternal();

    aaudio_result_t stopCallback();

    virtual void advanceClientToMatchServerPosition() = 0;
+5 −12
Original line number Diff line number Diff line
@@ -38,9 +38,12 @@ AudioStreamInternalPlay::AudioStreamInternalPlay(AAudioServiceInterface &servic

AudioStreamInternalPlay::~AudioStreamInternalPlay() {}


aaudio_result_t AudioStreamInternalPlay::requestPauseInternal()
aaudio_result_t AudioStreamInternalPlay::requestPause()
{
    aaudio_result_t result = stopCallback();
    if (result != AAUDIO_OK) {
        return result;
    }
    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
        ALOGE("AudioStreamInternal::requestPauseInternal() mServiceStreamHandle invalid = 0x%08X",
              mServiceStreamHandle);
@@ -53,16 +56,6 @@ aaudio_result_t AudioStreamInternalPlay::requestPauseInternal()
    return mServiceInterface.pauseStream(mServiceStreamHandle);
}

aaudio_result_t AudioStreamInternalPlay::requestPause()
{
    aaudio_result_t result = stopCallback();
    if (result != AAUDIO_OK) {
        return result;
    }
    result = requestPauseInternal();
    return result;
}

aaudio_result_t AudioStreamInternalPlay::requestFlush() {
    if (mServiceStreamHandle == AAUDIO_HANDLE_INVALID) {
        ALOGE("AudioStreamInternal::requestFlush() mServiceStreamHandle invalid = 0x%08X",
+10 −2
Original line number Diff line number Diff line
@@ -37,6 +37,16 @@ public:

    aaudio_result_t requestFlush() override;

    bool isFlushSupported() const override {
        // Only implement FLUSH for OUTPUT streams.
        return true;
    }

    bool isPauseSupported() const override {
        // Only implement PAUSE for OUTPUT streams.
        return true;
    }

    aaudio_result_t write(const void *buffer,
                          int32_t numFrames,
                          int64_t timeoutNanoseconds) override;
@@ -52,8 +62,6 @@ public:

protected:

    aaudio_result_t requestPauseInternal();

    void advanceClientToMatchServerPosition() override;

    void onFlushFromServer() override;
Loading