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

Commit b10ae038 authored by Haynes Mathew George's avatar Haynes Mathew George Committed by Linux Build Service Account
Browse files

audiopolicy: Handle startOutput on output command thread

Handle startOutput on AudioPolicyService output command thread
to serialize with concurrent releaseOutput/stopOutput calls.

CRs-Fixed: 944129
Change-Id: Ie333c736750c7dfb31d3036d79dfff13cd0486fc
parent 430f4d5f
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -185,6 +185,20 @@ status_t AudioPolicyService::startOutput(audio_io_handle_t output,
        return NO_INIT;
    }
    ALOGV("startOutput()");
    return mOutputCommandThread->startOutputCommand(output, stream, session);
}

status_t AudioPolicyService::doStartOutput(audio_io_handle_t output,
                                           audio_stream_type_t stream,
                                           audio_session_t session)
{
    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
        return BAD_VALUE;
    }
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    ALOGV("doStartOutput()");
    sp<AudioPolicyEffects>audioPolicyEffects;
    {
        Mutex::Autolock _l(mLock);
+29 −0
Original line number Diff line number Diff line
@@ -511,6 +511,19 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
                            data->mVolume);
                    command->mStatus = AudioSystem::setVoiceVolume(data->mVolume);
                    }break;
                case START_OUTPUT: {
                    StartOutputData *data = (StartOutputData *)command->mParam.get();
                    ALOGV("AudioCommandThread() processing start output %d",
                            data->mIO);
                    svc = mService.promote();
                    if (svc == 0) {
                        command->mStatus = UNKNOWN_ERROR;
                        break;
                    }
                    mLock.unlock();
                    command->mStatus = svc->doStartOutput(data->mIO, data->mStream, data->mSession);
                    mLock.lock();
                    }break;
                case STOP_OUTPUT: {
                    StopOutputData *data = (StopOutputData *)command->mParam.get();
                    ALOGV("AudioCommandThread() processing stop output %d",
@@ -764,6 +777,22 @@ status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume
    return sendCommand(command, delayMs);
}

status_t AudioPolicyService::AudioCommandThread::startOutputCommand(audio_io_handle_t output,
                                                                    audio_stream_type_t stream,
                                                                    audio_session_t session)
{
    sp<AudioCommand> command = new AudioCommand();
    command->mCommand = START_OUTPUT;
    sp<StartOutputData> data = new StartOutputData();
    data->mIO = output;
    data->mStream = stream;
    data->mSession = session;
    command->mParam = data;
    command->mWaitStatus = true;
    ALOGV("AudioCommandThread() adding start output %d", output);
    return sendCommand(command);
}

void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output,
                                                               audio_stream_type_t stream,
                                                               audio_session_t session)
+14 −0
Original line number Diff line number Diff line
@@ -206,6 +206,9 @@ public:
    virtual status_t setMasterMono(bool mono);
    virtual status_t getMasterMono(bool *mono);

            status_t doStartOutput(audio_io_handle_t output,
                                   audio_stream_type_t stream,
                                   audio_session_t session);
            status_t doStopOutput(audio_io_handle_t output,
                                  audio_stream_type_t stream,
                                  audio_session_t session);
@@ -259,6 +262,7 @@ private:
            SET_VOLUME,
            SET_PARAMETERS,
            SET_VOICE_VOLUME,
            START_OUTPUT,
            STOP_OUTPUT,
            RELEASE_OUTPUT,
            CREATE_AUDIO_PATCH,
@@ -288,6 +292,9 @@ private:
                    status_t    parametersCommand(audio_io_handle_t ioHandle,
                                            const char *keyValuePairs, int delayMs = 0);
                    status_t    voiceVolumeCommand(float volume, int delayMs = 0);
                    status_t    startOutputCommand(audio_io_handle_t output,
                                                   audio_stream_type_t stream,
                                                   audio_session_t session);
                    void        stopOutputCommand(audio_io_handle_t output,
                                                  audio_stream_type_t stream,
                                                  audio_session_t session);
@@ -366,6 +373,13 @@ private:
            float mVolume;
        };

        class StartOutputData : public AudioCommandData {
        public:
            audio_io_handle_t mIO;
            audio_stream_type_t mStream;
            audio_session_t mSession;
        };

        class StopOutputData : public AudioCommandData {
        public:
            audio_io_handle_t mIO;