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

Commit 0566bac8 authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Harish Mahendrakar
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
Merged-In: Ie12b72b28916d774827ce3dff038700016033201
Change-Id: Ie12b72b28916d774827ce3dff038700016033201
parent 87384c50
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,