From cfe4c2627e4b39f6ecd64154348ce4f3cd2d8d4a Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Thu, 9 May 2019 09:02:47 -0700 Subject: [PATCH] AudioService: implement de-registration (release) of recorders Clients must unregister themselves when client-side AudioRecord goes away. This allows removing the tracking record sooner than the client app goes away. "DEATH" event has been renamed to "RELEASE". Client death is handled the same way as regular release. Bug: 123312504 Test: start and stop audio recording, check "dumpsys audio" Change-Id: I6a9578b29ab3c41bac2bf4c823224276efbe1beb --- media/java/android/media/AudioManager.java | 2 +- media/java/android/media/IAudioService.aidl | 2 ++ .../android/server/audio/AudioService.java | 7 +++++++ .../audio/RecordingActivityMonitor.java | 19 +++++++++++-------- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index bcc57d203fc2a..23dfb777362bf 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3774,7 +3774,7 @@ public class AudioManager { /** @hide */ public static final int RECORD_CONFIG_EVENT_UPDATE = 2; /** @hide */ - public static final int RECORD_CONFIG_EVENT_DEATH = 3; + public static final int RECORD_CONFIG_EVENT_RELEASE = 3; /** * keep in sync with frameworks/native/include/audiomanager/AudioManager.h */ diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 81ddcdb4e27e8..a790441aa36e2 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -64,6 +64,8 @@ interface IAudioService { oneway void recorderEvent(in int riid, in int event); + oneway void releaseRecorder(in int riid); + // Java-only methods below. oneway void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags, diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index ad5f4e6e33c23..e274ad5a5c903 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -7071,6 +7071,13 @@ public class AudioService extends IAudioService.Stub mRecordMonitor.recorderEvent(riid, event); } + /** + * Stop tracking the recorder + */ + public void releaseRecorder(int riid) { + mRecordMonitor.releaseRecorder(riid); + } + public void disableRingtoneSync(final int userId) { final int callingUserId = UserHandle.getCallingUserId(); if (callingUserId != userId) { diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java index 69d1ea76c1e35..5d31dbe93cf9a 100644 --- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java +++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java @@ -176,8 +176,11 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin dispatchCallbacks(updateSnapshot(configEvent, riid, null)); } - void unregisterRecorder(int riid) { - dispatchCallbacks(updateSnapshot(AudioManager.RECORD_CONFIG_EVENT_DEATH, riid, null)); + /** + * Stop tracking the recorder + */ + public void releaseRecorder(int riid) { + dispatchCallbacks(updateSnapshot(AudioManager.RECORD_CONFIG_EVENT_RELEASE, riid, null)); } private void dispatchCallbacks(List configs) { @@ -246,7 +249,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin if (state.isActiveConfiguration()) { configChanged = true; sEventLogger.log(new RecordingEvent( - AudioManager.RECORD_CONFIG_EVENT_DEATH, + AudioManager.RECORD_CONFIG_EVENT_RELEASE, state.getRiid(), state.getConfig())); } it.remove(); @@ -396,7 +399,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin switch (event) { case AudioManager.RECORD_CONFIG_EVENT_START: configChanged = state.setActive(true); - if (config != null) { // ??? Can remove ??? + if (config != null) { configChanged = state.setConfig(config) || configChanged; } break; @@ -412,7 +415,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mRecordStates.remove(stateIndex); } break; - case AudioManager.RECORD_CONFIG_EVENT_DEATH: + case AudioManager.RECORD_CONFIG_EVENT_RELEASE: configChanged = state.isActiveConfiguration(); mRecordStates.remove(stateIndex); break; @@ -504,7 +507,7 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin } public void binderDied() { - sMonitor.unregisterRecorder(mRiid); + sMonitor.releaseRecorder(mRiid); } boolean init() { @@ -553,8 +556,8 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin return "update"; case AudioManager.RECORD_CONFIG_EVENT_STOP: return "stop"; - case AudioManager.RECORD_CONFIG_EVENT_DEATH: - return "death"; + case AudioManager.RECORD_CONFIG_EVENT_RELEASE: + return "release"; default: return "unknown (" + recEvent + ")"; }