2021-11-16 01:31:03 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2022 The Android Open Source Project
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2022-09-13 01:20:45 +00:00
|
|
|
#include <functional>
|
2021-11-16 01:31:03 +00:00
|
|
|
#include <optional>
|
|
|
|
|
#include <set>
|
|
|
|
|
#include <utility>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
#include <aidl/android/hardware/audio/core/AudioRoute.h>
|
|
|
|
|
#include <aidl/android/hardware/audio/core/IModule.h>
|
2022-06-17 21:41:19 +00:00
|
|
|
#include <aidl/android/media/audio/common/AudioOffloadInfo.h>
|
2022-06-16 00:35:31 +00:00
|
|
|
#include <aidl/android/media/audio/common/AudioPort.h>
|
2021-11-16 01:31:03 +00:00
|
|
|
|
|
|
|
|
class ModuleConfig {
|
|
|
|
|
public:
|
2022-06-16 00:35:31 +00:00
|
|
|
using SrcSinkPair = std::pair<aidl::android::media::audio::common::AudioPortConfig,
|
|
|
|
|
aidl::android::media::audio::common::AudioPortConfig>;
|
2021-11-16 01:31:03 +00:00
|
|
|
using SrcSinkGroup =
|
2022-06-16 00:35:31 +00:00
|
|
|
std::pair<aidl::android::hardware::audio::core::AudioRoute, std::vector<SrcSinkPair>>;
|
2021-11-16 01:31:03 +00:00
|
|
|
|
2022-06-17 21:41:19 +00:00
|
|
|
static std::optional<aidl::android::media::audio::common::AudioOffloadInfo>
|
|
|
|
|
generateOffloadInfoIfNeeded(
|
|
|
|
|
const aidl::android::media::audio::common::AudioPortConfig& portConfig);
|
2023-08-23 12:39:15 +00:00
|
|
|
|
|
|
|
|
static std::vector<aidl::android::media::audio::common::AudioPort> getAudioPortsForDeviceTypes(
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioDeviceType>& deviceTypes,
|
|
|
|
|
const std::string& connection = "");
|
2022-10-06 00:14:19 +00:00
|
|
|
static std::vector<aidl::android::media::audio::common::AudioPort> getBuiltInMicPorts(
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioPort>& ports);
|
2022-06-17 21:41:19 +00:00
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
explicit ModuleConfig(aidl::android::hardware::audio::core::IModule* module);
|
|
|
|
|
const ndk::ScopedAStatus& getStatus() const { return mStatus; }
|
|
|
|
|
std::string getError() const { return mStatus.getMessage(); }
|
2021-11-16 01:31:03 +00:00
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getAttachedDevicePorts() const;
|
2023-10-25 08:44:47 -07:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getAudioPortsForDeviceTypes(
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioDeviceType>& deviceTypes,
|
|
|
|
|
const std::string& connection = "") const;
|
2023-08-23 12:39:15 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getConnectedExternalDevicePorts()
|
|
|
|
|
const;
|
|
|
|
|
std::set<int32_t> getConnectedSinkDevicePorts() const;
|
|
|
|
|
std::set<int32_t> getConnectedSourceDevicePorts() const;
|
2022-10-06 00:14:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getAttachedMicrophonePorts() const {
|
|
|
|
|
return getBuiltInMicPorts(getAttachedDevicePorts());
|
|
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getExternalDevicePorts() const;
|
2022-10-06 00:14:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getInputMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/) const;
|
2022-10-06 00:14:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getOutputMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/) const;
|
2022-10-06 00:14:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool isInput,
|
|
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/) const {
|
|
|
|
|
return isInput ? getInputMixPorts(connectedOnly) : getOutputMixPorts(connectedOnly);
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
2022-09-13 01:20:45 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getNonBlockingMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/,
|
|
|
|
|
bool singlePort) const;
|
2022-09-12 22:57:14 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getOffloadMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/,
|
|
|
|
|
bool singlePort) const;
|
2022-10-06 00:14:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getPrimaryMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/,
|
|
|
|
|
bool singlePort) const;
|
2023-01-12 23:06:37 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getMmapOutMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/,
|
|
|
|
|
bool singlePort) const;
|
2023-01-12 23:06:37 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getMmapInMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/,
|
|
|
|
|
bool singlePort) const;
|
2023-10-25 08:44:47 -07:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getRemoteSubmixPorts(
|
|
|
|
|
bool isInput, bool singlePort) const;
|
2021-11-16 01:31:03 +00:00
|
|
|
|
2023-08-23 12:39:15 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getConnectedDevicesPortsForMixPort(
|
2022-06-16 00:35:31 +00:00
|
|
|
bool isInput, const aidl::android::media::audio::common::AudioPort& mixPort) const {
|
2023-08-23 12:39:15 +00:00
|
|
|
return isInput ? getConnectedSourceDevicesPortsForMixPort(mixPort)
|
|
|
|
|
: getConnectedSinkDevicesPortsForMixPort(mixPort);
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
2023-08-23 12:39:15 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getConnectedDevicesPortsForMixPort(
|
2022-07-22 23:23:25 +00:00
|
|
|
bool isInput,
|
|
|
|
|
const aidl::android::media::audio::common::AudioPortConfig& mixPortConfig) const;
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort>
|
2023-08-23 12:39:15 +00:00
|
|
|
getConnectedSinkDevicesPortsForMixPort(
|
2022-06-16 00:35:31 +00:00
|
|
|
const aidl::android::media::audio::common::AudioPort& mixPort) const;
|
|
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort>
|
2023-08-23 12:39:15 +00:00
|
|
|
getConnectedSourceDevicesPortsForMixPort(
|
2022-06-16 00:35:31 +00:00
|
|
|
const aidl::android::media::audio::common::AudioPort& mixPort) const;
|
|
|
|
|
std::optional<aidl::android::media::audio::common::AudioPort>
|
2023-08-23 12:39:15 +00:00
|
|
|
getSourceMixPortForConnectedDevice() const;
|
2021-11-16 01:31:03 +00:00
|
|
|
|
2023-10-25 08:44:47 -07:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getRoutableDevicePortsForMixPort(
|
|
|
|
|
const aidl::android::media::audio::common::AudioPort& port,
|
|
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/) const;
|
2023-10-05 17:36:57 -07:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> getRoutableMixPortsForDevicePort(
|
2023-10-25 08:44:47 -07:00
|
|
|
const aidl::android::media::audio::common::AudioPort& port,
|
|
|
|
|
bool connectedOnly /*Permanently attached and connected external devices*/) const;
|
2023-10-05 17:36:57 -07:00
|
|
|
|
2021-11-16 01:31:03 +00:00
|
|
|
std::optional<SrcSinkPair> getNonRoutableSrcSinkPair(bool isInput) const;
|
|
|
|
|
std::optional<SrcSinkPair> getRoutableSrcSinkPair(bool isInput) const;
|
|
|
|
|
std::vector<SrcSinkGroup> getRoutableSrcSinkGroups(bool isInput) const;
|
|
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig>
|
2022-05-02 22:52:13 +00:00
|
|
|
getPortConfigsForAttachedDevicePorts() const {
|
|
|
|
|
return generateAudioDevicePortConfigs(getAttachedDevicePorts(), false);
|
|
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts()
|
|
|
|
|
const {
|
2022-10-06 00:14:19 +00:00
|
|
|
auto inputs =
|
2023-08-23 12:39:15 +00:00
|
|
|
generateAudioMixPortConfigs(getInputMixPorts(false /*connectedOnly*/), true, false);
|
|
|
|
|
auto outputs = generateAudioMixPortConfigs(getOutputMixPorts(false /*connectedOnly*/),
|
|
|
|
|
false, false);
|
2021-11-16 01:31:03 +00:00
|
|
|
inputs.insert(inputs.end(), outputs.begin(), outputs.end());
|
|
|
|
|
return inputs;
|
|
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
|
2021-11-16 01:31:03 +00:00
|
|
|
bool isInput) const {
|
2023-08-23 12:39:15 +00:00
|
|
|
return generateAudioMixPortConfigs(getMixPorts(isInput, false /*connectedOnly*/), isInput,
|
2022-10-06 00:14:19 +00:00
|
|
|
false);
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
|
|
|
|
|
bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
|
2022-06-17 21:41:19 +00:00
|
|
|
return generateAudioMixPortConfigs({port}, isInput, false);
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
|
2021-11-16 01:31:03 +00:00
|
|
|
bool isInput) const {
|
2022-10-06 00:14:19 +00:00
|
|
|
const auto config = generateAudioMixPortConfigs(
|
2023-08-23 12:39:15 +00:00
|
|
|
getMixPorts(isInput, false /*connectedOnly*/), isInput, true);
|
2021-11-16 01:31:03 +00:00
|
|
|
if (!config.empty()) {
|
|
|
|
|
return *config.begin();
|
|
|
|
|
}
|
2022-06-17 21:41:19 +00:00
|
|
|
return {};
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
|
|
|
|
|
bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
|
2022-06-17 21:41:19 +00:00
|
|
|
const auto config = generateAudioMixPortConfigs({port}, isInput, true);
|
2021-11-16 01:31:03 +00:00
|
|
|
if (!config.empty()) {
|
|
|
|
|
return *config.begin();
|
|
|
|
|
}
|
2022-06-17 21:41:19 +00:00
|
|
|
return {};
|
2021-11-16 01:31:03 +00:00
|
|
|
}
|
|
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForDevicePort(
|
|
|
|
|
const aidl::android::media::audio::common::AudioPort& port) const {
|
2022-05-02 22:52:13 +00:00
|
|
|
return generateAudioDevicePortConfigs({port}, false);
|
|
|
|
|
}
|
2022-06-16 00:35:31 +00:00
|
|
|
aidl::android::media::audio::common::AudioPortConfig getSingleConfigForDevicePort(
|
|
|
|
|
const aidl::android::media::audio::common::AudioPort& port) const {
|
2021-11-16 01:31:03 +00:00
|
|
|
const auto config = generateAudioDevicePortConfigs({port}, true);
|
|
|
|
|
return *config.begin();
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-17 17:10:31 -07:00
|
|
|
std::optional<aidl::android::media::audio::common::AudioPort> getPort(int32_t portId);
|
|
|
|
|
|
2023-09-13 18:01:18 -07:00
|
|
|
ndk::ScopedAStatus onExternalDeviceConnected(
|
2023-08-23 12:39:15 +00:00
|
|
|
aidl::android::hardware::audio::core::IModule* module,
|
|
|
|
|
const aidl::android::media::audio::common::AudioPort& port);
|
2023-09-13 18:01:18 -07:00
|
|
|
ndk::ScopedAStatus onExternalDeviceDisconnected(
|
2023-08-23 12:39:15 +00:00
|
|
|
aidl::android::hardware::audio::core::IModule* module,
|
|
|
|
|
const aidl::android::media::audio::common::AudioPort& port);
|
|
|
|
|
|
2023-01-18 00:58:30 +00:00
|
|
|
bool isMmapSupported() const;
|
|
|
|
|
|
2022-05-02 22:52:13 +00:00
|
|
|
std::string toString() const;
|
|
|
|
|
|
2021-11-16 01:31:03 +00:00
|
|
|
private:
|
2022-09-13 01:20:45 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> findMixPorts(
|
2023-08-23 12:39:15 +00:00
|
|
|
bool isInput, bool connectedOnly, bool singlePort,
|
2022-10-06 00:14:19 +00:00
|
|
|
const std::function<bool(const aidl::android::media::audio::common::AudioPort&)>& pred)
|
|
|
|
|
const;
|
2023-10-25 08:44:47 -07:00
|
|
|
std::set<int32_t> findRoutablePortIds(int32_t portId) const;
|
2022-06-17 21:41:19 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> generateAudioMixPortConfigs(
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioPort>& ports, bool isInput,
|
2021-11-16 01:31:03 +00:00
|
|
|
bool singleProfile) const;
|
|
|
|
|
|
|
|
|
|
// Unlike MixPorts, the generator for DevicePorts always returns a non-empty
|
|
|
|
|
// vector for a non-empty input port list. If there are no profiles in the
|
2022-05-02 22:52:13 +00:00
|
|
|
// port, its initial configs are looked up, if there are none,
|
|
|
|
|
// then an empty config is used, assuming further negotiation via setAudioPortConfig.
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig>
|
|
|
|
|
generateAudioDevicePortConfigs(
|
|
|
|
|
const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
|
2021-11-16 01:31:03 +00:00
|
|
|
bool singleProfile) const;
|
|
|
|
|
|
2022-06-16 00:35:31 +00:00
|
|
|
ndk::ScopedAStatus mStatus = ndk::ScopedAStatus::ok();
|
|
|
|
|
std::vector<aidl::android::media::audio::common::AudioPort> mPorts;
|
|
|
|
|
std::vector<aidl::android::media::audio::common::AudioPortConfig> mInitialConfigs;
|
2021-11-16 01:31:03 +00:00
|
|
|
std::set<int32_t> mAttachedSinkDevicePorts;
|
|
|
|
|
std::set<int32_t> mAttachedSourceDevicePorts;
|
2022-05-02 22:52:13 +00:00
|
|
|
std::set<int32_t> mExternalDevicePorts;
|
2023-08-23 12:39:15 +00:00
|
|
|
std::set<int32_t> mConnectedExternalSinkDevicePorts;
|
|
|
|
|
std::set<int32_t> mConnectedExternalSourceDevicePorts;
|
2022-06-16 00:35:31 +00:00
|
|
|
std::vector<aidl::android::hardware::audio::core::AudioRoute> mRoutes;
|
2021-11-16 01:31:03 +00:00
|
|
|
};
|