diff options
7 files changed, 36 insertions, 54 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index f75bdabc2f55..6aa86a72fc31 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -21,9 +21,6 @@ import android.hardware.hdmi.HdmiCecDeviceInfo; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.IHdmiControlCallback; import android.media.AudioManager; -import android.media.AudioManager.OnAudioPortUpdateListener; -import android.media.AudioPatch; -import android.media.AudioPort; import android.media.AudioSystem; import android.os.RemoteException; import android.os.SystemProperties; @@ -56,9 +53,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // Whether ARC feature is enabled or not. private boolean mArcFeatureEnabled = false; - // Whether SystemAudioMode is "On" or not. + // Whether System audio mode is activated or not. + // This becomes true only when all system audio sequences are finished. @GuardedBy("mLock") - private boolean mSystemAudioMode; + private boolean mSystemAudioActivated = false; // The previous port id (input) before switching to the new one. This is remembered in order to // be able to switch to it upon receiving <Inactive Source> from currently active source. @@ -108,11 +106,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mAddress, mService.getPhysicalAddress(), mDeviceType)); mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); - mSystemAudioMode = mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, false); launchRoutingControl(fromBootup); launchDeviceDiscovery(); - registerAudioPortUpdateListener(); - // TODO: unregister audio port update listener if local device is released. } @Override @@ -130,30 +125,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_TV, String.valueOf(addr)); } - private void registerAudioPortUpdateListener() { - mService.getAudioManager().registerAudioPortUpdateListener( - new OnAudioPortUpdateListener() { - @Override - public void OnAudioPatchListUpdate(AudioPatch[] patchList) {} - - @Override - public void OnAudioPortListUpdate(AudioPort[] portList) { - if (!mSystemAudioMode) { - return; - } - int devices = mService.getAudioManager().getDevicesForStream( - AudioSystem.STREAM_MUSIC); - if ((devices & ~AudioSystem.DEVICE_ALL_HDMI_SYSTEM_AUDIO_AND_SPEAKER) - != 0) { - // TODO: release system audio here. - } - } - - @Override - public void OnServiceDied() {} - }); - } - /** * Performs the action 'device select', or 'one touch play' initiated by TV. * @@ -565,7 +536,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // If there is AVR, initiate System Audio Auto initiation action, // which turns on and off system audio according to last system // audio setting. - if (mSystemAudioMode && getAvrDeviceInfo() != null) { + if (mSystemAudioActivated && getAvrDeviceInfo() != null) { addAndStartAction(new SystemAudioAutoInitiationAction( HdmiCecLocalDeviceTv.this, getAvrDeviceInfo().getLogicalAddress())); @@ -608,23 +579,36 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // # Seq 25 void setSystemAudioMode(boolean on, boolean updateSetting) { + if (updateSetting) { + mService.writeBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, on); + } + updateAudioManagerForSystemAudio(on); synchronized (mLock) { - if (on != mSystemAudioMode) { - mSystemAudioMode = on; - if (updateSetting) { - mService.writeBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, on); - } + if (mSystemAudioActivated != on) { + mSystemAudioActivated = on; mService.announceSystemAudioModeChange(on); } } } - boolean getSystemAudioMode() { + private void updateAudioManagerForSystemAudio(boolean on) { + // TODO: remove output device, once update AudioManager api. + mService.getAudioManager().setHdmiSystemAudioSupported(on); + } + + boolean isSystemAudioActivated() { + if (getAvrDeviceInfo() == null) { + return false; + } synchronized (mLock) { - return mSystemAudioMode; + return mSystemAudioActivated; } } + boolean getSystemAudioModeSetting() { + return mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, false); + } + /** * Change ARC status into the given {@code enabled} status. * @@ -722,7 +706,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly void changeVolume(int curVolume, int delta, int maxVolume) { assertRunOnServiceThread(); - if (delta == 0 || !isSystemAudioOn()) { + if (delta == 0 || !isSystemAudioActivated()) { return; } @@ -750,7 +734,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly void changeMute(boolean mute) { assertRunOnServiceThread(); - if (!isSystemAudioOn()) { + if (!isSystemAudioActivated()) { return; } @@ -761,12 +745,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } private boolean isSystemAudioOn() { - if (getAvrDeviceInfo() == null) { - return false; - } + synchronized (mLock) { - return mSystemAudioMode; + return mSystemAudioActivated; } } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 7db5f0cc336a..0239c8319918 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -827,7 +827,7 @@ public final class HdmiControlService extends SystemService { if (tv == null) { return false; } - return tv.getSystemAudioMode(); + return tv.isSystemAudioActivated(); } @Override diff --git a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java index 6204c169d1aa..813901d4b5fb 100644 --- a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java +++ b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java @@ -108,7 +108,7 @@ final class HotplugDetectionAction extends FeatureAction { if (mTimeoutCount == 0) { pollAllDevices(); } else { - if (tv().getSystemAudioMode()) { + if (tv().isSystemAudioActivated()) { pollAudioSystem(); } } diff --git a/services/core/java/com/android/server/hdmi/NewDeviceAction.java b/services/core/java/com/android/server/hdmi/NewDeviceAction.java index f89e299687fa..7d7a95bda706 100644 --- a/services/core/java/com/android/server/hdmi/NewDeviceAction.java +++ b/services/core/java/com/android/server/hdmi/NewDeviceAction.java @@ -158,7 +158,7 @@ final class NewDeviceAction extends FeatureAction { if (HdmiUtils.getTypeFromAddress(mDeviceLogicalAddress) == HdmiCecDeviceInfo.DEVICE_AUDIO_SYSTEM) { - if (tv().getSystemAudioMode()) { + if (tv().getSystemAudioModeSetting()) { addAndStartAction(new SystemAudioAutoInitiationAction(localDevice(), mDeviceLogicalAddress)); } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java index 77783b71ee49..df9bdfc2df5f 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java @@ -48,7 +48,7 @@ final class SystemAudioActionFromAvr extends SystemAudioAction { } private void handleSystemAudioActionFromAvr() { - if (mTargetAudioStatus == tv().getSystemAudioMode()) { + if (mTargetAudioStatus == tv().isSystemAudioActivated()) { finishWithCallback(HdmiControlManager.RESULT_SUCCESS); return; } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java index d03634ec951a..137cada5513d 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java @@ -73,7 +73,7 @@ final class SystemAudioAutoInitiationAction extends FeatureAction { private void handleSystemAudioModeStatusMessage() { // If the last setting is system audio, turn on system audio whatever AVR status is. - if (tv().getSystemAudioMode()) { + if (tv().getSystemAudioModeSetting()) { if (canChangeSystemAudio()) { addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, true, null)); } @@ -102,7 +102,7 @@ final class SystemAudioAutoInitiationAction extends FeatureAction { } private void handleSystemAudioModeStatusTimeout() { - if (tv().getSystemAudioMode()) { + if (tv().getSystemAudioModeSetting()) { if (canChangeSystemAudio()) { addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, true, null)); } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java index 91805c58e8a9..106620407aec 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java @@ -68,7 +68,7 @@ final class SystemAudioStatusAction extends FeatureAction { // the audio amplifier is unknown. tv().setAudioStatus(false, Constants.UNKNOWN_VOLUME); - int uiCommand = tv().getSystemAudioMode() + int uiCommand = tv().isSystemAudioActivated() ? HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION // SystemAudioMode: ON : HdmiCecKeycode.CEC_KEYCODE_MUTE_FUNCTION; // SystemAudioMode: OFF sendUserControlPressedAndReleased(mAvrAddress, uiCommand); @@ -98,7 +98,7 @@ final class SystemAudioStatusAction extends FeatureAction { int volume = params[0] & 0x7F; tv().setAudioStatus(mute, volume); - if ((tv().getSystemAudioMode() && mute) || (!tv().getSystemAudioMode() && !mute)) { + if (!(tv().isSystemAudioActivated() ^ mute)) { // Toggle AVR's mute status to match with the system audio status. sendUserControlPressedAndReleased(mAvrAddress, HdmiCecKeycode.CEC_KEYCODE_MUTE); } |