|
|
|
@ -104,8 +104,10 @@ class AudioPolicyManagerTest : public testing::Test {
|
|
|
|
|
audio_port_handle_t *portId = nullptr);
|
|
|
|
|
PatchCountCheck snapshotPatchCount() { return PatchCountCheck(mClient.get()); }
|
|
|
|
|
|
|
|
|
|
void findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
|
|
|
|
|
const std::string &address, audio_port &foundPort);
|
|
|
|
|
// Tries to find a device port. If 'foundPort' isn't nullptr,
|
|
|
|
|
// will generate a failure if the port hasn't been found.
|
|
|
|
|
bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
|
|
|
|
|
const std::string &address, audio_port *foundPort);
|
|
|
|
|
static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch* patch);
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<AudioPolicyManagerTestClient> mClient;
|
|
|
|
@ -211,30 +213,36 @@ void AudioPolicyManagerTest::getInputForAttr(
|
|
|
|
|
ASSERT_NE(AUDIO_PORT_HANDLE_NONE, *portId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
|
|
|
|
|
audio_devices_t deviceType, const std::string &address, audio_port &foundPort) {
|
|
|
|
|
bool AudioPolicyManagerTest::findDevicePort(audio_port_role_t role,
|
|
|
|
|
audio_devices_t deviceType, const std::string &address, audio_port *foundPort) {
|
|
|
|
|
uint32_t numPorts = 0;
|
|
|
|
|
uint32_t generation1;
|
|
|
|
|
status_t ret;
|
|
|
|
|
|
|
|
|
|
ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
|
|
|
|
|
ASSERT_EQ(NO_ERROR, ret);
|
|
|
|
|
EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
|
|
|
|
|
if (HasFailure()) return false;
|
|
|
|
|
|
|
|
|
|
uint32_t generation2;
|
|
|
|
|
struct audio_port ports[numPorts];
|
|
|
|
|
ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation2);
|
|
|
|
|
ASSERT_EQ(NO_ERROR, ret);
|
|
|
|
|
ASSERT_EQ(generation1, generation2);
|
|
|
|
|
EXPECT_EQ(NO_ERROR, ret) << "mManager->listAudioPorts returned error";
|
|
|
|
|
EXPECT_EQ(generation1, generation2) << "Generations changed during ports retrieval";
|
|
|
|
|
if (HasFailure()) return false;
|
|
|
|
|
|
|
|
|
|
for (const auto &port : ports) {
|
|
|
|
|
if (port.role == role && port.ext.device.type == deviceType &&
|
|
|
|
|
(strncmp(port.ext.device.address, address.c_str(),
|
|
|
|
|
AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0)) {
|
|
|
|
|
foundPort = port;
|
|
|
|
|
return;
|
|
|
|
|
if (foundPort) *foundPort = port;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
GTEST_FAIL() << "Device port with role " << role << " and address " << address << "not found";
|
|
|
|
|
if (foundPort) {
|
|
|
|
|
ADD_FAILURE() << "Device port with role " << role << " and address "
|
|
|
|
|
<< address << " not found";
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
audio_port_handle_t AudioPolicyManagerTest::getDeviceIdFromPatch(
|
|
|
|
@ -694,8 +702,8 @@ void AudioPolicyManagerTestDPPlaybackReRouting::SetUp() {
|
|
|
|
|
ASSERT_EQ(NO_ERROR, ret);
|
|
|
|
|
|
|
|
|
|
struct audio_port extractionPort;
|
|
|
|
|
findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, extractionPort);
|
|
|
|
|
ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, &extractionPort));
|
|
|
|
|
|
|
|
|
|
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
|
|
|
|
|
audio_source_t source = AUDIO_SOURCE_REMOTE_SUBMIX;
|
|
|
|
@ -707,8 +715,8 @@ void AudioPolicyManagerTestDPPlaybackReRouting::SetUp() {
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->startInput(mPortId));
|
|
|
|
|
ASSERT_EQ(extractionPort.id, selectedDeviceId);
|
|
|
|
|
|
|
|
|
|
findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, mInjectionPort);
|
|
|
|
|
ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, &mInjectionPort));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AudioPolicyManagerTestDPPlaybackReRouting::TearDown() {
|
|
|
|
@ -879,8 +887,8 @@ void AudioPolicyManagerTestDPMixRecordInjection::SetUp() {
|
|
|
|
|
ASSERT_EQ(NO_ERROR, ret);
|
|
|
|
|
|
|
|
|
|
struct audio_port injectionPort;
|
|
|
|
|
findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, injectionPort);
|
|
|
|
|
ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SINK, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, &injectionPort));
|
|
|
|
|
|
|
|
|
|
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
|
|
|
|
|
audio_usage_t usage = AUDIO_USAGE_VIRTUAL_SOURCE;
|
|
|
|
@ -892,8 +900,8 @@ void AudioPolicyManagerTestDPMixRecordInjection::SetUp() {
|
|
|
|
|
ASSERT_EQ(NO_ERROR, mManager->startOutput(mPortId));
|
|
|
|
|
ASSERT_EQ(injectionPort.id, getDeviceIdFromPatch(mClient->getLastAddedPatch()));
|
|
|
|
|
|
|
|
|
|
findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, mExtractionPort);
|
|
|
|
|
ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX,
|
|
|
|
|
mMixAddress, &mExtractionPort));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AudioPolicyManagerTestDPMixRecordInjection::TearDown() {
|
|
|
|
@ -1028,7 +1036,7 @@ TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection)
|
|
|
|
|
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);
|
|
|
|
|
ASSERT_TRUE(findDevicePort(role, type, address, &devicePort));
|
|
|
|
|
|
|
|
|
|
audio_port_handle_t routedPortId = devicePort.id;
|
|
|
|
|
// Try start input or output according to the device type
|
|
|
|
@ -1162,3 +1170,21 @@ TEST_F(AudioPolicyManagerDynamicHwModulesTest, AddedDeviceAvailable) {
|
|
|
|
|
ASSERT_EQ(AUDIO_POLICY_DEVICE_STATE_AVAILABLE, mManager->getDeviceConnectionState(
|
|
|
|
|
AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(AudioPolicyManagerDynamicHwModulesTest, ListAddedAudioPorts) {
|
|
|
|
|
ASSERT_FALSE(
|
|
|
|
|
findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", nullptr));
|
|
|
|
|
mClient->swapAllowedModuleNames({"primary", "r_submix"});
|
|
|
|
|
mManager->onNewAudioModulesAvailable();
|
|
|
|
|
struct audio_port port;
|
|
|
|
|
ASSERT_TRUE(findDevicePort(AUDIO_PORT_ROLE_SOURCE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", &port));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(AudioPolicyManagerDynamicHwModulesTest, ClientIsUpdated) {
|
|
|
|
|
const size_t prevAudioPortListUpdateCount = mClient->getAudioPortListUpdateCount();
|
|
|
|
|
const uint32_t prevAudioPortGeneration = mManager->getAudioPortGeneration();
|
|
|
|
|
mClient->swapAllowedModuleNames({"primary", "r_submix"});
|
|
|
|
|
mManager->onNewAudioModulesAvailable();
|
|
|
|
|
EXPECT_GT(mClient->getAudioPortListUpdateCount(), prevAudioPortListUpdateCount);
|
|
|
|
|
EXPECT_GT(mManager->getAudioPortGeneration(), prevAudioPortGeneration);
|
|
|
|
|
}
|
|
|
|
|