Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddc5f31f authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

Fix passing of ExtraAudioDescriptors to audio HAL

Add missing piece of code which sets a EAD received
via AudioPolicyService interface to a DeviceDescriptor.

Bug: 211601178
Bug: 215186955
Test: atest audiopolicy_tests
Change-Id: Ie12b72b28916d774827ce3dff038700016033201
parent 620763ff
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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() {
+7 −3
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ cc_test {
    ],

    static_libs: [
        "android.media.audio.common.types-V1-cpp",
        "audioclient-types-aidl-cpp",
        "libaudiopolicycomponents",
        "libgmock",
    ],
+32 −2
Original line number Diff line number Diff line
@@ -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;
    }

@@ -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;
@@ -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
+39 −0
Original line number Diff line number Diff line
@@ -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,