Loading services/audiopolicy/service/AudioPolicyService.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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); } } } Loading Loading @@ -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; } } } Loading services/audiopolicy/service/AudioPolicyService.h +5 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 --- Loading Loading
services/audiopolicy/service/AudioPolicyService.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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); } } } Loading Loading @@ -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; } } } Loading
services/audiopolicy/service/AudioPolicyService.h +5 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 --- Loading