From ed43bf5160d3170c3220a9c0cbab9b272acdfc6b Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 1 Mar 2016 17:01:35 -0800 Subject: [PATCH] AudioService: update device info when ENCODED_SURROUND_OUTPUT changed Fixes a bug with the ContentObserver not being registered. Added code to also toggle the HDMI connection to force a broadcast. Bug: 27434478 Bug: 24541671 Change-Id: If1644f4d08991ee27e3b6e10d244a704c25b5fa9 Signed-off-by: Phil Burk --- .../android/server/audio/AudioService.java | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 5a3639a972fce..f2a9c2c9bff7c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -849,7 +849,7 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setForceUse(AudioSystem.FOR_DOCK, mDockAudioMediaEnabled ? AudioSystem.FORCE_ANALOG_DOCK : AudioSystem.FORCE_NONE); - readEncodedSurroundMode(mContentResolver); + sendEncodedSurroundMode(mContentResolver); } if (mHdmiManager != null) { synchronized (mHdmiManager) { @@ -1023,7 +1023,7 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setMasterMono(masterMono); } - private void readEncodedSurroundMode(ContentResolver cr) + private void sendEncodedSurroundMode(ContentResolver cr) { int encodedSurroundMode = Settings.Global.getInt( cr, Settings.Global.ENCODED_SURROUND_OUTPUT, @@ -1102,7 +1102,7 @@ public class AudioService extends IAudioService.Stub { updateRingerModeAffectedStreams(); readDockAudioSettings(cr); - readEncodedSurroundMode(cr); + sendEncodedSurroundMode(cr); } mMuteAffectedStreams = System.getIntForUser(cr, @@ -4642,6 +4642,8 @@ public class AudioService extends IAudioService.Stub { private class SettingsObserver extends ContentObserver { + private int mEncodedSurroundMode; + SettingsObserver() { super(new Handler()); mContentResolver.registerContentObserver(Settings.System.getUriFor( @@ -4650,6 +4652,12 @@ public class AudioService extends IAudioService.Stub { Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this); mContentResolver.registerContentObserver(Settings.System.getUriFor( Settings.System.MASTER_MONO), false, this); + + mEncodedSurroundMode = Settings.Global.getInt( + mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, + Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); + mContentResolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.ENCODED_SURROUND_OUTPUT), false, this); } @Override @@ -4669,7 +4677,33 @@ public class AudioService extends IAudioService.Stub { } readDockAudioSettings(mContentResolver); updateMasterMono(mContentResolver); - readEncodedSurroundMode(mContentResolver); + updateEncodedSurroundOutput(); + } + } + + private void updateEncodedSurroundOutput() { + int newSurroundMode = Settings.Global.getInt( + mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, + Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); + // Did it change? + if (mEncodedSurroundMode != newSurroundMode) { + // Send to AudioPolicyManager + sendEncodedSurroundMode(newSurroundMode); + synchronized(mConnectedDevices) { + // Is HDMI connected? + String key = makeDeviceListKey(AudioSystem.DEVICE_OUT_HDMI, ""); + DeviceListSpec deviceSpec = mConnectedDevices.get(key); + if (deviceSpec != null) { + // Toggle HDMI to retrigger broadcast with proper formats. + setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_HDMI, + AudioSystem.DEVICE_STATE_UNAVAILABLE, "", "", + "android"); // disconnect + setWiredDeviceConnectionState(AudioSystem.DEVICE_OUT_HDMI, + AudioSystem.DEVICE_STATE_AVAILABLE, "", "", + "android"); // reconnect + } + } + mEncodedSurroundMode = newSurroundMode; } } }