Merge "Import translations. DO NOT MERGE" into lmp-mr1-dev
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index bb12eae..f6d4efd 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -186,6 +186,7 @@
 
     static final int INVALID_PORT_ID = HdmiDeviceInfo.PORT_INVALID;
     static final int INVALID_PHYSICAL_ADDRESS = HdmiDeviceInfo.PATH_INVALID;
+    static final int PATH_INTERNAL = HdmiDeviceInfo.PATH_INTERNAL;
 
     // Send result codes. It should be consistent with hdmi_cec.h's send_message error code.
     static final int SEND_RESULT_SUCCESS = 0;
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
index 6023354..a209cd0 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
@@ -90,10 +90,9 @@
     }
 
     private void sendSystemAudioModeRequestInternal() {
-        int avrPhysicalAddress = tv().getAvrDeviceInfo().getPhysicalAddress();
         HdmiCecMessage command = HdmiCecMessageBuilder.buildSystemAudioModeRequest(
                 getSourceAddress(),
-                mAvrLogicalAddress, avrPhysicalAddress, mTargetAudioStatus);
+                mAvrLogicalAddress, getSystemAudioModeRequestParam(), mTargetAudioStatus);
         sendCommand(command, new HdmiControlService.SendMessageCallback() {
             @Override
             public void onSendCompleted(int error) {
@@ -108,6 +107,20 @@
         addTimer(mState, mTargetAudioStatus ? ON_TIMEOUT_MS : OFF_TIMEOUT_MS);
     }
 
+    private int getSystemAudioModeRequestParam() {
+        // <System Audio Mode Request> takes the physical address of the source device
+        // as a parameter. Get it from following candidates, in the order listed below:
+        // 1) physical address of the active source
+        // 2) active routing path
+        // 3) physical address of TV
+        if (tv().getActiveSource().isValid()) {
+            return tv().getActiveSource().physicalAddress;
+        }
+        int param = tv().getActivePath();
+        return param != Constants.INVALID_PHYSICAL_ADDRESS
+                ? param : Constants.PATH_INTERNAL;
+    }
+
     private void handleSendSystemAudioModeRequestTimeout() {
         if (!mTargetAudioStatus  // Don't retry for Off case.
                 || mSendRetryCount++ >= MAX_SEND_RETRY_COUNT) {