blob: a20bb54ea88b4546956ffbf7ce1e611a1a521538 [file] [log] [blame]
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +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
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +000017#include <Utils.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000018#include <aidl/android/media/audio/common/AudioChannelLayout.h>
19#include <aidl/android/media/audio/common/AudioDeviceType.h>
Mikhail Naganov00603d12022-05-02 22:52:13 +000020#include <aidl/android/media/audio/common/AudioFormatDescription.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000021#include <aidl/android/media/audio/common/AudioFormatType.h>
22#include <aidl/android/media/audio/common/AudioIoFlags.h>
23#include <aidl/android/media/audio/common/AudioOutputFlags.h>
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000024#include <media/stagefright/foundation/MediaDefs.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000025
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000026#include "core-impl/Configuration.h"
27
Mikhail Naganov872d4a62023-03-09 18:19:01 -080028using aidl::android::hardware::audio::common::makeBitPositionFlagMask;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000029using aidl::android::media::audio::common::AudioChannelLayout;
Mikhail Naganov00603d12022-05-02 22:52:13 +000030using aidl::android::media::audio::common::AudioDeviceDescription;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000031using aidl::android::media::audio::common::AudioDeviceType;
32using aidl::android::media::audio::common::AudioFormatDescription;
33using aidl::android::media::audio::common::AudioFormatType;
34using aidl::android::media::audio::common::AudioGainConfig;
35using aidl::android::media::audio::common::AudioIoFlags;
36using aidl::android::media::audio::common::AudioOutputFlags;
37using aidl::android::media::audio::common::AudioPort;
38using aidl::android::media::audio::common::AudioPortConfig;
39using aidl::android::media::audio::common::AudioPortDeviceExt;
40using aidl::android::media::audio::common::AudioPortExt;
41using aidl::android::media::audio::common::AudioPortMixExt;
42using aidl::android::media::audio::common::AudioProfile;
43using aidl::android::media::audio::common::Int;
Mikhail Naganov5eea7fb2023-10-13 23:38:25 +000044using aidl::android::media::audio::common::MicrophoneInfo;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000045using aidl::android::media::audio::common::PcmType;
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +000046using Configuration = aidl::android::hardware::audio::core::Module::Configuration;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000047
48namespace aidl::android::hardware::audio::core::internal {
49
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000050static void fillProfile(AudioProfile* profile, const std::vector<int32_t>& channelLayouts,
51 const std::vector<int32_t>& sampleRates) {
52 for (auto layout : channelLayouts) {
53 profile->channelMasks.push_back(
54 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout));
55 }
56 profile->sampleRates.insert(profile->sampleRates.end(), sampleRates.begin(), sampleRates.end());
57}
58
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000059static AudioProfile createProfile(PcmType pcmType, const std::vector<int32_t>& channelLayouts,
60 const std::vector<int32_t>& sampleRates) {
61 AudioProfile profile;
62 profile.format.type = AudioFormatType::PCM;
63 profile.format.pcm = pcmType;
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000064 fillProfile(&profile, channelLayouts, sampleRates);
65 return profile;
66}
67
68static AudioProfile createProfile(const std::string& encodingType,
69 const std::vector<int32_t>& channelLayouts,
70 const std::vector<int32_t>& sampleRates) {
71 AudioProfile profile;
72 profile.format.encoding = encodingType;
73 fillProfile(&profile, channelLayouts, sampleRates);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000074 return profile;
75}
76
Mikhail Naganov00603d12022-05-02 22:52:13 +000077static AudioPortExt createDeviceExt(AudioDeviceType devType, int32_t flags,
78 std::string connection = "") {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000079 AudioPortDeviceExt deviceExt;
80 deviceExt.device.type.type = devType;
Mikhail Naganovb0f3d972023-01-27 16:08:29 -080081 if (devType == AudioDeviceType::IN_MICROPHONE && connection.empty()) {
82 deviceExt.device.address = "bottom";
83 } else if (devType == AudioDeviceType::IN_MICROPHONE_BACK && connection.empty()) {
84 deviceExt.device.address = "back";
85 }
Mikhail Naganov00603d12022-05-02 22:52:13 +000086 deviceExt.device.type.connection = std::move(connection);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000087 deviceExt.flags = flags;
88 return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
89}
90
91static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
92 AudioPortMixExt mixExt;
93 mixExt.maxOpenStreamCount = maxOpenStreamCount;
94 mixExt.maxActiveStreamCount = maxActiveStreamCount;
95 return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
96}
97
98static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
99 const AudioPortExt& ext) {
100 AudioPort port;
101 port.id = id;
102 port.name = name;
103 port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
104 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
105 port.ext = ext;
106 return port;
107}
108
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700109static AudioPortConfig createDynamicPortConfig(int32_t id, int32_t portId, int32_t flags,
110 bool isInput, const AudioPortExt& ext) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000111 AudioPortConfig config;
112 config.id = id;
113 config.portId = portId;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000114 config.gain = AudioGainConfig();
115 config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
116 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
117 config.ext = ext;
118 return config;
119}
120
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700121static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
122 int32_t sampleRate, int32_t flags, bool isInput,
123 const AudioPortExt& ext) {
124 AudioPortConfig config = createDynamicPortConfig(id, portId, flags, isInput, ext);
125 config.sampleRate = Int{.value = sampleRate};
126 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
127 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
128 return config;
129}
130
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000131static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000132 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000133 route.sinkPortId = sink.id;
134 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
135 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000136 return route;
137}
138
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000139// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000140//
141// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000142// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000143// - no profiles specified
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700144// * "Built-In Mic", IN_MICROPHONE, default
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000145// - no profiles specified
146// * "Telephony Tx", OUT_TELEPHONY_TX
147// - no profiles specified
148// * "Telephony Rx", IN_TELEPHONY_RX
149// - no profiles specified
150// * "FM Tuner", IN_FM_TUNER
151// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000152//
153// Mix ports:
154// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000155// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700156// * "primary input", 1 max open, 1 max active stream
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700157// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000158// * "telephony_tx", 1 max open, 1 max active stream
159// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000160// * "telephony_rx", 1 max open, 1 max active stream
161// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000162// * "fm_tuner", 1 max open, 1 max active stream
163// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000164//
165// Routes:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700166// "primary out" -> "Speaker"
167// "Built-In Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000168// "Telephony Rx" -> "telephony_rx"
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700169// "telephony_tx" -> "Telephony Tx"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000170// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000171//
172// Initial port configs:
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700173// * "Speaker" device port: dynamic configuration
174// * "Built-In Mic" device port: dynamic configuration
175// * "Telephony Tx" device port: dynamic configuration
176// * "Telephony Rx" device port: dynamic configuration
177// * "FM Tuner" device port: dynamic configuration
Mikhail Naganov00603d12022-05-02 22:52:13 +0000178//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000179std::unique_ptr<Configuration> getPrimaryConfiguration() {
180 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000181 const std::vector<AudioProfile> standardPcmAudioProfiles = {
182 createProfile(PcmType::INT_16_BIT,
183 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000184 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000185 Configuration c;
186
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000187 // Device ports
188
189 AudioPort speakerOutDevice =
190 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000191 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
192 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000193 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000194 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700195 createDynamicPortConfig(speakerOutDevice.id, speakerOutDevice.id, 0, false,
196 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000197
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000198 AudioPort micInDevice =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700199 createPort(c.nextPortId++, "Built-In Mic", 0, true,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000200 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
201 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
202 c.ports.push_back(micInDevice);
203 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700204 createDynamicPortConfig(micInDevice.id, micInDevice.id, 0, true,
205 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000206
207 AudioPort telephonyTxOutDevice =
208 createPort(c.nextPortId++, "Telephony Tx", 0, false,
209 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
210 c.ports.push_back(telephonyTxOutDevice);
211 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700212 createDynamicPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id, 0, false,
213 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000214
215 AudioPort telephonyRxInDevice =
216 createPort(c.nextPortId++, "Telephony Rx", 0, true,
217 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
218 c.ports.push_back(telephonyRxInDevice);
219 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700220 createDynamicPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id, 0, true,
221 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000222
223 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
224 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
225 c.ports.push_back(fmTunerInDevice);
226 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700227 createDynamicPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, 0, true,
228 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000229
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000230 // Mix ports
231
Mikhail Naganov00603d12022-05-02 22:52:13 +0000232 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000233 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Shunkai Yao24618912023-08-18 23:58:05 +0000234 false, createPortMixExt(0, 0));
Mikhail Naganov00603d12022-05-02 22:52:13 +0000235 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
236 standardPcmAudioProfiles.begin(),
237 standardPcmAudioProfiles.end());
238 c.ports.push_back(primaryOutMix);
239
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000240 AudioPort primaryInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700241 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(0, 1));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000242 primaryInMix.profiles.push_back(
243 createProfile(PcmType::INT_16_BIT,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700244 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
245 {8000, 11025, 16000, 32000, 44100, 48000}));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000246 c.ports.push_back(primaryInMix);
247
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000248 AudioPort telephonyTxOutMix =
249 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
250 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
251 standardPcmAudioProfiles.begin(),
252 standardPcmAudioProfiles.end());
253 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000254
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000255 AudioPort telephonyRxInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700256 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000257 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
258 standardPcmAudioProfiles.begin(),
259 standardPcmAudioProfiles.end());
260 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000261
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000262 AudioPort fmTunerInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700263 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000264 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
265 standardPcmAudioProfiles.begin(),
266 standardPcmAudioProfiles.end());
267 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000268
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700269 c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700270 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000271 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700272 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000273 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000274
275 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000276
Mikhail Naganov5eea7fb2023-10-13 23:38:25 +0000277 MicrophoneInfo mic;
278 mic.id = "mic";
279 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
280 mic.group = 0;
281 mic.indexInTheGroup = 0;
282 c.microphones = std::vector<MicrophoneInfo>{mic};
283
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000284 return c;
285 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000286 return std::make_unique<Configuration>(configuration);
287}
288
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700289// Note: When transitioning to loading of XML configs, either keep the configuration
290// of the remote submix sources from this static configuration, or update the XML
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700291// config to match it. There are several reasons for that:
292// 1. The "Remote Submix In" device is listed in the XML config as "attached",
293// however in the AIDL scheme its device type has a "virtual" connection.
294// 2. The canonical r_submix configuration only lists 'STEREO' and '48000',
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700295// however the framework attempts to open streams for other sample rates
296// as well. The legacy r_submix implementation allowed that, but libaudiohal@aidl
297// will not find a mix port to use. Because of that, list all channel
298// masks and sample rates that the legacy implementation allowed.
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700299// 3. The legacy implementation had a hard limit on the number of routes (10),
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700300// and this is checked indirectly by AudioPlaybackCaptureTest#testPlaybackCaptureDoS
301// CTS test. Instead of hardcoding the number of routes, we can use
302// "maxOpen/ActiveStreamCount" to enforce a similar limit. However, the canonical
303// XML file lacks this specification.
304//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000305// Remote Submix configuration:
306//
307// Device ports:
308// * "Remote Submix Out", OUT_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800309// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000310// * "Remote Submix In", IN_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800311// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000312//
313// Mix ports:
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700314// * "r_submix output", maximum 20 opened streams, maximum 10 active streams
David Lib089c0c2023-08-10 12:47:44 +0800315// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700316// * "r_submix input", maximum 20 opened streams, maximum 10 active streams
David Lib089c0c2023-08-10 12:47:44 +0800317// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000318//
319// Routes:
320// "r_submix output" -> "Remote Submix Out"
321// "Remote Submix In" -> "r_submix input"
322//
323std::unique_ptr<Configuration> getRSubmixConfiguration() {
324 static const Configuration configuration = []() {
325 Configuration c;
David Lib089c0c2023-08-10 12:47:44 +0800326 const std::vector<AudioProfile> standardPcmAudioProfiles{
David Lib089c0c2023-08-10 12:47:44 +0800327 createProfile(PcmType::INT_16_BIT,
328 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
329 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000330
331 // Device ports
332
Mikhail Naganov26526f12023-05-12 13:51:06 -0700333 AudioPort rsubmixOutDevice =
334 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
335 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
336 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000337 c.ports.push_back(rsubmixOutDevice);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700338 c.connectedProfiles[rsubmixOutDevice.id] = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000339
David Lib089c0c2023-08-10 12:47:44 +0800340 AudioPort rsubmixInDevice =
341 createPort(c.nextPortId++, "Remote Submix In", 0, true,
342 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0,
343 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000344 c.ports.push_back(rsubmixInDevice);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700345 c.connectedProfiles[rsubmixInDevice.id] = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000346
347 // Mix ports
348
349 AudioPort rsubmixOutMix =
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700350 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(20, 10));
David Lib089c0c2023-08-10 12:47:44 +0800351 rsubmixOutMix.profiles = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000352 c.ports.push_back(rsubmixOutMix);
353
354 AudioPort rsubmixInMix =
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700355 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(20, 10));
David Lib089c0c2023-08-10 12:47:44 +0800356 rsubmixInMix.profiles = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000357 c.ports.push_back(rsubmixInMix);
358
359 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
360 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
361
362 return c;
363 }();
364 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000365}
366
jiabinb309d8d2023-01-20 19:07:15 +0000367// Usb configuration:
368//
369// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700370// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
371// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000372// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
373// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700374// * "USB Device In", IN_DEVICE, CONNECTION_USB
375// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000376// * "USB Headset In", IN_HEADSET, CONNECTION_USB
377// - no profiles specified
378//
379// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700380// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000381// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700382// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000383// - no profiles specified
384//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700385// Routes:
386// * "usb_device output" -> "USB Device Out"
387// * "usb_device output" -> "USB Headset Out"
388// * "USB Device In", "USB Headset In" -> "usb_device input"
389//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700390// Profiles for device port connected state (when simulating connections):
Mikhail Naganov521fc492023-07-11 17:24:08 -0700391// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000392// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
393// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700394// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000395// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
396// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
397//
398std::unique_ptr<Configuration> getUsbConfiguration() {
399 static const Configuration configuration = []() {
400 const std::vector<AudioProfile> standardPcmAudioProfiles = {
401 createProfile(PcmType::INT_16_BIT,
402 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
403 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
404 {44100, 48000}),
405 createProfile(PcmType::INT_24_BIT,
406 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
407 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
408 {44100, 48000})};
409 Configuration c;
410
411 // Device ports
412
Mikhail Naganov521fc492023-07-11 17:24:08 -0700413 AudioPort usbOutDevice =
414 createPort(c.nextPortId++, "USB Device Out", 0, false,
415 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
416 AudioDeviceDescription::CONNECTION_USB));
417 c.ports.push_back(usbOutDevice);
418 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
419
jiabinb309d8d2023-01-20 19:07:15 +0000420 AudioPort usbOutHeadset =
421 createPort(c.nextPortId++, "USB Headset Out", 0, false,
422 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
423 AudioDeviceDescription::CONNECTION_USB));
424 c.ports.push_back(usbOutHeadset);
425 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
426
Mikhail Naganov521fc492023-07-11 17:24:08 -0700427 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
428 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
429 AudioDeviceDescription::CONNECTION_USB));
430 c.ports.push_back(usbInDevice);
431 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
432
jiabinb309d8d2023-01-20 19:07:15 +0000433 AudioPort usbInHeadset =
434 createPort(c.nextPortId++, "USB Headset In", 0, true,
435 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
436 AudioDeviceDescription::CONNECTION_USB));
437 c.ports.push_back(usbInHeadset);
438 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
439
440 // Mix ports
441
Mikhail Naganov521fc492023-07-11 17:24:08 -0700442 AudioPort usbDeviceOutMix =
443 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
444 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000445
Mikhail Naganov521fc492023-07-11 17:24:08 -0700446 AudioPort usbDeviceInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700447 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(0, 1));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700448 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000449
Mikhail Naganov521fc492023-07-11 17:24:08 -0700450 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
451 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
452 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
453
454 return c;
455 }();
456 return std::make_unique<Configuration>(configuration);
457}
458
459// Stub configuration:
460//
461// Device ports:
462// * "Test Out", OUT_AFE_PROXY
463// - no profiles specified
464// * "Test In", IN_AFE_PROXY
465// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700466// * "Wired Headset", OUT_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700467// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700468// * "Wired Headset Mic", IN_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700469// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700470//
471// Mix ports:
472// * "test output", 1 max open, 1 max active stream
473// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700474// * "test fast output", 1 max open, 1 max active stream
475// - profile PCM 24-bit; STEREO; 44100, 48000
476// * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
477// stream
Mikhail Naganov521fc492023-07-11 17:24:08 -0700478// - profile MP3; MONO, STEREO; 44100, 48000
479// * "test input", 2 max open, 2 max active streams
480// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700481// 8000, 11025, 16000, 22050, 32000, 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700482//
483// Routes:
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700484// "test output", "test fast output", "test compressed offload" -> "Test Out"
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700485// "test output" -> "Wired Headset"
486// "Test In", "Wired Headset Mic" -> "test input"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700487//
488// Initial port configs:
489// * "Test Out" device port: PCM 24-bit; STEREO; 48000
490// * "Test In" device port: PCM 24-bit; MONO; 48000
491//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700492// Profiles for device port connected state (when simulating connections):
493// * "Wired Headset": dynamic profiles
494// * "Wired Headset Mic": dynamic profiles
495//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700496std::unique_ptr<Configuration> getStubConfiguration() {
497 static const Configuration configuration = []() {
498 Configuration c;
499
500 // Device ports
501
502 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
503 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
504 c.ports.push_back(testOutDevice);
505 c.initialConfigs.push_back(
506 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
507 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
508 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
509
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700510 AudioPort headsetOutDevice =
511 createPort(c.nextPortId++, "Wired Headset", 0, false,
512 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
513 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700514 c.ports.push_back(headsetOutDevice);
515
Mikhail Naganov521fc492023-07-11 17:24:08 -0700516 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
517 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
518 c.ports.push_back(testInDevice);
519 c.initialConfigs.push_back(
520 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
521 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
522 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
523
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700524 AudioPort headsetInDevice =
525 createPort(c.nextPortId++, "Wired Headset Mic", 0, true,
526 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
527 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700528 c.ports.push_back(headsetInDevice);
529
Mikhail Naganov521fc492023-07-11 17:24:08 -0700530 // Mix ports
531
532 AudioPort testOutMix =
533 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
534 testOutMix.profiles.push_back(
535 createProfile(PcmType::INT_24_BIT,
536 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
537 {8000, 11025, 16000, 32000, 44100, 48000}));
538 c.ports.push_back(testOutMix);
539
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700540 AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
541 makeBitPositionFlagMask({AudioOutputFlags::FAST}),
542 false, createPortMixExt(1, 1));
543 testFastOutMix.profiles.push_back(createProfile(
544 PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
545 c.ports.push_back(testFastOutMix);
546
Mikhail Naganov521fc492023-07-11 17:24:08 -0700547 AudioPort compressedOffloadOutMix =
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700548 createPort(c.nextPortId++, "test compressed offload",
Mikhail Naganov521fc492023-07-11 17:24:08 -0700549 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
550 AudioOutputFlags::COMPRESS_OFFLOAD,
551 AudioOutputFlags::NON_BLOCKING}),
552 false, createPortMixExt(1, 1));
553 compressedOffloadOutMix.profiles.push_back(
554 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
555 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
556 {44100, 48000}));
557 c.ports.push_back(compressedOffloadOutMix);
558
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700559 AudioPort testInMix =
Mikhail Naganov521fc492023-07-11 17:24:08 -0700560 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700561 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700562 createProfile(PcmType::INT_16_BIT,
563 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
564 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700565 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700566 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700567 createProfile(PcmType::INT_24_BIT,
568 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
569 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700570 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700571 c.ports.push_back(testInMix);
Mikhail Naganov521fc492023-07-11 17:24:08 -0700572
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700573 c.routes.push_back(
574 createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700575 c.routes.push_back(createRoute({testOutMix}, headsetOutDevice));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700576 c.routes.push_back(createRoute({testInDevice, headsetInDevice}, testInMix));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700577
578 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000579
580 return c;
581 }();
582 return std::make_unique<Configuration>(configuration);
583}
584
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700585// Bluetooth configuration:
586//
587// Device ports:
588// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
589// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700590// * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700591// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
592// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
593// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
594// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
595// - no profiles specified
596//
597// Mix ports:
598// * "a2dp output", 1 max open, 1 max active stream
599// - no profiles specified
600// * "hearing aid output", 1 max open, 1 max active stream
601// - profile PCM 16-bit; STEREO; 16000, 24000
602//
603// Routes:
604// "a2dp output" -> "BT A2DP Out"
605// "a2dp output" -> "BT A2DP Headphones"
606// "a2dp output" -> "BT A2DP Speaker"
607// "hearing aid output" -> "BT Hearing Aid Out"
608//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700609// Profiles for device port connected state (when simulating connections):
610// * "BT A2DP Out", "BT A2DP Headphones", "BT A2DP Speaker":
611// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
612// * "BT Hearing Aid Out":
613// - profile PCM 16-bit; STEREO; 16000, 24000
614//
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700615std::unique_ptr<Configuration> getBluetoothConfiguration() {
616 static const Configuration configuration = []() {
617 const std::vector<AudioProfile> standardPcmAudioProfiles = {
618 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
619 {44100, 48000, 88200, 96000})};
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700620 const std::vector<AudioProfile> hearingAidAudioProfiles = {createProfile(
621 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000})};
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700622 Configuration c;
623
624 // Device ports
625 AudioPort btOutDevice =
626 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
627 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
628 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700629 btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
630 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700631 c.ports.push_back(btOutDevice);
632 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
633
634 AudioPort btOutHeadphone =
635 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700636 createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700637 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700638 btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
639 standardPcmAudioProfiles.begin(),
640 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700641 c.ports.push_back(btOutHeadphone);
642 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
643
644 AudioPort btOutSpeaker =
645 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
646 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
647 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700648 btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
649 standardPcmAudioProfiles.begin(),
650 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700651 c.ports.push_back(btOutSpeaker);
652 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
653
654 AudioPort btOutHearingAid =
655 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
656 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
657 AudioDeviceDescription::CONNECTION_WIRELESS));
658 c.ports.push_back(btOutHearingAid);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700659 c.connectedProfiles[btOutHearingAid.id] = hearingAidAudioProfiles;
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700660
661 // Mix ports
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700662 AudioPort btOutMix =
663 createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
664 c.ports.push_back(btOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700665
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700666 AudioPort btHearingOutMix =
667 createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700668 btHearingOutMix.profiles = hearingAidAudioProfiles;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700669 c.ports.push_back(btHearingOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700670
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700671 c.routes.push_back(createRoute({btOutMix}, btOutDevice));
672 c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
673 c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
674 c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700675
676 return c;
677 }();
678 return std::make_unique<Configuration>(configuration);
679}
680
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +0000681std::unique_ptr<Module::Configuration> getConfiguration(Module::Type moduleType) {
682 switch (moduleType) {
683 case Module::Type::DEFAULT:
684 return getPrimaryConfiguration();
685 case Module::Type::R_SUBMIX:
686 return getRSubmixConfiguration();
687 case Module::Type::STUB:
688 return getStubConfiguration();
689 case Module::Type::USB:
690 return getUsbConfiguration();
691 case Module::Type::BLUETOOTH:
692 return getBluetoothConfiguration();
693 }
694}
695
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000696} // namespace aidl::android::hardware::audio::core::internal