Merge "AudioService: clear recording activities on audioserver crash"
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index df33bf2..1723163 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -392,12 +392,14 @@
* e.g. user on homescreen, no app playing anything, presses hardware volume buttons, this
* stream type is controlled.
*/
- protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
+ protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
public void onError(int error) {
switch (error) {
case AudioSystem.AUDIO_STATUS_SERVER_DIED:
+ mRecordMonitor.clear();
+
sendMsg(mAudioHandler, MSG_AUDIO_SERVER_DIED,
SENDMSG_NOOP, 0, 0, null, 0);
sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_SERVER_STATE,
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 9d6628c..b2c7ff3 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -78,24 +78,27 @@
updateSnapshot(event, uid, session, source, recordingInfo,
portId, silenced, activeSource, clientEffects, effects);
if (configsSystem != null){
- synchronized (mClients) {
- // list of recording configurations for "public consumption". It is only computed if
- // there are non-system recording activity listeners.
- final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients ?
- anonymizeForPublicConsumption(configsSystem) :
- new ArrayList<AudioRecordingConfiguration>();
- final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
- while (clientIterator.hasNext()) {
- final RecMonitorClient rmc = clientIterator.next();
- try {
- if (rmc.mIsPrivileged) {
- rmc.mDispatcherCb.dispatchRecordingConfigChange(configsSystem);
- } else {
- rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
+ dispatchCallbacks(configsSystem);
+ }
+ }
+ private void dispatchCallbacks(List<AudioRecordingConfiguration> configs) {
+ synchronized (mClients) {
+ // list of recording configurations for "public consumption". It is only computed if
+ // there are non-system recording activity listeners.
+ final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients
+ ? anonymizeForPublicConsumption(configs) :
+ new ArrayList<AudioRecordingConfiguration>();
+ final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
+ while (clientIterator.hasNext()) {
+ final RecMonitorClient rmc = clientIterator.next();
+ try {
+ if (rmc.mIsPrivileged) {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configs);
+ } else {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
}
+ } catch (RemoteException e) {
+ Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
}
}
}
@@ -130,6 +133,13 @@
AudioSystem.setRecordingCallback(this);
}
+ void clear() {
+ synchronized (mRecordConfigs) {
+ mRecordConfigs.clear();
+ }
+ dispatchCallbacks(new ArrayList<AudioRecordingConfiguration>());
+ }
+
void registerRecordingCallback(IRecordingConfigDispatcher rcdb, boolean isPrivileged) {
if (rcdb == null) {
return;