From 1f819bbfc80f0ae9de120e9b81250db36629a0b1 Mon Sep 17 00:00:00 2001 From: Jungshik Jang Date: Fri, 8 Aug 2014 10:46:54 +0900 Subject: [PATCH] Add IHdmiSystemAudioModeChangeListner to TvInputHardwareManager. This is to update audio patch when HDMI-CEC system audio mode is changed. Bug: 16113320 Change-Id: I312fffe511c0bce1c973bb66e9c16875e5dcee56 --- .../server/tv/TvInputHardwareManager.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index b88e669b975cc..0aa3d813df384 100644 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -28,6 +28,7 @@ import android.hardware.hdmi.IHdmiControlService; import android.hardware.hdmi.IHdmiDeviceEventListener; import android.hardware.hdmi.IHdmiHotplugEventListener; import android.hardware.hdmi.IHdmiInputChangeListener; +import android.hardware.hdmi.IHdmiSystemAudioModeChangeListener; import android.media.AudioDevicePort; import android.media.AudioFormat; import android.media.AudioGain; @@ -93,6 +94,8 @@ class TvInputHardwareManager implements TvInputHal.Callback { new HdmiHotplugEventListener(); private final IHdmiDeviceEventListener mHdmiDeviceEventListener = new HdmiDeviceEventListener(); private final IHdmiInputChangeListener mHdmiInputChangeListener = new HdmiInputChangeListener(); + private final IHdmiSystemAudioModeChangeListener mHdmiSystemAudioModeChangeListener = + new HdmiSystemAudioModeChangeListener(); // TODO: Should handle STANDBY case. private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray(); private final List mPendingHdmiDeviceEvents = new LinkedList<>(); @@ -117,6 +120,8 @@ class TvInputHardwareManager implements TvInputHal.Callback { try { mHdmiControlService.addHotplugEventListener(mHdmiHotplugEventListener); mHdmiControlService.addDeviceEventListener(mHdmiDeviceEventListener); + mHdmiControlService.addSystemAudioModeChangeListener( + mHdmiSystemAudioModeChangeListener); mHdmiDeviceList.addAll(mHdmiControlService.getInputDevices()); mHdmiControlService.setInputChangeListener(mHdmiInputChangeListener); } catch (RemoteException e) { @@ -615,7 +620,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC); for (AudioPort port : devicePorts) { AudioDevicePort devicePort = (AudioDevicePort) port; - if (devicePort.type() == sinkDevice) { + if ((devicePort.type() & sinkDevice) != 0) { return devicePort; } } @@ -838,6 +843,13 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } + private void handleAudioSinkUpdated() { + synchronized (mImplLock) { + updateAudioSinkLocked(); + updateAudioPatchLocked(); + } + } + @Override public void overrideAudioSink(int audioType, String audioAddress, int samplingRate, int channelMask, int format) { @@ -1006,4 +1018,17 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } } + + private final class HdmiSystemAudioModeChangeListener extends + IHdmiSystemAudioModeChangeListener.Stub { + @Override + public void onStatusChanged(boolean enabled) throws RemoteException { + synchronized (mLock) { + for (int i = 0; i < mConnections.size(); ++i) { + TvInputHardwareImpl impl = mConnections.valueAt(i).getHardwareImplLocked(); + impl.handleAudioSinkUpdated(); + } + } + } + } }