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

Commit 32ef0556 authored by Steve Kondik's avatar Steve Kondik
Browse files

audiopolicy: Clean up the mess

 * Since we're not using the policy directly to auto-attach,
   let's clean it up and remove the unused stuff.
 * Also fixes notifications for session release.

This reverts commit 47f8c730.

Change-Id: Ibe65f427773c6ef012dde4f289d10e4089c094ea
parent 489c9fb6
Loading
Loading
Loading
Loading
+2 −40
Original line number Original line Diff line number Diff line
@@ -275,10 +275,11 @@ status_t AudioPolicyEffects::addOutputSessionEffects(audio_io_handle_t output,


        procDesc->setProcessorEnabled(true);
        procDesc->setProcessorEnabled(true);
    }
    }

    return status;
    return status;
}
}


status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t output,
status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t /* output */,
                                           audio_stream_type_t stream,
                                           audio_stream_type_t stream,
                                           int session,
                                           int session,
                                           audio_output_flags_t flags,
                                           audio_output_flags_t flags,
@@ -289,12 +290,6 @@ status_t AudioPolicyEffects::doAddOutputSessionEffects(audio_io_handle_t output,
    }
    }
    ALOGV("doAddOutputSessionEffects()");
    ALOGV("doAddOutputSessionEffects()");


    // create audio processors according to stream
    status_t status = addOutputSessionEffects(output, stream, session);
    if (status <= 0 && (status != NO_ERROR && status != ALREADY_EXISTS)) {
        ALOGW("Failed to add effects on session %d", session);
    }

    // notify listeners
    // notify listeners
    mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)session,
    mAudioPolicyService->onOutputSessionEffectsUpdate(stream, (audio_session_t)session,
            flags, channelMask, uid, true);
            flags, channelMask, uid, true);
@@ -319,42 +314,9 @@ status_t AudioPolicyEffects::releaseOutputSessionEffects(audio_io_handle_t outpu
    }
    }


    EffectVector *procDesc = mOutputSessions.valueAt(index);
    EffectVector *procDesc = mOutputSessions.valueAt(index);

    // just in case it already has a death wish
    if (procDesc->mRefCount == 0) {
        return NO_ERROR;
    }

    procDesc->mRefCount--;
    procDesc->mRefCount--;
    ALOGV("releaseOutputSessionEffects(): session: %d, refCount: %d",
    ALOGV("releaseOutputSessionEffects(): session: %d, refCount: %d",
          audioSession, procDesc->mRefCount);
          audioSession, procDesc->mRefCount);

    if (procDesc->mRefCount == 0) {
        mAudioPolicyService->releaseOutputSessionEffectsDelayed(
                output, stream, audioSession, 10000);
    }

    return status;
}

status_t AudioPolicyEffects::doReleaseOutputSessionEffects(audio_io_handle_t output,
                         audio_stream_type_t stream,
                         int audioSession)
{
    status_t status = NO_ERROR;
    (void) output; // argument not used for now

    Mutex::Autolock _l(mLock);
    ssize_t index = mOutputSessions.indexOfKey(audioSession);
    if (index < 0) {
        ALOGV("doReleaseOutputSessionEffects: no output processing was attached to this stream");
        return NO_ERROR;
    }

    EffectVector *procDesc = mOutputSessions.valueAt(index);
    ALOGV("doReleaseOutputSessionEffects(): session: %d, refCount: %d",
          audioSession, procDesc->mRefCount);

    if (procDesc->mRefCount == 0) {
    if (procDesc->mRefCount == 0) {
        procDesc->setProcessorEnabled(false);
        procDesc->setProcessorEnabled(false);
        procDesc->mEffects.clear();
        procDesc->mEffects.clear();
+0 −5
Original line number Original line Diff line number Diff line
@@ -86,11 +86,6 @@ public:
                             audio_stream_type_t stream,
                             audio_stream_type_t stream,
                             int audioSession);
                             int audioSession);


    // For deferred release
    status_t doReleaseOutputSessionEffects(audio_io_handle_t output,
                                           audio_stream_type_t stream,
                                           int audioSession);

    status_t doAddOutputSessionEffects(audio_io_handle_t output,
    status_t doAddOutputSessionEffects(audio_io_handle_t output,
                             audio_stream_type_t stream,
                             audio_stream_type_t stream,
                             int audioSession,
                             int audioSession,
+13 −20
Original line number Original line Diff line number Diff line
@@ -182,30 +182,12 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
    }
    }


    if (audioPolicyEffects != 0) {
    if (audioPolicyEffects != 0) {
        addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid);
        audioPolicyEffects->doAddOutputSessionEffects(*output, *stream, session, flags, channelMask, uid);
    }
    }


	return status;
	return status;
}
}


status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output,
                                         audio_stream_type_t stream,
                                         audio_session_t session,
                                         audio_output_flags_t flags,
                                         audio_channel_mask_t channelMask,
                                         uid_t uid)
{
    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
        return BAD_VALUE;
    }
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    ALOGV("addOutputSessionEffects()");
    return mOutputCommandThread->addOutputSessionEffectsCommand(
            output, stream, session, flags, channelMask, uid);
}

status_t AudioPolicyService::startOutput(audio_io_handle_t output,
status_t AudioPolicyService::startOutput(audio_io_handle_t output,
                                         audio_stream_type_t stream,
                                         audio_stream_type_t stream,
                                         audio_session_t session)
                                         audio_session_t session)
@@ -231,8 +213,19 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output,
        return NO_INIT;
        return NO_INIT;
    }
    }
    ALOGV("doStartOutput()");
    ALOGV("doStartOutput()");
    sp<AudioPolicyEffects>audioPolicyEffects;
    {
        Mutex::Autolock _l(mLock);
        audioPolicyEffects = mAudioPolicyEffects;
    }
    if (audioPolicyEffects != 0) {
        // create audio processors according to stream
        status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
        if (status != NO_ERROR && status != ALREADY_EXISTS) {
            ALOGW("Failed to add effects on session %d", session);
        }
    }
    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);

    return mAudioPolicyManager->startOutput(output, stream, session);
    return mAudioPolicyManager->startOutput(output, stream, session);
}
}


+12 −26
Original line number Original line Diff line number Diff line
@@ -147,24 +147,6 @@ audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
                                    format, channelMask, flags, offloadInfo);
                                    format, channelMask, flags, offloadInfo);
}
}


status_t AudioPolicyService::addOutputSessionEffects(audio_io_handle_t output,
                                         audio_stream_type_t stream,
                                         audio_session_t session,
                                         audio_output_flags_t flags,
                                         audio_channel_mask_t channelMask,
                                         uid_t uid)
{
    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
        return BAD_VALUE;
    }
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    ALOGV("addOutputSessionEffects()");
    return mOutputCommandThread->addOutputSessionEffectsCommand(
            output, stream, session, flags, channelMask, uid);
}

status_t AudioPolicyService::startOutput(audio_io_handle_t output,
status_t AudioPolicyService::startOutput(audio_io_handle_t output,
                                         audio_stream_type_t stream,
                                         audio_stream_type_t stream,
                                         audio_session_t session)
                                         audio_session_t session)
@@ -190,6 +172,18 @@ status_t AudioPolicyService::doStartOutput(audio_io_handle_t output,
        return NO_INIT;
        return NO_INIT;
    }
    }
    ALOGV("doStartOutput()");
    ALOGV("doStartOutput()");
    sp<AudioPolicyEffects>audioPolicyEffects;
    {
        Mutex::Autolock _l(mLock);
        audioPolicyEffects = mAudioPolicyEffects;
    }
    if (audioPolicyEffects != 0) {
        // create audio processors according to stream
        status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
        if (status != NO_ERROR && status != ALREADY_EXISTS) {
            ALOGW("Failed to add effects on session %d", session);
        }
    }


    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);
    return mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session);
    return mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session);
@@ -615,14 +609,6 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
    if (*output == AUDIO_IO_HANDLE_NONE) {
    if (*output == AUDIO_IO_HANDLE_NONE) {
        return INVALID_OPERATION;
        return INVALID_OPERATION;
    }
    }

    Mutex::Autolock _l(mLock);
    sp<AudioPolicyEffects> audioPolicyEffects;
    audioPolicyEffects = mAudioPolicyEffects;
    if (audioPolicyEffects != 0) {
        addOutputSessionEffects(*output, *stream, session, flags, channelMask, uid);
    }

    return NO_ERROR;
    return NO_ERROR;
}
}


+0 −76
Original line number Original line Diff line number Diff line
@@ -366,13 +366,6 @@ void AudioPolicyService::binderDied(const wp<IBinder>& who) {
            IPCThreadState::self()->getCallingPid());
            IPCThreadState::self()->getCallingPid());
}
}


void AudioPolicyService::releaseOutputSessionEffectsDelayed(
        audio_io_handle_t output, audio_stream_type_t stream,
        audio_unique_id_t sessionId, int delayMs)
{
    mAudioCommandThread->releaseOutputSessionEffectsCommand(output, stream, sessionId, delayMs);
}

static bool tryLock(Mutex& mutex)
static bool tryLock(Mutex& mutex)
{
{
    bool locked = false;
    bool locked = false;
@@ -658,35 +651,6 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
                            data->mFlags, data->mChannelMask, data->mUid, data->mAdded);
                            data->mFlags, data->mChannelMask, data->mUid, data->mAdded);
                    mLock.lock();
                    mLock.lock();
                    } break;
                    } break;
                case RELEASE_OUTPUT_SESSION_EFFECTS: {
                    ReleaseOutputSessionEffectsData *data =
                            (ReleaseOutputSessionEffectsData *)command->mParam.get();
                    ALOGV("AudioCommandThread() processing release output session effects %d %d %d",
                            data->mOutput, data->mStream, data->mSessionId);
                    svc = mService.promote();
                    if (svc == 0) {
                        break;
                    }
                    mLock.unlock();
                    svc->mAudioPolicyEffects->doReleaseOutputSessionEffects(
                            data->mOutput, data->mStream, data->mSessionId);
                    mLock.lock();
                    } break;
                case ADD_OUTPUT_SESSION_EFFECTS: {
                    AddOutputSessionEffectsData *data = (AddOutputSessionEffectsData *)command->mParam.get();
                    ALOGV("AudioCommandThread() processing add output session effects %d",
                            data->mOutput);
                    svc = mService.promote();
                    if (svc == 0) {
                        break;
                    }
                    mLock.unlock();
                    svc->mAudioPolicyEffects->doAddOutputSessionEffects(
                            data->mOutput, data->mStream, data->mSessionId,
                            data->mFlags, data->mChannelMask, data->mUid);
                    mLock.lock();
                    }break;



                default:
                default:
                    ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
                    ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
@@ -852,29 +816,6 @@ status_t AudioPolicyService::AudioCommandThread::startOutputCommand(audio_io_han
    return sendCommand(command);
    return sendCommand(command);
}
}


status_t AudioPolicyService::AudioCommandThread::addOutputSessionEffectsCommand(audio_io_handle_t output,
                                                                    audio_stream_type_t stream,
                                                                    audio_session_t session,
                                                                    audio_output_flags_t flags,
                                                                    audio_channel_mask_t channelMask,
                                                                    uid_t uid)
{
    sp<AudioCommand> command = new AudioCommand();
    command->mCommand = ADD_OUTPUT_SESSION_EFFECTS;
    sp<AddOutputSessionEffectsData> data = new AddOutputSessionEffectsData();
    data->mOutput = output;
    data->mStream = stream;
    data->mSessionId = session;
    data->mFlags = flags;
    data->mChannelMask = channelMask;
    data->mUid = uid;
    command->mParam = data;
    command->mWaitStatus = false;
    ALOGV("AudioCommandThread() adding start output %d", output);
    return sendCommand(command);
}


void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output,
void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output,
                                                               audio_stream_type_t stream,
                                                               audio_stream_type_t stream,
                                                               audio_session_t session)
                                                               audio_session_t session)
@@ -1003,23 +944,6 @@ void AudioPolicyService::AudioCommandThread::effectSessionUpdateCommand(
    sendCommand(command);
    sendCommand(command);
}
}


void AudioPolicyService::AudioCommandThread::releaseOutputSessionEffectsCommand(
        audio_io_handle_t output, audio_stream_type_t stream,
        audio_unique_id_t sessionId, int delayMs)
{
    sp<AudioCommand> command = new AudioCommand();
    command->mCommand = RELEASE_OUTPUT_SESSION_EFFECTS;
    ReleaseOutputSessionEffectsData *data = new ReleaseOutputSessionEffectsData();
    data->mOutput = output;
    data->mStream = stream;
    data->mSessionId = sessionId;
    command->mParam = data;
    ALOGV("AudioCommandThread() sending release output session effects (id=%d) for stream %d",
            sessionId, stream);
    sendCommand(command, delayMs);
}


status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
{
{
    {
    {
Loading