blob: 27286e5da78b726ef2cbdfa51e1f853af59e9e69 [file] [log] [blame]
Mikhail Naganove5d747e2021-11-16 01:31:03 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Mikhail Naganov30301a42022-09-13 01:20:45 +000019#include <functional>
Mikhail Naganove5d747e2021-11-16 01:31:03 +000020#include <optional>
21#include <set>
22#include <utility>
23#include <vector>
24
Mikhail Naganovf84d6402022-06-16 00:35:31 +000025#include <aidl/android/hardware/audio/core/AudioRoute.h>
26#include <aidl/android/hardware/audio/core/IModule.h>
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000027#include <aidl/android/media/audio/common/AudioOffloadInfo.h>
Mikhail Naganovf84d6402022-06-16 00:35:31 +000028#include <aidl/android/media/audio/common/AudioPort.h>
Mikhail Naganove5d747e2021-11-16 01:31:03 +000029
30class ModuleConfig {
31 public:
Mikhail Naganovf84d6402022-06-16 00:35:31 +000032 using SrcSinkPair = std::pair<aidl::android::media::audio::common::AudioPortConfig,
33 aidl::android::media::audio::common::AudioPortConfig>;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000034 using SrcSinkGroup =
Mikhail Naganovf84d6402022-06-16 00:35:31 +000035 std::pair<aidl::android::hardware::audio::core::AudioRoute, std::vector<SrcSinkPair>>;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000036
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000037 static std::optional<aidl::android::media::audio::common::AudioOffloadInfo>
38 generateOffloadInfoIfNeeded(
39 const aidl::android::media::audio::common::AudioPortConfig& portConfig);
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000040
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000041 static std::vector<aidl::android::media::audio::common::AudioPort> getAudioPortsForDeviceTypes(
42 const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
43 const std::vector<aidl::android::media::audio::common::AudioDeviceType>& deviceTypes,
44 const std::string& connection = "");
Mikhail Naganovef6bc742022-10-06 00:14:19 +000045 static std::vector<aidl::android::media::audio::common::AudioPort> getBuiltInMicPorts(
46 const std::vector<aidl::android::media::audio::common::AudioPort>& ports);
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000047
Mikhail Naganovf84d6402022-06-16 00:35:31 +000048 explicit ModuleConfig(aidl::android::hardware::audio::core::IModule* module);
49 const ndk::ScopedAStatus& getStatus() const { return mStatus; }
50 std::string getError() const { return mStatus.getMessage(); }
Mikhail Naganove5d747e2021-11-16 01:31:03 +000051
Mikhail Naganovf84d6402022-06-16 00:35:31 +000052 std::vector<aidl::android::media::audio::common::AudioPort> getAttachedDevicePorts() const;
Mikhail Naganov95f22772023-10-25 08:44:47 -070053 std::vector<aidl::android::media::audio::common::AudioPort> getAudioPortsForDeviceTypes(
54 const std::vector<aidl::android::media::audio::common::AudioDeviceType>& deviceTypes,
55 const std::string& connection = "") const;
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000056 std::vector<aidl::android::media::audio::common::AudioPort> getConnectedExternalDevicePorts()
57 const;
58 std::set<int32_t> getConnectedSinkDevicePorts() const;
59 std::set<int32_t> getConnectedSourceDevicePorts() const;
Mikhail Naganovef6bc742022-10-06 00:14:19 +000060 std::vector<aidl::android::media::audio::common::AudioPort> getAttachedMicrophonePorts() const {
61 return getBuiltInMicPorts(getAttachedDevicePorts());
62 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000063 std::vector<aidl::android::media::audio::common::AudioPort> getExternalDevicePorts() const;
Mikhail Naganovef6bc742022-10-06 00:14:19 +000064 std::vector<aidl::android::media::audio::common::AudioPort> getInputMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000065 bool connectedOnly /*Permanently attached and connected external devices*/) const;
Mikhail Naganovef6bc742022-10-06 00:14:19 +000066 std::vector<aidl::android::media::audio::common::AudioPort> getOutputMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000067 bool connectedOnly /*Permanently attached and connected external devices*/) const;
Mikhail Naganovef6bc742022-10-06 00:14:19 +000068 std::vector<aidl::android::media::audio::common::AudioPort> getMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000069 bool isInput,
70 bool connectedOnly /*Permanently attached and connected external devices*/) const {
71 return isInput ? getInputMixPorts(connectedOnly) : getOutputMixPorts(connectedOnly);
Mikhail Naganove5d747e2021-11-16 01:31:03 +000072 }
Mikhail Naganov30301a42022-09-13 01:20:45 +000073 std::vector<aidl::android::media::audio::common::AudioPort> getNonBlockingMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000074 bool connectedOnly /*Permanently attached and connected external devices*/,
75 bool singlePort) const;
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +000076 std::vector<aidl::android::media::audio::common::AudioPort> getOffloadMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000077 bool connectedOnly /*Permanently attached and connected external devices*/,
78 bool singlePort) const;
Mikhail Naganovef6bc742022-10-06 00:14:19 +000079 std::vector<aidl::android::media::audio::common::AudioPort> getPrimaryMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000080 bool connectedOnly /*Permanently attached and connected external devices*/,
81 bool singlePort) const;
jiabin9a8e6862023-01-12 23:06:37 +000082 std::vector<aidl::android::media::audio::common::AudioPort> getMmapOutMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000083 bool connectedOnly /*Permanently attached and connected external devices*/,
84 bool singlePort) const;
jiabin9a8e6862023-01-12 23:06:37 +000085 std::vector<aidl::android::media::audio::common::AudioPort> getMmapInMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000086 bool connectedOnly /*Permanently attached and connected external devices*/,
87 bool singlePort) const;
Mikhail Naganov95f22772023-10-25 08:44:47 -070088 std::vector<aidl::android::media::audio::common::AudioPort> getRemoteSubmixPorts(
89 bool isInput, bool singlePort) const;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000090
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000091 std::vector<aidl::android::media::audio::common::AudioPort> getConnectedDevicesPortsForMixPort(
Mikhail Naganovf84d6402022-06-16 00:35:31 +000092 bool isInput, const aidl::android::media::audio::common::AudioPort& mixPort) const {
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000093 return isInput ? getConnectedSourceDevicesPortsForMixPort(mixPort)
94 : getConnectedSinkDevicesPortsForMixPort(mixPort);
Mikhail Naganove5d747e2021-11-16 01:31:03 +000095 }
Shraddha Basantwani343db5e2023-08-23 12:39:15 +000096 std::vector<aidl::android::media::audio::common::AudioPort> getConnectedDevicesPortsForMixPort(
Mikhail Naganov4f5d3f12022-07-22 23:23:25 +000097 bool isInput,
98 const aidl::android::media::audio::common::AudioPortConfig& mixPortConfig) const;
Mikhail Naganovf84d6402022-06-16 00:35:31 +000099 std::vector<aidl::android::media::audio::common::AudioPort>
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000100 getConnectedSinkDevicesPortsForMixPort(
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000101 const aidl::android::media::audio::common::AudioPort& mixPort) const;
102 std::vector<aidl::android::media::audio::common::AudioPort>
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000103 getConnectedSourceDevicesPortsForMixPort(
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000104 const aidl::android::media::audio::common::AudioPort& mixPort) const;
105 std::optional<aidl::android::media::audio::common::AudioPort>
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000106 getSourceMixPortForConnectedDevice() const;
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000107
Mikhail Naganov95f22772023-10-25 08:44:47 -0700108 std::vector<aidl::android::media::audio::common::AudioPort> getRoutableDevicePortsForMixPort(
109 const aidl::android::media::audio::common::AudioPort& port,
110 bool connectedOnly /*Permanently attached and connected external devices*/) const;
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700111 std::vector<aidl::android::media::audio::common::AudioPort> getRoutableMixPortsForDevicePort(
Mikhail Naganov95f22772023-10-25 08:44:47 -0700112 const aidl::android::media::audio::common::AudioPort& port,
113 bool connectedOnly /*Permanently attached and connected external devices*/) const;
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700114
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000115 std::optional<SrcSinkPair> getNonRoutableSrcSinkPair(bool isInput) const;
116 std::optional<SrcSinkPair> getRoutableSrcSinkPair(bool isInput) const;
117 std::vector<SrcSinkGroup> getRoutableSrcSinkGroups(bool isInput) const;
118
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000119 std::vector<aidl::android::media::audio::common::AudioPortConfig>
Mikhail Naganov00603d12022-05-02 22:52:13 +0000120 getPortConfigsForAttachedDevicePorts() const {
121 return generateAudioDevicePortConfigs(getAttachedDevicePorts(), false);
122 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000123 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts()
124 const {
Mikhail Naganovef6bc742022-10-06 00:14:19 +0000125 auto inputs =
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000126 generateAudioMixPortConfigs(getInputMixPorts(false /*connectedOnly*/), true, false);
127 auto outputs = generateAudioMixPortConfigs(getOutputMixPorts(false /*connectedOnly*/),
128 false, false);
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000129 inputs.insert(inputs.end(), outputs.begin(), outputs.end());
130 return inputs;
131 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000132 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000133 bool isInput) const {
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000134 return generateAudioMixPortConfigs(getMixPorts(isInput, false /*connectedOnly*/), isInput,
Mikhail Naganovef6bc742022-10-06 00:14:19 +0000135 false);
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000136 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000137 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
138 bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000139 return generateAudioMixPortConfigs({port}, isInput, false);
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000140 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000141 std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000142 bool isInput) const {
Mikhail Naganovef6bc742022-10-06 00:14:19 +0000143 const auto config = generateAudioMixPortConfigs(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000144 getMixPorts(isInput, false /*connectedOnly*/), isInput, true);
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000145 if (!config.empty()) {
146 return *config.begin();
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000147 }
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000148 return {};
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000149 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000150 std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
151 bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000152 const auto config = generateAudioMixPortConfigs({port}, isInput, true);
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000153 if (!config.empty()) {
154 return *config.begin();
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000155 }
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000156 return {};
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000157 }
158
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000159 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForDevicePort(
160 const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000161 return generateAudioDevicePortConfigs({port}, false);
162 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000163 aidl::android::media::audio::common::AudioPortConfig getSingleConfigForDevicePort(
164 const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000165 const auto config = generateAudioDevicePortConfigs({port}, true);
166 return *config.begin();
167 }
168
Mikhail Naganova62c5df2024-04-17 17:10:31 -0700169 std::optional<aidl::android::media::audio::common::AudioPort> getPort(int32_t portId);
170
Mikhail Naganov0e128dd2023-09-13 18:01:18 -0700171 ndk::ScopedAStatus onExternalDeviceConnected(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000172 aidl::android::hardware::audio::core::IModule* module,
173 const aidl::android::media::audio::common::AudioPort& port);
Mikhail Naganov0e128dd2023-09-13 18:01:18 -0700174 ndk::ScopedAStatus onExternalDeviceDisconnected(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000175 aidl::android::hardware::audio::core::IModule* module,
176 const aidl::android::media::audio::common::AudioPort& port);
177
jiabinb76981e2023-01-18 00:58:30 +0000178 bool isMmapSupported() const;
179
Mikhail Naganov00603d12022-05-02 22:52:13 +0000180 std::string toString() const;
181
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000182 private:
Mikhail Naganov30301a42022-09-13 01:20:45 +0000183 std::vector<aidl::android::media::audio::common::AudioPort> findMixPorts(
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000184 bool isInput, bool connectedOnly, bool singlePort,
Mikhail Naganovef6bc742022-10-06 00:14:19 +0000185 const std::function<bool(const aidl::android::media::audio::common::AudioPort&)>& pred)
186 const;
Mikhail Naganov95f22772023-10-25 08:44:47 -0700187 std::set<int32_t> findRoutablePortIds(int32_t portId) const;
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000188 std::vector<aidl::android::media::audio::common::AudioPortConfig> generateAudioMixPortConfigs(
189 const std::vector<aidl::android::media::audio::common::AudioPort>& ports, bool isInput,
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000190 bool singleProfile) const;
191
192 // Unlike MixPorts, the generator for DevicePorts always returns a non-empty
193 // vector for a non-empty input port list. If there are no profiles in the
Mikhail Naganov00603d12022-05-02 22:52:13 +0000194 // port, its initial configs are looked up, if there are none,
195 // then an empty config is used, assuming further negotiation via setAudioPortConfig.
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000196 std::vector<aidl::android::media::audio::common::AudioPortConfig>
197 generateAudioDevicePortConfigs(
198 const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000199 bool singleProfile) const;
200
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000201 ndk::ScopedAStatus mStatus = ndk::ScopedAStatus::ok();
202 std::vector<aidl::android::media::audio::common::AudioPort> mPorts;
203 std::vector<aidl::android::media::audio::common::AudioPortConfig> mInitialConfigs;
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000204 std::set<int32_t> mAttachedSinkDevicePorts;
205 std::set<int32_t> mAttachedSourceDevicePorts;
Mikhail Naganov00603d12022-05-02 22:52:13 +0000206 std::set<int32_t> mExternalDevicePorts;
Shraddha Basantwani343db5e2023-08-23 12:39:15 +0000207 std::set<int32_t> mConnectedExternalSinkDevicePorts;
208 std::set<int32_t> mConnectedExternalSourceDevicePorts;
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000209 std::vector<aidl::android::hardware::audio::core::AudioRoute> mRoutes;
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000210};