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

Commit 30bdefcf authored by Eric Laurent's avatar Eric Laurent Committed by Automerger Merge Worker
Browse files

Merge "audio policy: finish audio record op when silencing recording" into sc-dev am: 8c3219d7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/14929943

Change-Id: Ifd6b21ff5407cfe8ea8d6aab1217d9d44b3bc12e
parents de1046b7 8c3219d7
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -786,7 +786,7 @@ void AudioPolicyService::updateUidStates_l()
                allowCapture = true;
            }
        }
        setAppState_l(current->portId,
        setAppState_l(current,
                      allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(currentUid)) :
                                APP_STATE_IDLE);
    }
@@ -796,7 +796,7 @@ void AudioPolicyService::silenceAllRecordings_l() {
    for (size_t i = 0; i < mAudioRecordClients.size(); i++) {
        sp<AudioRecordClient> current = mAudioRecordClients[i];
        if (!isVirtualSource(current->attributes.source)) {
            setAppState_l(current->portId, APP_STATE_IDLE);
            setAppState_l(current, APP_STATE_IDLE);
        }
    }
}
@@ -830,17 +830,32 @@ bool AudioPolicyService::isVirtualSource(audio_source_t source)
    return false;
}

void AudioPolicyService::setAppState_l(audio_port_handle_t portId, app_state_t state)
void AudioPolicyService::setAppState_l(sp<AudioRecordClient> client, app_state_t state)
{
    AutoCallerClear acc;

    if (mAudioPolicyManager) {
        mAudioPolicyManager->setAppState(portId, state);
        mAudioPolicyManager->setAppState(client->portId, state);
    }
    sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
    if (af) {
        bool silenced = state == APP_STATE_IDLE;
        af->setRecordSilenced(portId, silenced);
        if (client->silenced != silenced) {
            if (client->active) {
                if (silenced) {
                    finishRecording(client->attributionSource, client->attributes.source);
                } else {
                    std::stringstream msg;
                    msg << "Audio recording un-silenced on session " << client->session;
                    if (!startRecording(client->attributionSource, String16(msg.str().c_str()),
                            client->attributes.source)) {
                        silenced = true;
                    }
                }
            }
            af->setRecordSilenced(client->portId, silenced);
            client->silenced = silenced;
        }
    }
}

+5 −2
Original line number Diff line number Diff line
@@ -324,8 +324,10 @@ private:
    // Handles binder shell commands
    virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);

    class AudioRecordClient;

    // Sets whether the given UID records only silence
    virtual void setAppState_l(audio_port_handle_t portId, app_state_t state) REQUIRES(mLock);
    virtual void setAppState_l(sp<AudioRecordClient> client, app_state_t state) REQUIRES(mLock);

    // Overrides the UID state as if it is idle
    status_t handleSetUidState(Vector<String16>& args, int err);
@@ -826,13 +828,14 @@ private:
                    AudioClient(attributes, io, attributionSource,
                        session, portId, deviceId), attributionSource(attributionSource),
                        startTimeNs(0), canCaptureOutput(canCaptureOutput),
                        canCaptureHotword(canCaptureHotword) {}
                        canCaptureHotword(canCaptureHotword), silenced(false) {}
                ~AudioRecordClient() override = default;

        const AttributionSourceState attributionSource; // attribution source of client
        nsecs_t startTimeNs;
        const bool canCaptureOutput;
        const bool canCaptureHotword;
        bool silenced;
    };

    // --- AudioPlaybackClient ---