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

Commit 1c48cc9f authored by Shunkai Yao's avatar Shunkai Yao Committed by Automerger Merge Worker
Browse files

Merge changes from topic "fix-b-273252382-connect-external-device" am: 4dbb96f6

parents ed6557ca 4dbb96f6
Loading
Loading
Loading
Loading
+63 −13
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ using aidl::android::hardware::audio::common::isDefaultAudioFormat;
using aidl::android::hardware::audio::common::makeBitPositionFlagMask;
using aidl::android::hardware::audio::common::makeBitPositionFlagMask;
using aidl::android::hardware::audio::common::RecordTrackMetadata;
using aidl::android::hardware::audio::common::RecordTrackMetadata;
using aidl::android::hardware::audio::core::AudioPatch;
using aidl::android::hardware::audio::core::AudioPatch;
using aidl::android::hardware::audio::core::AudioRoute;
using aidl::android::hardware::audio::core::IModule;
using aidl::android::hardware::audio::core::IModule;
using aidl::android::hardware::audio::core::ITelephony;
using aidl::android::hardware::audio::core::ITelephony;
using aidl::android::hardware::audio::core::ModuleDebug;
using aidl::android::hardware::audio::core::ModuleDebug;
@@ -196,6 +197,7 @@ status_t DeviceHalAidl::initCheck() {
    }
    }
    ALOGI("%s: module %s default port ids: input %d, output %d",
    ALOGI("%s: module %s default port ids: input %d, output %d",
            __func__, mInstance.c_str(), mDefaultInputPortId, mDefaultOutputPortId);
            __func__, mInstance.c_str(), mDefaultInputPortId, mDefaultOutputPortId);
    RETURN_STATUS_IF_ERROR(updateRoutes());
    std::vector<AudioPortConfig> portConfigs;
    std::vector<AudioPortConfig> portConfigs;
    RETURN_STATUS_IF_ERROR(
    RETURN_STATUS_IF_ERROR(
            statusTFromBinderStatus(mModule->getAudioPortConfigs(&portConfigs)));  // OK if empty
            statusTFromBinderStatus(mModule->getAudioPortConfigs(&portConfigs)));  // OK if empty
@@ -365,7 +367,7 @@ status_t DeviceHalAidl::prepareToOpenStream(
        cleanups->emplace_front(this, &DeviceHalAidl::resetPortConfig, devicePortConfig.id);
        cleanups->emplace_front(this, &DeviceHalAidl::resetPortConfig, devicePortConfig.id);
    }
    }
    RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(*aidlConfig, aidlFlags, aidlHandle, aidlSource,
    RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(*aidlConfig, aidlFlags, aidlHandle, aidlSource,
                    mixPortConfig, &created));
                    std::set<int32_t>{devicePortConfig.portId}, mixPortConfig, &created));
    if (created) {
    if (created) {
        cleanups->emplace_front(this, &DeviceHalAidl::resetPortConfig, mixPortConfig->id);
        cleanups->emplace_front(this, &DeviceHalAidl::resetPortConfig, mixPortConfig->id);
    }
    }
@@ -685,20 +687,41 @@ status_t DeviceHalAidl::createAudioPatch(unsigned int num_sources,
            __func__, ::android::internal::ToString(aidlSources).c_str(),
            __func__, ::android::internal::ToString(aidlSources).c_str(),
            ::android::internal::ToString(aidlSinks).c_str());
            ::android::internal::ToString(aidlSinks).c_str());
    auto fillPortConfigs = [&](
    auto fillPortConfigs = [&](
            const std::vector<AudioPortConfig>& configs, std::vector<int32_t>* ids) -> status_t {
            const std::vector<AudioPortConfig>& configs,
            const std::set<int32_t>& destinationPortIds,
            std::vector<int32_t>* ids, std::set<int32_t>* portIds) -> status_t {
        for (const auto& s : configs) {
        for (const auto& s : configs) {
            AudioPortConfig portConfig;
            AudioPortConfig portConfig;
            bool created = false;
            bool created = false;
            RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(s, &portConfig, &created));
            RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(
                            s, destinationPortIds, &portConfig, &created));
            if (created) {
            if (created) {
                cleanups.emplace_front(this, &DeviceHalAidl::resetPortConfig, portConfig.id);
                cleanups.emplace_front(this, &DeviceHalAidl::resetPortConfig, portConfig.id);
            }
            }
            ids->push_back(portConfig.id);
            ids->push_back(portConfig.id);
            if (portIds != nullptr) {
                portIds->insert(portConfig.portId);
            }
        }
        }
        return OK;
        return OK;
    };
    };
    RETURN_STATUS_IF_ERROR(fillPortConfigs(aidlSources, &aidlPatch.sourcePortConfigIds));
    // When looking up port configs, the destinationPortId is only used for mix ports.
    RETURN_STATUS_IF_ERROR(fillPortConfigs(aidlSinks, &aidlPatch.sinkPortConfigIds));
    // Thus, we process device port configs first, and look up the destination port ID from them.
    bool sourceIsDevice = std::any_of(aidlSources.begin(), aidlSources.end(),
            [](const auto& config) { return config.ext.getTag() == AudioPortExt::device; });
    const std::vector<AudioPortConfig>& devicePortConfigs =
            sourceIsDevice ? aidlSources : aidlSinks;
    std::vector<int32_t>* devicePortConfigIds =
            sourceIsDevice ? &aidlPatch.sourcePortConfigIds : &aidlPatch.sinkPortConfigIds;
    const std::vector<AudioPortConfig>& mixPortConfigs =
            sourceIsDevice ? aidlSinks : aidlSources;
    std::vector<int32_t>* mixPortConfigIds =
            sourceIsDevice ? &aidlPatch.sinkPortConfigIds : &aidlPatch.sourcePortConfigIds;
    std::set<int32_t> devicePortIds;
    RETURN_STATUS_IF_ERROR(fillPortConfigs(
                    devicePortConfigs, std::set<int32_t>(), devicePortConfigIds, &devicePortIds));
    RETURN_STATUS_IF_ERROR(fillPortConfigs(
                    mixPortConfigs, devicePortIds, mixPortConfigIds, nullptr));
    if (existingPatchIt != mPatches.end()) {
    if (existingPatchIt != mPatches.end()) {
        RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
        RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
                        mModule->setAudioPatch(aidlPatch, &aidlPatch)));
                        mModule->setAudioPatch(aidlPatch, &aidlPatch)));
@@ -793,7 +816,8 @@ status_t DeviceHalAidl::setAudioPortConfig(const struct audio_port_config* confi
                    *config, isInput, 0 /*portId*/));
                    *config, isInput, 0 /*portId*/));
    AudioPortConfig portConfig;
    AudioPortConfig portConfig;
    bool created = false;
    bool created = false;
    RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(requestedPortConfig, &portConfig, &created));
    RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(
                    requestedPortConfig, std::set<int32_t>(), &portConfig, &created));
    return OK;
    return OK;
}
}


@@ -969,7 +993,7 @@ status_t DeviceHalAidl::setConnectedState(const struct audio_port_v7 *port, bool
                                portsIt->second.id)));
                                portsIt->second.id)));
        mPorts.erase(portsIt);
        mPorts.erase(portsIt);
    }
    }
    return OK;
    return updateRoutes();
}
}


status_t DeviceHalAidl::setSimulateDeviceConnections(bool enabled) {
status_t DeviceHalAidl::setSimulateDeviceConnections(bool enabled) {
@@ -1079,7 +1103,8 @@ status_t DeviceHalAidl::findOrCreatePortConfig(const AudioDevice& device,


status_t DeviceHalAidl::findOrCreatePortConfig(
status_t DeviceHalAidl::findOrCreatePortConfig(
        const AudioConfig& config, const std::optional<AudioIoFlags>& flags, int32_t ioHandle,
        const AudioConfig& config, const std::optional<AudioIoFlags>& flags, int32_t ioHandle,
        AudioSource source, AudioPortConfig* portConfig, bool* created) {
        AudioSource source, const std::set<int32_t>& destinationPortIds,
        AudioPortConfig* portConfig, bool* created) {
    // These flags get removed one by one in this order when retrying port finding.
    // These flags get removed one by one in this order when retrying port finding.
    static const std::vector<AudioInputFlags> kOptionalInputFlags{
    static const std::vector<AudioInputFlags> kOptionalInputFlags{
        AudioInputFlags::FAST, AudioInputFlags::RAW };
        AudioInputFlags::FAST, AudioInputFlags::RAW };
@@ -1087,7 +1112,7 @@ status_t DeviceHalAidl::findOrCreatePortConfig(
    if (portConfigIt == mPortConfigs.end() && flags.has_value()) {
    if (portConfigIt == mPortConfigs.end() && flags.has_value()) {
        auto optionalInputFlagsIt = kOptionalInputFlags.begin();
        auto optionalInputFlagsIt = kOptionalInputFlags.begin();
        AudioIoFlags matchFlags = flags.value();
        AudioIoFlags matchFlags = flags.value();
        auto portsIt = findPort(config, matchFlags);
        auto portsIt = findPort(config, matchFlags, destinationPortIds);
        while (portsIt == mPorts.end() && matchFlags.getTag() == AudioIoFlags::Tag::input
        while (portsIt == mPorts.end() && matchFlags.getTag() == AudioIoFlags::Tag::input
                && optionalInputFlagsIt != kOptionalInputFlags.end()) {
                && optionalInputFlagsIt != kOptionalInputFlags.end()) {
            if (!isBitPositionFlagSet(
            if (!isBitPositionFlagSet(
@@ -1097,7 +1122,7 @@ status_t DeviceHalAidl::findOrCreatePortConfig(
            }
            }
            matchFlags.set<AudioIoFlags::Tag::input>(matchFlags.get<AudioIoFlags::Tag::input>() &
            matchFlags.set<AudioIoFlags::Tag::input>(matchFlags.get<AudioIoFlags::Tag::input>() &
                    ~makeBitPositionFlagMask(*optionalInputFlagsIt++));
                    ~makeBitPositionFlagMask(*optionalInputFlagsIt++));
            portsIt = findPort(config, matchFlags);
            portsIt = findPort(config, matchFlags, destinationPortIds);
            ALOGI("%s: mix port for config %s, flags %s was not found in the module %s, "
            ALOGI("%s: mix port for config %s, flags %s was not found in the module %s, "
                    "retried with flags %s", __func__, config.toString().c_str(),
                    "retried with flags %s", __func__, config.toString().c_str(),
                    flags.value().toString().c_str(), mInstance.c_str(),
                    flags.value().toString().c_str(), mInstance.c_str(),
@@ -1133,7 +1158,8 @@ status_t DeviceHalAidl::findOrCreatePortConfig(
}
}


status_t DeviceHalAidl::findOrCreatePortConfig(
status_t DeviceHalAidl::findOrCreatePortConfig(
        const AudioPortConfig& requestedPortConfig, AudioPortConfig* portConfig, bool* created) {
        const AudioPortConfig& requestedPortConfig, const std::set<int32_t>& destinationPortIds,
        AudioPortConfig* portConfig, bool* created) {
    using Tag = AudioPortExt::Tag;
    using Tag = AudioPortExt::Tag;
    if (requestedPortConfig.ext.getTag() == Tag::mix) {
    if (requestedPortConfig.ext.getTag() == Tag::mix) {
        if (const auto& p = requestedPortConfig;
        if (const auto& p = requestedPortConfig;
@@ -1150,7 +1176,8 @@ status_t DeviceHalAidl::findOrCreatePortConfig(
                requestedPortConfig.ext.get<Tag::mix>().usecase.
                requestedPortConfig.ext.get<Tag::mix>().usecase.
                get<AudioPortMixExtUseCase::Tag::source>() : AudioSource::SYS_RESERVED_INVALID;
                get<AudioPortMixExtUseCase::Tag::source>() : AudioSource::SYS_RESERVED_INVALID;
        return findOrCreatePortConfig(config, requestedPortConfig.flags,
        return findOrCreatePortConfig(config, requestedPortConfig.flags,
                requestedPortConfig.ext.get<Tag::mix>().handle, source, portConfig, created);
                requestedPortConfig.ext.get<Tag::mix>().handle, source, destinationPortIds,
                portConfig, created);
    } else if (requestedPortConfig.ext.getTag() == Tag::device) {
    } else if (requestedPortConfig.ext.getTag() == Tag::device) {
        return findOrCreatePortConfig(
        return findOrCreatePortConfig(
                requestedPortConfig.ext.get<Tag::device>().device, portConfig, created);
                requestedPortConfig.ext.get<Tag::device>().device, portConfig, created);
@@ -1182,8 +1209,10 @@ DeviceHalAidl::Ports::iterator DeviceHalAidl::findPort(const AudioDevice& device
            [&](const auto& pair) { return audioDeviceMatches(device, pair.second); });
            [&](const auto& pair) { return audioDeviceMatches(device, pair.second); });
}
}



DeviceHalAidl::Ports::iterator DeviceHalAidl::findPort(
DeviceHalAidl::Ports::iterator DeviceHalAidl::findPort(
            const AudioConfig& config, const AudioIoFlags& flags) {
            const AudioConfig& config, const AudioIoFlags& flags,
            const std::set<int32_t>& destinationPortIds) {
    auto belongsToProfile = [&config](const AudioProfile& prof) {
    auto belongsToProfile = [&config](const AudioProfile& prof) {
        return (isDefaultAudioFormat(config.base.format) || prof.format == config.base.format) &&
        return (isDefaultAudioFormat(config.base.format) || prof.format == config.base.format) &&
                (config.base.channelMask.getTag() == AudioChannelLayout::none ||
                (config.base.channelMask.getTag() == AudioChannelLayout::none ||
@@ -1197,6 +1226,10 @@ DeviceHalAidl::Ports::iterator DeviceHalAidl::findPort(
        const auto& p = pair.second;
        const auto& p = pair.second;
        return p.ext.getTag() == AudioPortExt::Tag::mix &&
        return p.ext.getTag() == AudioPortExt::Tag::mix &&
                p.flags == flags &&
                p.flags == flags &&
                (destinationPortIds.empty() ||
                        std::any_of(destinationPortIds.begin(), destinationPortIds.end(),
                                [&](const int32_t destId) { return mRoutingMatrix.count(
                                            std::make_pair(p.id, destId)) != 0; })) &&
                (p.profiles.empty() ||
                (p.profiles.empty() ||
                        std::find_if(p.profiles.begin(), p.profiles.end(), belongsToProfile) !=
                        std::find_if(p.profiles.begin(), p.profiles.end(), belongsToProfile) !=
                        p.profiles.end()); };
                        p.profiles.end()); };
@@ -1285,6 +1318,23 @@ void DeviceHalAidl::resetUnusedPortConfigs() {
    for (int32_t id : portConfigIds) resetPortConfig(id);
    for (int32_t id : portConfigIds) resetPortConfig(id);
}
}


status_t DeviceHalAidl::updateRoutes() {
    TIME_CHECK();
    std::vector<AudioRoute> routes;
    RETURN_STATUS_IF_ERROR(
            statusTFromBinderStatus(mModule->getAudioRoutes(&routes)));
    ALOGW_IF(routes.empty(), "%s: module %s returned an empty list of audio routes",
            __func__, mInstance.c_str());
    mRoutingMatrix.clear();
    for (const auto& r : routes) {
        for (auto portId : r.sourcePortIds) {
            mRoutingMatrix.emplace(r.sinkPortId, portId);
            mRoutingMatrix.emplace(portId, r.sinkPortId);
        }
    }
    return OK;
}

void DeviceHalAidl::clearCallbacks(void* cookie) {
void DeviceHalAidl::clearCallbacks(void* cookie) {
    std::lock_guard l(mLock);
    std::lock_guard l(mLock);
    mCallbacks.erase(cookie);
    mCallbacks.erase(cookie);
+9 −1
Original line number Original line Diff line number Diff line
@@ -181,6 +181,9 @@ class DeviceHalAidl : public DeviceHalInterface, public ConversionHelperAidl,
    using PortConfigs = std::map<int32_t /*port config ID*/,
    using PortConfigs = std::map<int32_t /*port config ID*/,
            ::aidl::android::media::audio::common::AudioPortConfig>;
            ::aidl::android::media::audio::common::AudioPortConfig>;
    using Ports = std::map<int32_t /*port ID*/, ::aidl::android::media::audio::common::AudioPort>;
    using Ports = std::map<int32_t /*port ID*/, ::aidl::android::media::audio::common::AudioPort>;
    // Answers the question "whether portID 'first' is reachable from portID 'second'?"
    // It's not a map because both portIDs are known. The matrix is symmetric.
    using RoutingMatrix = std::set<std::pair<int32_t, int32_t>>;
    using Streams = std::map<wp<StreamHalInterface>, int32_t /*patch ID*/>;
    using Streams = std::map<wp<StreamHalInterface>, int32_t /*patch ID*/>;
    class Cleanups;
    class Cleanups;


@@ -215,16 +218,19 @@ class DeviceHalAidl : public DeviceHalInterface, public ConversionHelperAidl,
            const std::optional<::aidl::android::media::audio::common::AudioIoFlags>& flags,
            const std::optional<::aidl::android::media::audio::common::AudioIoFlags>& flags,
            int32_t ioHandle,
            int32_t ioHandle,
            ::aidl::android::media::audio::common::AudioSource aidlSource,
            ::aidl::android::media::audio::common::AudioSource aidlSource,
            const std::set<int32_t>& destinationPortIds,
            ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created);
            ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created);
    status_t findOrCreatePortConfig(
    status_t findOrCreatePortConfig(
        const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig,
        const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig,
        const std::set<int32_t>& destinationPortIds,
        ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created);
        ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created);
    Patches::iterator findPatch(const std::set<int32_t>& sourcePortConfigIds,
    Patches::iterator findPatch(const std::set<int32_t>& sourcePortConfigIds,
            const std::set<int32_t>& sinkPortConfigIds);
            const std::set<int32_t>& sinkPortConfigIds);
    Ports::iterator findPort(const ::aidl::android::media::audio::common::AudioDevice& device);
    Ports::iterator findPort(const ::aidl::android::media::audio::common::AudioDevice& device);
    Ports::iterator findPort(
    Ports::iterator findPort(
            const ::aidl::android::media::audio::common::AudioConfig& config,
            const ::aidl::android::media::audio::common::AudioConfig& config,
            const ::aidl::android::media::audio::common::AudioIoFlags& flags);
            const ::aidl::android::media::audio::common::AudioIoFlags& flags,
            const std::set<int32_t>& destinationPortIds);
    PortConfigs::iterator findPortConfig(
    PortConfigs::iterator findPortConfig(
            const ::aidl::android::media::audio::common::AudioDevice& device);
            const ::aidl::android::media::audio::common::AudioDevice& device);
    PortConfigs::iterator findPortConfig(
    PortConfigs::iterator findPortConfig(
@@ -246,6 +252,7 @@ class DeviceHalAidl : public DeviceHalInterface, public ConversionHelperAidl,
    void resetUnusedPatches();
    void resetUnusedPatches();
    void resetUnusedPatchesAndPortConfigs();
    void resetUnusedPatchesAndPortConfigs();
    void resetUnusedPortConfigs();
    void resetUnusedPortConfigs();
    status_t updateRoutes();


    // CallbackBroker implementation
    // CallbackBroker implementation
    void clearCallbacks(void* cookie) override;
    void clearCallbacks(void* cookie) override;
@@ -272,6 +279,7 @@ class DeviceHalAidl : public DeviceHalInterface, public ConversionHelperAidl,
    int32_t mDefaultOutputPortId = -1;
    int32_t mDefaultOutputPortId = -1;
    PortConfigs mPortConfigs;
    PortConfigs mPortConfigs;
    Patches mPatches;
    Patches mPatches;
    RoutingMatrix mRoutingMatrix;
    Streams mStreams;
    Streams mStreams;
    Microphones mMicrophones;
    Microphones mMicrophones;
    std::mutex mLock;
    std::mutex mLock;