diff options
author | John Spurlock <jspurlock@google.com> | 2015-03-26 14:23:58 -0400 |
---|---|---|
committer | John Spurlock <jspurlock@google.com> | 2015-03-26 14:35:11 -0400 |
commit | 8a52c4491dfbb8354a92c0a1e6abc86848e187c6 (patch) | |
tree | 1f5b3febe6f11ec39cf48490025529b0b56670e6 /services/core/java/com/android/server/audio/AudioService.java | |
parent | 221d2cbf2f418be8de22f5cf3d79a25be1b8d1be (diff) | |
download | frameworks_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.java | 53 |
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); } } } |