summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/audio/AudioService.java
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2015-03-26 14:23:58 -0400
committerJohn Spurlock <jspurlock@google.com>2015-03-26 14:35:11 -0400
commit8a52c4491dfbb8354a92c0a1e6abc86848e187c6 (patch)
tree1f5b3febe6f11ec39cf48490025529b0b56670e6 /services/core/java/com/android/server/audio/AudioService.java
parent221d2cbf2f418be8de22f5cf3d79a25be1b8d1be (diff)
downloadframeworks_base-8a52c4491dfbb8354a92c0a1e6abc86848e187c6.zip
frameworks_base-8a52c4491dfbb8354a92c0a1e6abc86848e187c6.tar.gz
frameworks_base-8a52c4491dfbb8354a92c0a1e6abc86848e187c6.tar.bz2
AudioService: Observe changes to output devices per-stream.
- Keep track of calls to AudioSystem.getDevicesForStream. - Report device changes for the base streams to the binary event log. - Fire internal intent so volume UI can respond to changes. - Update devices when new routes are reported. Bug: 19618959 Change-Id: I7bbd497b178d9829accc19e6c951a711aef8590c
Diffstat (limited to 'services/core/java/com/android/server/audio/AudioService.java')
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java53
1 files changed, 50 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 65b2ae2..a913a51 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3305,7 +3305,7 @@ public class AudioService extends IAudioService.Stub {
}
private int getDeviceForStream(int stream) {
- int device = AudioSystem.getDevicesForStream(stream);
+ int device = getDevicesForStream(stream);
if ((device & (device - 1)) != 0) {
// Multiple device selection is either:
// - speaker + one other device: give priority to speaker in this case.
@@ -3328,6 +3328,27 @@ public class AudioService extends IAudioService.Stub {
return device;
}
+ private int getDevicesForStream(int stream) {
+ return getDevicesForStream(stream, true /*checkOthers*/);
+ }
+
+ private int getDevicesForStream(int stream, boolean checkOthers) {
+ ensureValidStreamType(stream);
+ synchronized (VolumeStreamState.class) {
+ return mStreamStates[stream].observeDevicesForStream_syncVSS(checkOthers);
+ }
+ }
+
+ private void observeDevicesForStreams(int skipStream) {
+ synchronized (VolumeStreamState.class) {
+ for (int stream = 0; stream < mStreamStates.length; stream++) {
+ if (stream != skipStream) {
+ mStreamStates[stream].observeDevicesForStream_syncVSS(false /*checkOthers*/);
+ }
+ }
+ }
+ }
+
/*
* A class just for packaging up a set of connection parameters.
*/
@@ -3406,9 +3427,11 @@ public class AudioService extends IAudioService.Stub {
private boolean mIsMuted;
private String mVolumeIndexSettingName;
+ private int mObservedDevices;
private final SparseIntArray mIndexMap = new SparseIntArray(8);
private final Intent mVolumeChanged;
+ private final Intent mStreamDevicesChanged;
private VolumeStreamState(String settingName, int streamType) {
@@ -3422,6 +3445,29 @@ public class AudioService extends IAudioService.Stub {
readSettings();
mVolumeChanged = new Intent(AudioManager.VOLUME_CHANGED_ACTION);
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, mStreamType);
+ mStreamDevicesChanged = new Intent(AudioManager.STREAM_DEVICES_CHANGED_ACTION);
+ mStreamDevicesChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, mStreamType);
+ }
+
+ public int observeDevicesForStream_syncVSS(boolean checkOthers) {
+ final int devices = AudioSystem.getDevicesForStream(mStreamType);
+ if (devices == mObservedDevices) {
+ return devices;
+ }
+ final int prevDevices = mObservedDevices;
+ mObservedDevices = devices;
+ if (checkOthers) {
+ // one stream's devices have changed, check the others
+ observeDevicesForStreams(mStreamType);
+ }
+ // log base stream changes to the event log
+ if (mStreamVolumeAlias[mStreamType] == mStreamType) {
+ EventLogTags.writeStreamDevicesChanged(mStreamType, prevDevices, devices);
+ }
+ sendBroadcastToAll(mStreamDevicesChanged
+ .putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_DEVICES, prevDevices)
+ .putExtra(AudioManager.EXTRA_VOLUME_STREAM_DEVICES, devices));
+ return devices;
}
public String getSettingNameForDevice(int device) {
@@ -3716,7 +3762,7 @@ public class AudioService extends IAudioService.Stub {
}
pw.println();
pw.print(" Devices: ");
- final int devices = AudioSystem.getDevicesForStream(mStreamType);
+ final int devices = getDevicesForStream(mStreamType);
int device, i = 0, n = 0;
// iterate all devices from 1 to DEVICE_OUT_DEFAULT exclusive
// (the default device is not returned by getDevicesForStream)
@@ -4250,6 +4296,7 @@ public class AudioService extends IAudioService.Stub {
}
}
mRoutesObservers.finishBroadcast();
+ observeDevicesForStreams(-1);
break;
}
@@ -5348,7 +5395,7 @@ public class AudioService extends IAudioService.Stub {
on ? AudioSystem.FORCE_HDMI_SYSTEM_AUDIO_ENFORCED :
AudioSystem.FORCE_NONE);
}
- device = AudioSystem.getDevicesForStream(AudioSystem.STREAM_MUSIC);
+ device = getDevicesForStream(AudioSystem.STREAM_MUSIC);
}
}
}