Fix issue with internal Active Source state tracking
Only set the internal Active Source device after the <Active Source> message has been sent. This prevents an issue where the internal state of a Source device gets set with an incorrect logical address while address allocation is still in progress. This should in turn resolve issues with source devices not sending Standby messages as they might believe they are not active source (due to invalid LA). Bug: 158441116 Test: atest HdmiCecLocalDevicePlaybackTest Change-Id: Ibd78925a8bdc826341068c89e7f621f58dd41933
This commit is contained in:
@@ -39,15 +39,19 @@ public class ActiveSourceAction extends HdmiCecFeatureAction {
|
||||
@Override
|
||||
boolean start() {
|
||||
mState = STATE_STARTED;
|
||||
sendCommand(HdmiCecMessageBuilder.buildActiveSource(getSourceAddress(),
|
||||
source().mService.getPhysicalAddress()));
|
||||
int logicalAddress = getSourceAddress();
|
||||
int physicalAddress = getSourcePath();
|
||||
|
||||
sendCommand(HdmiCecMessageBuilder.buildActiveSource(logicalAddress, physicalAddress));
|
||||
|
||||
if (source().getType() == HdmiDeviceInfo.DEVICE_PLAYBACK) {
|
||||
// Reports menu-status active to receive <User Control Pressed>.
|
||||
sendCommand(
|
||||
HdmiCecMessageBuilder.buildReportMenuStatus(getSourceAddress(), mDestination,
|
||||
HdmiCecMessageBuilder.buildReportMenuStatus(logicalAddress, mDestination,
|
||||
Constants.MENU_STATE_ACTIVATED));
|
||||
}
|
||||
|
||||
source().setActiveSource(logicalAddress, physicalAddress);
|
||||
mState = STATE_FINISHED;
|
||||
finish();
|
||||
return true;
|
||||
|
||||
@@ -3244,7 +3244,6 @@ public class HdmiControlService extends SystemService {
|
||||
playback.setIsActiveSource(true);
|
||||
playback.wakeUpIfActiveSource();
|
||||
playback.maySendActiveSource(source);
|
||||
setActiveSource(playback.mAddress, physicalAddress);
|
||||
}
|
||||
|
||||
if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) {
|
||||
@@ -3255,7 +3254,6 @@ public class HdmiControlService extends SystemService {
|
||||
audioSystem.setIsActiveSource(true);
|
||||
audioSystem.wakeUpIfActiveSource();
|
||||
audioSystem.maySendActiveSource(source);
|
||||
setActiveSource(audioSystem.mAddress, physicalAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3278,13 +3276,11 @@ public class HdmiControlService extends SystemService {
|
||||
if (audioSystem != null) {
|
||||
audioSystem.setIsActiveSource(false);
|
||||
}
|
||||
setActiveSource(playback.mAddress, physicalAddress);
|
||||
} else {
|
||||
if (audioSystem != null) {
|
||||
audioSystem.setIsActiveSource(true);
|
||||
audioSystem.wakeUpIfActiveSource();
|
||||
audioSystem.maySendActiveSource(sourceAddress);
|
||||
setActiveSource(audioSystem.mAddress, physicalAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,6 +143,26 @@ public class ActiveSourceActionTest {
|
||||
assertThat(mNativeWrapper.getResultMessages()).contains(menuStatus);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void playbackDevice_updatesActiveSourceState() {
|
||||
HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback(
|
||||
mHdmiControlService);
|
||||
playbackDevice.init();
|
||||
mLocalDevices.add(playbackDevice);
|
||||
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
|
||||
mTestLooper.dispatchAll();
|
||||
|
||||
HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction(
|
||||
playbackDevice, ADDR_TV);
|
||||
playbackDevice.addAndStartAction(action);
|
||||
mTestLooper.dispatchAll();
|
||||
|
||||
assertThat(playbackDevice.getActiveSource().logicalAddress).isEqualTo(
|
||||
playbackDevice.mAddress);
|
||||
assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress);
|
||||
assertThat(playbackDevice.mIsActiveSource).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void audioDevice_sendsActiveSource_noMenuStatus() {
|
||||
HdmiCecLocalDeviceAudioSystem audioDevice = new HdmiCecLocalDeviceAudioSystem(
|
||||
|
||||
@@ -526,4 +526,19 @@ public class HdmiCecLocalDevicePlaybackTest {
|
||||
|
||||
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleSetStreamPath_afterHotplug_hasCorrectActiveSource() {
|
||||
mHdmiControlService.onHotplug(1, false);
|
||||
mHdmiControlService.onHotplug(1, true);
|
||||
|
||||
HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
|
||||
mPlaybackPhysicalAddress);
|
||||
mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
|
||||
mTestLooper.dispatchAll();
|
||||
|
||||
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
|
||||
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress());
|
||||
assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user