|
|
|
@ -80,6 +80,12 @@ class AudioPolicyManagerTestClient : public AudioPolicyTestClient {
|
|
|
|
|
return NO_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
audio_io_handle_t openDuplicateOutput(audio_io_handle_t /*output1*/,
|
|
|
|
|
audio_io_handle_t /*output2*/) override {
|
|
|
|
|
audio_io_handle_t id = mNextIoHandle++;
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t openInput(audio_module_handle_t module,
|
|
|
|
|
audio_io_handle_t* input,
|
|
|
|
|
audio_config_t* /*config*/,
|
|
|
|
@ -1035,3 +1041,101 @@ INSTANTIATE_TEST_CASE_P(
|
|
|
|
|
AUDIO_SOURCE_HOTWORD, 0, "addr=remote_submix_media"}
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
using DeviceConnectionTestParams =
|
|
|
|
|
std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
|
|
|
|
|
|
|
|
|
|
class AudioPolicyManagerTestDeviceConnection : public AudioPolicyManagerTestWithConfigurationFile,
|
|
|
|
|
public testing::WithParamInterface<DeviceConnectionTestParams> {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(AudioPolicyManagerTestDeviceConnection, InitSuccess) {
|
|
|
|
|
// SetUp must finish with no assertions.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(AudioPolicyManagerTestDeviceConnection, Dump) {
|
|
|
|
|
dumpToLog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_P(AudioPolicyManagerTestDeviceConnection, SetDeviceConnectionState) {
|
|
|
|
|
const audio_devices_t type = std::get<0>(GetParam());
|
|
|
|
|
const std::string name = std::get<1>(GetParam());
|
|
|
|
|
const std::string address = std::get<2>(GetParam());
|
|
|
|
|
|
|
|
|
|
if (type == AUDIO_DEVICE_OUT_HDMI) {
|
|
|
|
|
// Set device connection state failed due to no device descriptor found
|
|
|
|
|
// For HDMI case, it is easier to simulate device descriptor not found error
|
|
|
|
|
// by using a undeclared encoded format.
|
|
|
|
|
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_MAT_2_1));
|
|
|
|
|
}
|
|
|
|
|
// Connect with valid parameters should succeed
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
// Try to connect with the same device again should fail
|
|
|
|
|
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
// Disconnect the connected device should succeed
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
// Disconnect device that is not connected should fail
|
|
|
|
|
ASSERT_EQ(INVALID_OPERATION, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
// Try to set device connection state with a invalid connection state should fail
|
|
|
|
|
ASSERT_EQ(BAD_VALUE, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_CNT,
|
|
|
|
|
"", "", AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) {
|
|
|
|
|
const audio_devices_t type = std::get<0>(GetParam());
|
|
|
|
|
const std::string name = std::get<1>(GetParam());
|
|
|
|
|
const std::string address = std::get<2>(GetParam());
|
|
|
|
|
|
|
|
|
|
// Connect device to do explicitly routing test
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
|
|
|
|
|
audio_port devicePort;
|
|
|
|
|
const audio_port_role_t role = audio_is_output_device(type)
|
|
|
|
|
? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
|
|
|
|
|
findDevicePort(role, type, address, devicePort);
|
|
|
|
|
|
|
|
|
|
audio_port_handle_t routedPortId = devicePort.id;
|
|
|
|
|
audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
|
|
|
|
|
// Try start input or output according to the device type
|
|
|
|
|
if (audio_is_output_devices(type)) {
|
|
|
|
|
getOutputForAttr(&routedPortId, AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
|
|
|
|
|
48000 /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE, &portId);
|
|
|
|
|
} else if (audio_is_input_device(type)) {
|
|
|
|
|
RecordingActivityTracker tracker;
|
|
|
|
|
getInputForAttr({}, tracker.getRiid(), &routedPortId, AUDIO_FORMAT_PCM_16_BIT,
|
|
|
|
|
AUDIO_CHANNEL_IN_STEREO, 48000 /*sampleRate*/, AUDIO_INPUT_FLAG_NONE, &portId);
|
|
|
|
|
}
|
|
|
|
|
ASSERT_EQ(devicePort.id, routedPortId);
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->setDeviceConnectionState(
|
|
|
|
|
type, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
|
|
|
|
|
address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
|
DeviceConnectionState,
|
|
|
|
|
AudioPolicyManagerTestDeviceConnection,
|
|
|
|
|
testing::Values(
|
|
|
|
|
DeviceConnectionTestParams({AUDIO_DEVICE_IN_HDMI, "test_in_hdmi",
|
|
|
|
|
"audio_policy_test_in_hdmi"}),
|
|
|
|
|
DeviceConnectionTestParams({AUDIO_DEVICE_OUT_HDMI, "test_out_hdmi",
|
|
|
|
|
"audio_policy_test_out_hdmi"}),
|
|
|
|
|
DeviceConnectionTestParams({AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, "bt_hfp_in",
|
|
|
|
|
"hfp_client_in"}),
|
|
|
|
|
DeviceConnectionTestParams({AUDIO_DEVICE_OUT_BLUETOOTH_SCO, "bt_hfp_out",
|
|
|
|
|
"hfp_client_out"})
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|