From 2fd186ea715e2d0f3226eaa091d66edc1e35c301 Mon Sep 17 00:00:00 2001 From: Shubang Date: Wed, 18 Jul 2018 16:53:12 -0700 Subject: [PATCH 1/2] Handle amplifier ends system audio control Based on spec CEC 13.15.2 Bug: 80296770 Test: make; Change-Id: I53ddc0a401e033807424010147b3bc3cd8c9c374 --- .../hdmi/HdmiCecLocalDeviceAudioSystem.java | 31 +++++ .../HdmiCecLocalDeviceAudioSystemTest.java | 113 ++++++++++++------ 2 files changed, 108 insertions(+), 36 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index f9802e1e480c8..c77cd8e19ec1f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -332,6 +332,37 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { } } + protected void terminateSystemAudioMode() { + // remove pending initiation actions + removeAction(SystemAudioInitiationActionFromAvr.class); + + synchronized (mLock) { + if (!mSystemAudioActivated) { + return; + } + } + + // send [“Off”] + mService.sendCecCommand( + HdmiCecMessageBuilder.buildSetSystemAudioMode( + mAddress, Constants.ADDR_BROADCAST, false)); + + // mute speaker + if (!mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC)) { + mService.getAudioManager() + .adjustStreamVolume( + AudioManager.STREAM_MUSIC, + AudioManager.ADJUST_MUTE, + 0); + } + + mSystemAudioSource = null; + synchronized (mLock) { + mSystemAudioActivated = false; + mService.announceSystemAudioModeChange(false); + } + } + /** Reports if System Audio Mode is supported by the connected TV */ interface TvSystemAudioModeSupportedCallback { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java index 232fb8c192c37..cde8e63824e2a 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -21,9 +21,6 @@ import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.assertEquals; import android.media.AudioManager; import android.os.Looper; @@ -140,52 +137,56 @@ public class HdmiCecLocalDeviceAudioSystemTest { mMusicMute = true; mMusicMaxVolume = 20; int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus( + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildReportAudioStatus( ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true); HdmiCecMessage messageGive = HdmiCecMessageBuilder.buildGiveAudioStatus( ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleGiveSystemAudioModeStatus_originalOff() { - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessage messageGive = HdmiCecMessageBuilder .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleRequestArcInitiate() { // TODO(b/80296911): Add tests when finishing handler impl. - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleRequestArcTermination() { // TODO(b/80297105): Add tests when finishing handler impl. - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test @@ -197,28 +198,31 @@ public class HdmiCecLocalDeviceAudioSystemTest { .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); // Check if originally off - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); // Check if correctly turned on - expectMessage = HdmiCecMessageBuilder + expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertFalse(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(false); } @Test public void handleSystemAudioModeRequest_turnOffByTv() { - assertFalse(mMusicMute); + assertThat(mMusicMute).isEqualTo(false); // Check if feature correctly turned off HdmiCecMessage messageGive = HdmiCecMessageBuilder @@ -226,18 +230,20 @@ public class HdmiCecLocalDeviceAudioSystemTest { HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); - expectMessage = HdmiCecMessageBuilder + expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertTrue(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(true); } @Test @@ -248,10 +254,10 @@ public class HdmiCecLocalDeviceAudioSystemTest { // Check if standby correctly turns off the feature mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertTrue(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(true); } @Test @@ -304,8 +310,43 @@ public class HdmiCecLocalDeviceAudioSystemTest { .buildActiveSource(ADDR_TV, 0x0000); ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertTrue(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource)); + assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource)) + .isEqualTo(true); + } + + @Test + public void terminateSystemAudioMode_systemAudioModeOff() { + mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(false); + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + + mMusicMute = false; + HdmiCecMessage message = HdmiCecMessageBuilder + .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); + + mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode(); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + assertThat(mMusicMute).isEqualTo(false); + assertThat(mNativeWrapper.getResultMessage()).isNotEqualTo(message); + } + + @Test + public void terminateSystemAudioMode_systemAudioModeOn() { + mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true); + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(true); + + mMusicMute = false; + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder + .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); + + mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode(); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + assertThat(mMusicMute).isEqualTo(true); + mTestLooper.dispatchAll(); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } } From bc2aab3e0fc8b32478ac07ea6ea8ec267232ca04 Mon Sep 17 00:00:00 2001 From: Shubang Date: Thu, 19 Jul 2018 16:41:17 -0700 Subject: [PATCH 2/2] Reuse setSystemAudioMode() in terminateSystemAudioMode() Bug: 80296770 Test: atest com.android.server.hdmi Change-Id: I12244fd8bdd8b0a15f5abde498f9b6ae2831a03a --- .../hdmi/HdmiCecLocalDeviceAudioSystem.java | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index c77cd8e19ec1f..b796abd8ea7b2 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -66,11 +66,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, mSystemAudioActivated ? "true" : "false"); } - if (setSystemAudioMode(false)) { - mService.sendCecCommand( - HdmiCecMessageBuilder.buildSetSystemAudioMode( - mAddress, Constants.ADDR_BROADCAST, false)); - } + terminateSystemAudioMode(); } @Override @@ -335,31 +331,15 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { protected void terminateSystemAudioMode() { // remove pending initiation actions removeAction(SystemAudioInitiationActionFromAvr.class); - - synchronized (mLock) { - if (!mSystemAudioActivated) { - return; - } + if (!isSystemAudioActivated()) { + return; } - // send [“Off”] - mService.sendCecCommand( - HdmiCecMessageBuilder.buildSetSystemAudioMode( - mAddress, Constants.ADDR_BROADCAST, false)); - - // mute speaker - if (!mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC)) { - mService.getAudioManager() - .adjustStreamVolume( - AudioManager.STREAM_MUSIC, - AudioManager.ADJUST_MUTE, - 0); - } - - mSystemAudioSource = null; - synchronized (mLock) { - mSystemAudioActivated = false; - mService.announceSystemAudioModeChange(false); + if (setSystemAudioMode(false)) { + // send [“Off”] + mService.sendCecCommand( + HdmiCecMessageBuilder.buildSetSystemAudioMode( + mAddress, Constants.ADDR_BROADCAST, false)); } }