Loading media/libaudioclient/tests/audio_test_utils.cpp +49 −16 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #define LOG_TAG "AudioTestUtils" #include <android-base/file.h> #include <android/content/pm/IPackageManagerNative.h> #include <binder/IServiceManager.h> #include <system/audio_config.h> #include <utils/Log.h> Loading Loading @@ -641,6 +643,28 @@ uint32_t AudioCapture::waitAndGetReceivedCbMarkerCount() const { return mReceivedCbMarkerCount.value_or(0); } status_t isAutomotivePlatform(bool* isAutomotive) { const sp<IServiceManager> sm = defaultServiceManager(); if (sm == nullptr) { ALOGE("%s: failed to retrieve defaultServiceManager", __func__); return NO_INIT; } sp<IBinder> binder = sm->checkService(String16{"package_native"}); if (binder == nullptr) { ALOGE("%s: failed to retrieve native package manager", __func__); return NO_INIT; } *isAutomotive = false; const auto pm = interface_cast<content::pm::IPackageManagerNative>(binder); if (pm != nullptr) { const auto status = pm->hasSystemFeature(String16("android.hardware.type.automotive"), 0, isAutomotive); return status.isOk() ? OK : status.transactionError(); } ALOGE("%s: failed to cast to IPackageManagerNative", __func__); return NO_INIT; } status_t listAudioPorts(std::vector<audio_port_v7>& portsVec) { int attempts = 5; status_t status; Loading Loading @@ -670,34 +694,43 @@ status_t listAudioPorts(std::vector<audio_port_v7>& portsVec) { return status; } status_t getPortById(const audio_port_handle_t portId, audio_port_v7& port) { namespace { using PortPredicate = std::function<bool(const struct audio_port_v7& port)>; status_t getPort(PortPredicate pred, audio_port_v7& port) { std::vector<struct audio_port_v7> ports; status_t status = listAudioPorts(ports); if (status != OK) return status; for (auto i = 0; i < ports.size(); i++) { if (ports[i].id == portId) { port = ports[i]; for (const auto& p : ports) { if (pred(p)) { port = p; return OK; } } return BAD_VALUE; } } // namespace status_t getAnyPort(audio_port_role_t role, audio_port_type_t type, audio_port_v7& port) { return getPort([&](const struct audio_port_v7& p) { return p.role == role && p.type == type; }, port); } status_t getPortById(const audio_port_handle_t portId, audio_port_v7& port) { return getPort([&](const struct audio_port_v7& p) { return p.id == portId; }, port); } status_t getPortByAttributes(audio_port_role_t role, audio_port_type_t type, audio_devices_t deviceType, const std::string& address, audio_port_v7& port) { std::vector<struct audio_port_v7> ports; status_t status = listAudioPorts(ports); if (status != OK) return status; for (auto i = 0; i < ports.size(); i++) { if (ports[i].role == role && ports[i].type == type && ports[i].ext.device.type == deviceType && !strncmp(ports[i].ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN)) { port = ports[i]; return OK; } } return BAD_VALUE; return getPort( [&](const struct audio_port_v7& p) { return p.role == role && p.type == type && p.ext.device.type == deviceType && !strncmp(p.ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN); }, port); } status_t listAudioPatches(std::vector<struct audio_patch>& patchesVec) { Loading media/libaudioclient/tests/audio_test_utils.h +2 −0 Original line number Diff line number Diff line Loading @@ -45,8 +45,10 @@ struct Route { std::string sink; }; status_t isAutomotivePlatform(bool* isAutomotive); status_t listAudioPorts(std::vector<audio_port_v7>& portsVec); status_t listAudioPatches(std::vector<struct audio_patch>& patchesVec); status_t getAnyPort(audio_port_role_t role, audio_port_type_t type, audio_port_v7& port); status_t getPortByAttributes(audio_port_role_t role, audio_port_type_t type, audio_devices_t deviceType, const std::string& address, audio_port_v7& port); Loading media/libaudioclient/tests/audiorouting_tests.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,11 @@ public: }; TEST_P(AudioTrackTest, DefaultRoutingTest) { bool isAutomotive; ASSERT_EQ(OK, isAutomotivePlatform(&isAutomotive)); if (isAutomotive) { GTEST_SKIP() << "auto uses its own policy for routing"; } audio_port_v7 port; if (OK != getPortByAttributes(AUDIO_PORT_ROLE_SOURCE, AUDIO_PORT_TYPE_DEVICE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", port)) { Loading Loading @@ -154,6 +159,11 @@ INSTANTIATE_TEST_SUITE_P( class AudioRoutingTest : public ::testing::Test { public: void SetUp() override { bool isAutomotive; ASSERT_EQ(OK, isAutomotivePlatform(&isAutomotive)); if (isAutomotive) { GTEST_SKIP() << "auto uses its own policy for routing"; } audio_port_v7 port; if (OK != getPortByAttributes(AUDIO_PORT_ROLE_SOURCE, AUDIO_PORT_TYPE_DEVICE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", port)) { Loading media/libaudioclient/tests/audiosystem_tests.cpp +16 −10 Original line number Diff line number Diff line Loading @@ -562,12 +562,15 @@ TEST_F(AudioSystemTest, UidDeviceAffinities) { AudioDeviceTypeAddrVector inputDevices = {inputDevice}; EXPECT_EQ(BAD_VALUE, AudioSystem::setUidDeviceAffinities(uid, inputDevices)); audio_port_v7 port; if (OK == getAnyPort(AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, port)) { // Test valid device for example audio_is_output_device AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, ""); AudioDeviceTypeAddr outputDevice(port.ext.device.type, port.ext.device.address); AudioDeviceTypeAddrVector outputDevices = {outputDevice}; EXPECT_EQ(NO_ERROR, AudioSystem::setUidDeviceAffinities(uid, outputDevices)); EXPECT_EQ(NO_ERROR, AudioSystem::removeUidDeviceAffinities(uid)); } } TEST_F(AudioSystemTest, UserIdDeviceAffinities) { int userId = 200; Loading @@ -577,12 +580,15 @@ TEST_F(AudioSystemTest, UserIdDeviceAffinities) { AudioDeviceTypeAddrVector inputDevices = {inputDevice}; EXPECT_EQ(BAD_VALUE, AudioSystem::setUserIdDeviceAffinities(userId, inputDevices)); // Test valid device for ezample audio_is_output_device AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, ""); audio_port_v7 port; if (OK == getAnyPort(AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, port)) { // Test valid device for example audio_is_output_device AudioDeviceTypeAddr outputDevice(port.ext.device.type, port.ext.device.address); AudioDeviceTypeAddrVector outputDevices = {outputDevice}; EXPECT_EQ(NO_ERROR, AudioSystem::setUserIdDeviceAffinities(userId, outputDevices)); EXPECT_EQ(NO_ERROR, AudioSystem::removeUserIdDeviceAffinities(userId)); } } namespace { Loading Loading
media/libaudioclient/tests/audio_test_utils.cpp +49 −16 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #define LOG_TAG "AudioTestUtils" #include <android-base/file.h> #include <android/content/pm/IPackageManagerNative.h> #include <binder/IServiceManager.h> #include <system/audio_config.h> #include <utils/Log.h> Loading Loading @@ -641,6 +643,28 @@ uint32_t AudioCapture::waitAndGetReceivedCbMarkerCount() const { return mReceivedCbMarkerCount.value_or(0); } status_t isAutomotivePlatform(bool* isAutomotive) { const sp<IServiceManager> sm = defaultServiceManager(); if (sm == nullptr) { ALOGE("%s: failed to retrieve defaultServiceManager", __func__); return NO_INIT; } sp<IBinder> binder = sm->checkService(String16{"package_native"}); if (binder == nullptr) { ALOGE("%s: failed to retrieve native package manager", __func__); return NO_INIT; } *isAutomotive = false; const auto pm = interface_cast<content::pm::IPackageManagerNative>(binder); if (pm != nullptr) { const auto status = pm->hasSystemFeature(String16("android.hardware.type.automotive"), 0, isAutomotive); return status.isOk() ? OK : status.transactionError(); } ALOGE("%s: failed to cast to IPackageManagerNative", __func__); return NO_INIT; } status_t listAudioPorts(std::vector<audio_port_v7>& portsVec) { int attempts = 5; status_t status; Loading Loading @@ -670,34 +694,43 @@ status_t listAudioPorts(std::vector<audio_port_v7>& portsVec) { return status; } status_t getPortById(const audio_port_handle_t portId, audio_port_v7& port) { namespace { using PortPredicate = std::function<bool(const struct audio_port_v7& port)>; status_t getPort(PortPredicate pred, audio_port_v7& port) { std::vector<struct audio_port_v7> ports; status_t status = listAudioPorts(ports); if (status != OK) return status; for (auto i = 0; i < ports.size(); i++) { if (ports[i].id == portId) { port = ports[i]; for (const auto& p : ports) { if (pred(p)) { port = p; return OK; } } return BAD_VALUE; } } // namespace status_t getAnyPort(audio_port_role_t role, audio_port_type_t type, audio_port_v7& port) { return getPort([&](const struct audio_port_v7& p) { return p.role == role && p.type == type; }, port); } status_t getPortById(const audio_port_handle_t portId, audio_port_v7& port) { return getPort([&](const struct audio_port_v7& p) { return p.id == portId; }, port); } status_t getPortByAttributes(audio_port_role_t role, audio_port_type_t type, audio_devices_t deviceType, const std::string& address, audio_port_v7& port) { std::vector<struct audio_port_v7> ports; status_t status = listAudioPorts(ports); if (status != OK) return status; for (auto i = 0; i < ports.size(); i++) { if (ports[i].role == role && ports[i].type == type && ports[i].ext.device.type == deviceType && !strncmp(ports[i].ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN)) { port = ports[i]; return OK; } } return BAD_VALUE; return getPort( [&](const struct audio_port_v7& p) { return p.role == role && p.type == type && p.ext.device.type == deviceType && !strncmp(p.ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN); }, port); } status_t listAudioPatches(std::vector<struct audio_patch>& patchesVec) { Loading
media/libaudioclient/tests/audio_test_utils.h +2 −0 Original line number Diff line number Diff line Loading @@ -45,8 +45,10 @@ struct Route { std::string sink; }; status_t isAutomotivePlatform(bool* isAutomotive); status_t listAudioPorts(std::vector<audio_port_v7>& portsVec); status_t listAudioPatches(std::vector<struct audio_patch>& patchesVec); status_t getAnyPort(audio_port_role_t role, audio_port_type_t type, audio_port_v7& port); status_t getPortByAttributes(audio_port_role_t role, audio_port_type_t type, audio_devices_t deviceType, const std::string& address, audio_port_v7& port); Loading
media/libaudioclient/tests/audiorouting_tests.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,11 @@ public: }; TEST_P(AudioTrackTest, DefaultRoutingTest) { bool isAutomotive; ASSERT_EQ(OK, isAutomotivePlatform(&isAutomotive)); if (isAutomotive) { GTEST_SKIP() << "auto uses its own policy for routing"; } audio_port_v7 port; if (OK != getPortByAttributes(AUDIO_PORT_ROLE_SOURCE, AUDIO_PORT_TYPE_DEVICE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", port)) { Loading Loading @@ -154,6 +159,11 @@ INSTANTIATE_TEST_SUITE_P( class AudioRoutingTest : public ::testing::Test { public: void SetUp() override { bool isAutomotive; ASSERT_EQ(OK, isAutomotivePlatform(&isAutomotive)); if (isAutomotive) { GTEST_SKIP() << "auto uses its own policy for routing"; } audio_port_v7 port; if (OK != getPortByAttributes(AUDIO_PORT_ROLE_SOURCE, AUDIO_PORT_TYPE_DEVICE, AUDIO_DEVICE_IN_REMOTE_SUBMIX, "0", port)) { Loading
media/libaudioclient/tests/audiosystem_tests.cpp +16 −10 Original line number Diff line number Diff line Loading @@ -562,12 +562,15 @@ TEST_F(AudioSystemTest, UidDeviceAffinities) { AudioDeviceTypeAddrVector inputDevices = {inputDevice}; EXPECT_EQ(BAD_VALUE, AudioSystem::setUidDeviceAffinities(uid, inputDevices)); audio_port_v7 port; if (OK == getAnyPort(AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, port)) { // Test valid device for example audio_is_output_device AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, ""); AudioDeviceTypeAddr outputDevice(port.ext.device.type, port.ext.device.address); AudioDeviceTypeAddrVector outputDevices = {outputDevice}; EXPECT_EQ(NO_ERROR, AudioSystem::setUidDeviceAffinities(uid, outputDevices)); EXPECT_EQ(NO_ERROR, AudioSystem::removeUidDeviceAffinities(uid)); } } TEST_F(AudioSystemTest, UserIdDeviceAffinities) { int userId = 200; Loading @@ -577,12 +580,15 @@ TEST_F(AudioSystemTest, UserIdDeviceAffinities) { AudioDeviceTypeAddrVector inputDevices = {inputDevice}; EXPECT_EQ(BAD_VALUE, AudioSystem::setUserIdDeviceAffinities(userId, inputDevices)); // Test valid device for ezample audio_is_output_device AudioDeviceTypeAddr outputDevice(AUDIO_DEVICE_OUT_SPEAKER, ""); audio_port_v7 port; if (OK == getAnyPort(AUDIO_PORT_ROLE_SINK, AUDIO_PORT_TYPE_DEVICE, port)) { // Test valid device for example audio_is_output_device AudioDeviceTypeAddr outputDevice(port.ext.device.type, port.ext.device.address); AudioDeviceTypeAddrVector outputDevices = {outputDevice}; EXPECT_EQ(NO_ERROR, AudioSystem::setUserIdDeviceAffinities(userId, outputDevices)); EXPECT_EQ(NO_ERROR, AudioSystem::removeUserIdDeviceAffinities(userId)); } } namespace { Loading