Index: chromeos/audio/cras_audio_handler_unittest.cc |
diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc |
index 46e7d3e8e347a1b437a8de4740a44fd26ebda4df..fd6432dfd4780ce49f03bcd5eeb3fe2b75dc5392 100644 |
--- a/chromeos/audio/cras_audio_handler_unittest.cc |
+++ b/chromeos/audio/cras_audio_handler_unittest.cc |
@@ -45,6 +45,7 @@ const uint64_t kUSBCameraInputId = 90007; |
const AudioNode kInternalSpeaker( |
false, |
kInternalSpeakerId, |
+ kInternalSpeakerId, |
"Fake Speaker", |
"INTERNAL_SPEAKER", |
"Speaker", |
@@ -55,6 +56,7 @@ const AudioNode kInternalSpeaker( |
const AudioNode kHeadphone( |
false, |
kHeadphoneId, |
+ kHeadphoneId, |
"Fake Headphone", |
"HEADPHONE", |
"Headphone", |
@@ -65,6 +67,7 @@ const AudioNode kHeadphone( |
const AudioNode kInternalMic( |
true, |
kInternalMicId, |
+ kInternalMicId, |
"Fake Mic", |
"INTERNAL_MIC", |
"Internal Mic", |
@@ -75,6 +78,7 @@ const AudioNode kInternalMic( |
const AudioNode kMicJack( |
true, |
kMicJackId, |
+ kMicJackId, |
"Fake Mic Jack", |
"MIC", |
"Mic Jack", |
@@ -85,6 +89,7 @@ const AudioNode kMicJack( |
const AudioNode kUSBMic( |
true, |
kUSBMicId, |
+ kUSBMicId, |
"Fake USB Mic", |
"USB", |
"USB Microphone", |
@@ -95,6 +100,7 @@ const AudioNode kUSBMic( |
const AudioNode kKeyboardMic( |
true, |
kKeyboardMicId, |
+ kKeyboardMicId, |
"Fake Keyboard Mic", |
"KEYBOARD_MIC", |
"Keyboard Mic", |
@@ -105,6 +111,7 @@ const AudioNode kKeyboardMic( |
const AudioNode kOtherTypeOutput( |
false, |
kOtherTypeOutputId, |
+ kOtherTypeOutputId, |
"Output Device", |
"SOME_OTHER_TYPE", |
"Other Type Output Device", |
@@ -115,6 +122,7 @@ const AudioNode kOtherTypeOutput( |
const AudioNode kOtherTypeInput( |
true, |
kOtherTypeInputId, |
+ kOtherTypeInputId, |
"Input Device", |
"SOME_OTHER_TYPE", |
"Other Type Input Device", |
@@ -124,6 +132,7 @@ const AudioNode kOtherTypeInput( |
const AudioNode kBluetoothHeadset(false, |
kBluetoothHeadsetId, |
+ kBluetoothHeadsetId, |
"Bluetooth Headset", |
"BLUETOOTH", |
"Bluetooth Headset 1", |
@@ -132,6 +141,7 @@ const AudioNode kBluetoothHeadset(false, |
const AudioNode kHDMIOutput(false, |
kHDMIOutputId, |
+ kHDMIOutputId, |
"HDMI output", |
"HDMI", |
"HDMI output", |
@@ -140,6 +150,7 @@ const AudioNode kHDMIOutput(false, |
const AudioNode kUSBHeadphone1(false, |
kUSBHeadphoneId1, |
+ kUSBHeadphoneId1, |
"USB Headphone", |
"USB", |
"USB Headphone 1", |
@@ -148,6 +159,7 @@ const AudioNode kUSBHeadphone1(false, |
const AudioNode kUSBHeadphone2(false, |
kUSBHeadphoneId2, |
+ kUSBHeadphoneId2, |
"USB Headphone", |
"USB", |
"USB Headphone 1", |
@@ -156,6 +168,7 @@ const AudioNode kUSBHeadphone2(false, |
const AudioNode kUSBJabraSpeakerOutput1(false, |
kUSBJabraSpeakerOutputId1, |
+ kUSBJabraSpeakerOutputId1, |
"Jabra Speaker 1", |
"USB", |
"Jabra Speaker 1", |
@@ -164,6 +177,7 @@ const AudioNode kUSBJabraSpeakerOutput1(false, |
const AudioNode kUSBJabraSpeakerOutput2(false, |
kUSBJabraSpeakerOutputId2, |
+ kUSBJabraSpeakerOutputId2, |
"Jabra Speaker 2", |
"USB", |
"Jabra Speaker 2", |
@@ -172,6 +186,7 @@ const AudioNode kUSBJabraSpeakerOutput2(false, |
const AudioNode kUSBJabraSpeakerInput1(true, |
kUSBJabraSpeakerInputId1, |
+ kUSBJabraSpeakerInputId1, |
"Jabra Speaker 1", |
"USB", |
"Jabra Speaker", |
@@ -180,6 +195,7 @@ const AudioNode kUSBJabraSpeakerInput1(true, |
const AudioNode kUSBJabraSpeakerInput2(true, |
kUSBJabraSpeakerInputId2, |
+ kUSBJabraSpeakerInputId2, |
"Jabra Speaker 2", |
"USB", |
"Jabra Speaker 2", |
@@ -188,6 +204,7 @@ const AudioNode kUSBJabraSpeakerInput2(true, |
const AudioNode kUSBCameraInput(true, |
kUSBCameraInputId, |
+ kUSBCameraInputId, |
"USB Camera", |
"USB", |
"USB Camera", |
@@ -2043,6 +2060,86 @@ TEST_F(CrasAudioHandlerTest, HandleOtherDeviceType) { |
EXPECT_TRUE(cras_audio_handler_->has_alternative_input()); |
} |
+TEST_F(CrasAudioHandlerTest, ActiveDeviceSelectionWithStableDeviceId) { |
+ AudioNodeList audio_nodes; |
+ AudioNode internal_speaker(kInternalSpeaker); |
+ audio_nodes.push_back(internal_speaker); |
+ AudioNode usb_headset(kUSBHeadphone1); |
+ usb_headset.plugged_time = 80000000; |
+ audio_nodes.push_back(usb_headset); |
+ SetUpCrasAudioHandler(audio_nodes); |
+ |
+ // Verify the audio devices size. |
+ AudioDeviceList audio_devices; |
+ cras_audio_handler_->GetAudioDevices(&audio_devices); |
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size()); |
+ |
+ // Initially active node is selected base on priority, so USB headphone |
+ // is selected. |
+ EXPECT_EQ(kUSBHeadphone1.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ // Change the active device to internal speaker, now USB headphone becomes |
+ // inactive. |
+ AudioDevice speaker(kInternalSpeaker); |
+ cras_audio_handler_->SwitchToDevice(speaker, true); |
+ EXPECT_NE(kUSBHeadphone1.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ // Unplug USB headset. |
+ audio_nodes.clear(); |
+ internal_speaker.active = true; |
+ audio_nodes.push_back(internal_speaker); |
+ ChangeAudioNodes(audio_nodes); |
+ EXPECT_EQ(kInternalSpeaker.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ // Plug the same USB headset back, id is different, but stable_device_id |
+ // remains the same. |
+ usb_headset.active = false; |
+ usb_headset.id = 98765; |
+ audio_nodes.push_back(usb_headset); |
+ ChangeAudioNodes(audio_nodes); |
+ |
+ // Since USB headset was inactive before it was unplugged, it won't be |
+ // selected as active after it's plugged in again. |
+ EXPECT_EQ(kInternalSpeaker.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ // Plug the second USB headset. |
+ AudioNode usb_headset2(kUSBHeadphone2); |
+ usb_headset2.plugged_time = 80000001; |
+ audio_nodes.push_back(usb_headset2); |
+ ChangeAudioNodes(audio_nodes); |
+ |
+ // Since the second USB device is new, it's selected as the active device |
+ // by its priority. |
+ EXPECT_EQ(kUSBHeadphone2.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ // Unplug the second USB headset. |
+ audio_nodes.clear(); |
+ internal_speaker.active = false; |
+ audio_nodes.push_back(internal_speaker); |
+ audio_nodes.push_back(usb_headset); |
+ ChangeAudioNodes(audio_nodes); |
+ |
+ // There is no active node after USB2 unplugged, the 1st USB got selected |
+ // by its priority. |
+ EXPECT_EQ(usb_headset.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+ |
+ usb_headset2.active = false; |
+ usb_headset2.plugged_time = 80000002; |
+ audio_nodes.push_back(usb_headset2); |
+ ChangeAudioNodes(audio_nodes); |
+ |
+ // Plug the second USB again. Since it was the active node before it got |
+ // unplugged, it is now selected as the active node. |
+ EXPECT_EQ(usb_headset2.id, |
+ cras_audio_handler_->GetPrimaryActiveOutputNode()); |
+} |
+ |
TEST_F(CrasAudioHandlerTest, ChangeActiveNodesHotrodInit) { |
AudioNodeList audio_nodes; |
audio_nodes.push_back(kHDMIOutput); |