Loading media/libaudiofoundation/include/media/AudioPort.h +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public: AudioProfileVector &getAudioProfiles() { return mProfiles; } void setExtraAudioDescriptors( const std::vector<media::audio::common::ExtraAudioDescriptor> extraAudioDescriptors) { const std::vector<media::audio::common::ExtraAudioDescriptor>& extraAudioDescriptors) { mExtraAudioDescriptors = extraAudioDescriptors; } std::vector<media::audio::common::ExtraAudioDescriptor> &getExtraAudioDescriptors() { Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -140,8 +140,6 @@ void AudioPolicyManager::broadcastDeviceConnectionState(const sp<DeviceDescripto status_t AudioPolicyManager::setDeviceConnectionStateInt( audio_policy_dev_state_t state, const android::media::audio::common::AudioPort& port, audio_format_t encodedFormat) { // TODO: b/211601178 Forward 'port' to Audio HAL via mHwModules. For now, only device_type, // device_address and device_name are forwarded. if (port.ext.getTag() != AudioPortExt::device) { return BAD_VALUE; } Loading @@ -160,7 +158,13 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt( sp<DeviceDescriptor> device = mHwModules.getDeviceDescriptor( device_type, device_address.c_str(), device_name, encodedFormat, state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE); return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION; if (device == nullptr) { return INVALID_OPERATION; } if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) { device->setExtraAudioDescriptors(port.extraAudioDescriptors); } return setDeviceConnectionStateInt(device, state); } status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceType, Loading services/audiopolicy/tests/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ cc_test { ], static_libs: [ "android.media.audio.common.types-V1-cpp", "audioclient-types-aidl-cpp", "libaudiopolicycomponents", "libgmock", ], Loading services/audiopolicy/tests/AudioPolicyManagerTestClient.h +32 −2 Original line number Diff line number Diff line Loading @@ -103,8 +103,12 @@ public: ++mAudioPortListUpdateCount; } status_t setDeviceConnectedState( const struct audio_port_v7 *port __unused, bool connected __unused) override { status_t setDeviceConnectedState(const struct audio_port_v7 *port, bool connected) override { if (connected) { mConnectedDevicePorts.push_back(*port); } else { mDisconnectedDevicePorts.push_back(*port); } return NO_ERROR; } Loading Loading @@ -150,6 +154,30 @@ public: return NO_ERROR; } size_t getConnectedDevicePortCount() const { return mConnectedDevicePorts.size(); } const struct audio_port_v7 *getLastConnectedDevicePort() const { if (mConnectedDevicePorts.empty()) { return nullptr; } auto it = --mConnectedDevicePorts.end(); return &(*it); } size_t getDisconnectedDevicePortCount() const { return mDisconnectedDevicePorts.size(); } const struct audio_port_v7 *getLastDisconnectedDevicePort() const { if (mDisconnectedDevicePorts.empty()) { return nullptr; } auto it = --mDisconnectedDevicePorts.end(); return &(*it); } private: audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1; audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1; Loading @@ -158,6 +186,8 @@ private: std::set<std::string> mAllowedModuleNames; size_t mAudioPortListUpdateCount = 0; size_t mRoutingUpdatedUpdateCount = 0; std::vector<struct audio_port_v7> mConnectedDevicePorts; std::vector<struct audio_port_v7> mDisconnectedDevicePorts; }; } // namespace android services/audiopolicy/tests/audiopolicymanager_tests.cpp +39 −0 Original line number Diff line number Diff line Loading @@ -1700,6 +1700,45 @@ TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT)); } android::media::audio::common::ExtraAudioDescriptor make_ExtraAudioDescriptor( android::media::audio::common::AudioStandard audioStandard, android::media::audio::common::AudioEncapsulationType audioEncapsulationType) { android::media::audio::common::ExtraAudioDescriptor result; result.standard = audioStandard; result.audioDescriptor = {0xb4, 0xaf, 0x98, 0x1a}; result.encapsulationType = audioEncapsulationType; return result; } TEST_P(AudioPolicyManagerTestDeviceConnection, PassingExtraAudioDescriptors) { const audio_devices_t type = std::get<0>(GetParam()); if (!audio_device_is_digital(type)) { // EADs are used only for HDMI devices. GTEST_SKIP() << "Not a digital device type: " << audio_device_to_string(type); } const std::string name = std::get<1>(GetParam()); const std::string address = std::get<2>(GetParam()); android::media::AudioPort audioPort; ASSERT_EQ(NO_ERROR, mManager->deviceToAudioPort(type, address.c_str(), name.c_str(), &audioPort)); android::media::audio::common::AudioPort& port = audioPort.hal; port.extraAudioDescriptors.push_back(make_ExtraAudioDescriptor( android::media::audio::common::AudioStandard::EDID, android::media::audio::common::AudioEncapsulationType::IEC61937)); const size_t lastConnectedDevicePortCount = mClient->getConnectedDevicePortCount(); const size_t lastDisconnectedDevicePortCount = mClient->getDisconnectedDevicePortCount(); EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState( AUDIO_POLICY_DEVICE_STATE_AVAILABLE, port, AUDIO_FORMAT_DEFAULT)); EXPECT_EQ(lastConnectedDevicePortCount + 1, mClient->getConnectedDevicePortCount()); EXPECT_EQ(lastDisconnectedDevicePortCount, mClient->getDisconnectedDevicePortCount()); const audio_port_v7* devicePort = mClient->getLastConnectedDevicePort(); EXPECT_EQ(port.extraAudioDescriptors.size(), devicePort->num_extra_audio_descriptors); EXPECT_EQ(AUDIO_STANDARD_EDID, devicePort->extra_audio_descriptors[0].standard); EXPECT_EQ(AUDIO_ENCAPSULATION_TYPE_IEC61937, devicePort->extra_audio_descriptors[0].encapsulation_type); EXPECT_NE(0, devicePort->extra_audio_descriptors[0].descriptor[0]); } INSTANTIATE_TEST_CASE_P( DeviceConnectionState, AudioPolicyManagerTestDeviceConnection, Loading Loading
media/libaudiofoundation/include/media/AudioPort.h +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public: AudioProfileVector &getAudioProfiles() { return mProfiles; } void setExtraAudioDescriptors( const std::vector<media::audio::common::ExtraAudioDescriptor> extraAudioDescriptors) { const std::vector<media::audio::common::ExtraAudioDescriptor>& extraAudioDescriptors) { mExtraAudioDescriptors = extraAudioDescriptors; } std::vector<media::audio::common::ExtraAudioDescriptor> &getExtraAudioDescriptors() { Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -140,8 +140,6 @@ void AudioPolicyManager::broadcastDeviceConnectionState(const sp<DeviceDescripto status_t AudioPolicyManager::setDeviceConnectionStateInt( audio_policy_dev_state_t state, const android::media::audio::common::AudioPort& port, audio_format_t encodedFormat) { // TODO: b/211601178 Forward 'port' to Audio HAL via mHwModules. For now, only device_type, // device_address and device_name are forwarded. if (port.ext.getTag() != AudioPortExt::device) { return BAD_VALUE; } Loading @@ -160,7 +158,13 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt( sp<DeviceDescriptor> device = mHwModules.getDeviceDescriptor( device_type, device_address.c_str(), device_name, encodedFormat, state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE); return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION; if (device == nullptr) { return INVALID_OPERATION; } if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) { device->setExtraAudioDescriptors(port.extraAudioDescriptors); } return setDeviceConnectionStateInt(device, state); } status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceType, Loading
services/audiopolicy/tests/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ cc_test { ], static_libs: [ "android.media.audio.common.types-V1-cpp", "audioclient-types-aidl-cpp", "libaudiopolicycomponents", "libgmock", ], Loading
services/audiopolicy/tests/AudioPolicyManagerTestClient.h +32 −2 Original line number Diff line number Diff line Loading @@ -103,8 +103,12 @@ public: ++mAudioPortListUpdateCount; } status_t setDeviceConnectedState( const struct audio_port_v7 *port __unused, bool connected __unused) override { status_t setDeviceConnectedState(const struct audio_port_v7 *port, bool connected) override { if (connected) { mConnectedDevicePorts.push_back(*port); } else { mDisconnectedDevicePorts.push_back(*port); } return NO_ERROR; } Loading Loading @@ -150,6 +154,30 @@ public: return NO_ERROR; } size_t getConnectedDevicePortCount() const { return mConnectedDevicePorts.size(); } const struct audio_port_v7 *getLastConnectedDevicePort() const { if (mConnectedDevicePorts.empty()) { return nullptr; } auto it = --mConnectedDevicePorts.end(); return &(*it); } size_t getDisconnectedDevicePortCount() const { return mDisconnectedDevicePorts.size(); } const struct audio_port_v7 *getLastDisconnectedDevicePort() const { if (mDisconnectedDevicePorts.empty()) { return nullptr; } auto it = --mDisconnectedDevicePorts.end(); return &(*it); } private: audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1; audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1; Loading @@ -158,6 +186,8 @@ private: std::set<std::string> mAllowedModuleNames; size_t mAudioPortListUpdateCount = 0; size_t mRoutingUpdatedUpdateCount = 0; std::vector<struct audio_port_v7> mConnectedDevicePorts; std::vector<struct audio_port_v7> mDisconnectedDevicePorts; }; } // namespace android
services/audiopolicy/tests/audiopolicymanager_tests.cpp +39 −0 Original line number Diff line number Diff line Loading @@ -1700,6 +1700,45 @@ TEST_P(AudioPolicyManagerTestDeviceConnection, ExplicitlyRoutingAfterConnection) address.c_str(), name.c_str(), AUDIO_FORMAT_DEFAULT)); } android::media::audio::common::ExtraAudioDescriptor make_ExtraAudioDescriptor( android::media::audio::common::AudioStandard audioStandard, android::media::audio::common::AudioEncapsulationType audioEncapsulationType) { android::media::audio::common::ExtraAudioDescriptor result; result.standard = audioStandard; result.audioDescriptor = {0xb4, 0xaf, 0x98, 0x1a}; result.encapsulationType = audioEncapsulationType; return result; } TEST_P(AudioPolicyManagerTestDeviceConnection, PassingExtraAudioDescriptors) { const audio_devices_t type = std::get<0>(GetParam()); if (!audio_device_is_digital(type)) { // EADs are used only for HDMI devices. GTEST_SKIP() << "Not a digital device type: " << audio_device_to_string(type); } const std::string name = std::get<1>(GetParam()); const std::string address = std::get<2>(GetParam()); android::media::AudioPort audioPort; ASSERT_EQ(NO_ERROR, mManager->deviceToAudioPort(type, address.c_str(), name.c_str(), &audioPort)); android::media::audio::common::AudioPort& port = audioPort.hal; port.extraAudioDescriptors.push_back(make_ExtraAudioDescriptor( android::media::audio::common::AudioStandard::EDID, android::media::audio::common::AudioEncapsulationType::IEC61937)); const size_t lastConnectedDevicePortCount = mClient->getConnectedDevicePortCount(); const size_t lastDisconnectedDevicePortCount = mClient->getDisconnectedDevicePortCount(); EXPECT_EQ(NO_ERROR, mManager->setDeviceConnectionState( AUDIO_POLICY_DEVICE_STATE_AVAILABLE, port, AUDIO_FORMAT_DEFAULT)); EXPECT_EQ(lastConnectedDevicePortCount + 1, mClient->getConnectedDevicePortCount()); EXPECT_EQ(lastDisconnectedDevicePortCount, mClient->getDisconnectedDevicePortCount()); const audio_port_v7* devicePort = mClient->getLastConnectedDevicePort(); EXPECT_EQ(port.extraAudioDescriptors.size(), devicePort->num_extra_audio_descriptors); EXPECT_EQ(AUDIO_STANDARD_EDID, devicePort->extra_audio_descriptors[0].standard); EXPECT_EQ(AUDIO_ENCAPSULATION_TYPE_IEC61937, devicePort->extra_audio_descriptors[0].encapsulation_type); EXPECT_NE(0, devicePort->extra_audio_descriptors[0].descriptor[0]); } INSTANTIATE_TEST_CASE_P( DeviceConnectionState, AudioPolicyManagerTestDeviceConnection, Loading