blob: 0ff8eb4e185545384d8448de07a4849aef217369 [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;
44using aidl::android::media::audio::common::PcmType;
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +000045using Configuration = aidl::android::hardware::audio::core::Module::Configuration;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000046
47namespace aidl::android::hardware::audio::core::internal {
48
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000049static void fillProfile(AudioProfile* profile, const std::vector<int32_t>& channelLayouts,
50 const std::vector<int32_t>& sampleRates) {
51 for (auto layout : channelLayouts) {
52 profile->channelMasks.push_back(
53 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout));
54 }
55 profile->sampleRates.insert(profile->sampleRates.end(), sampleRates.begin(), sampleRates.end());
56}
57
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000058static AudioProfile createProfile(PcmType pcmType, const std::vector<int32_t>& channelLayouts,
59 const std::vector<int32_t>& sampleRates) {
60 AudioProfile profile;
61 profile.format.type = AudioFormatType::PCM;
62 profile.format.pcm = pcmType;
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000063 fillProfile(&profile, channelLayouts, sampleRates);
64 return profile;
65}
66
67static AudioProfile createProfile(const std::string& encodingType,
68 const std::vector<int32_t>& channelLayouts,
69 const std::vector<int32_t>& sampleRates) {
70 AudioProfile profile;
71 profile.format.encoding = encodingType;
72 fillProfile(&profile, channelLayouts, sampleRates);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000073 return profile;
74}
75
Mikhail Naganov00603d12022-05-02 22:52:13 +000076static AudioPortExt createDeviceExt(AudioDeviceType devType, int32_t flags,
77 std::string connection = "") {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000078 AudioPortDeviceExt deviceExt;
79 deviceExt.device.type.type = devType;
Mikhail Naganovb0f3d972023-01-27 16:08:29 -080080 if (devType == AudioDeviceType::IN_MICROPHONE && connection.empty()) {
81 deviceExt.device.address = "bottom";
82 } else if (devType == AudioDeviceType::IN_MICROPHONE_BACK && connection.empty()) {
83 deviceExt.device.address = "back";
84 }
Mikhail Naganov00603d12022-05-02 22:52:13 +000085 deviceExt.device.type.connection = std::move(connection);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000086 deviceExt.flags = flags;
87 return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
88}
89
90static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
91 AudioPortMixExt mixExt;
92 mixExt.maxOpenStreamCount = maxOpenStreamCount;
93 mixExt.maxActiveStreamCount = maxActiveStreamCount;
94 return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
95}
96
97static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
98 const AudioPortExt& ext) {
99 AudioPort port;
100 port.id = id;
101 port.name = name;
102 port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
103 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
104 port.ext = ext;
105 return port;
106}
107
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700108static AudioPortConfig createDynamicPortConfig(int32_t id, int32_t portId, int32_t flags,
109 bool isInput, const AudioPortExt& ext) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000110 AudioPortConfig config;
111 config.id = id;
112 config.portId = portId;
jiabin129b1452024-01-31 23:56:26 +0000113 config.format = AudioFormatDescription{};
114 config.channelMask = AudioChannelLayout{};
115 config.sampleRate = Int{.value = 0};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000116 config.gain = AudioGainConfig();
117 config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
118 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
119 config.ext = ext;
120 return config;
121}
122
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700123static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
124 int32_t sampleRate, int32_t flags, bool isInput,
125 const AudioPortExt& ext) {
126 AudioPortConfig config = createDynamicPortConfig(id, portId, flags, isInput, ext);
127 config.sampleRate = Int{.value = sampleRate};
128 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
129 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
130 return config;
131}
132
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000133static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000134 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000135 route.sinkPortId = sink.id;
136 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
137 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000138 return route;
139}
140
Lorena Torres-Huertaf7492512023-01-14 02:49:41 +0000141std::vector<AudioProfile> getStandard16And24BitPcmAudioProfiles() {
142 auto createStdPcmAudioProfile = [](const PcmType& pcmType) {
143 return AudioProfile{
144 .format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType},
145 .channelMasks = {AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
146 AudioChannelLayout::LAYOUT_MONO),
147 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
148 AudioChannelLayout::LAYOUT_STEREO)},
149 .sampleRates = {8000, 11025, 16000, 32000, 44100, 48000}};
150 };
151 return {
152 createStdPcmAudioProfile(PcmType::INT_16_BIT),
153 createStdPcmAudioProfile(PcmType::INT_24_BIT),
154 };
155}
156
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000157// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000158//
159// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000160// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000161// - no profiles specified
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700162// * "Built-In Mic", IN_MICROPHONE, default
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000163// - no profiles specified
164// * "Telephony Tx", OUT_TELEPHONY_TX
165// - no profiles specified
166// * "Telephony Rx", IN_TELEPHONY_RX
167// - no profiles specified
168// * "FM Tuner", IN_FM_TUNER
169// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000170//
171// Mix ports:
172// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000173// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700174// * "primary input", 1 max open, 1 max active stream
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700175// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000176// * "telephony_tx", 1 max open, 1 max active stream
177// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000178// * "telephony_rx", 1 max open, 1 max active stream
179// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000180// * "fm_tuner", 1 max open, 1 max active stream
181// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000182//
183// Routes:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700184// "primary out" -> "Speaker"
185// "Built-In Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000186// "Telephony Rx" -> "telephony_rx"
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700187// "telephony_tx" -> "Telephony Tx"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000188// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000189//
190// Initial port configs:
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700191// * "Speaker" device port: dynamic configuration
192// * "Built-In Mic" device port: dynamic configuration
193// * "Telephony Tx" device port: dynamic configuration
194// * "Telephony Rx" device port: dynamic configuration
195// * "FM Tuner" device port: dynamic configuration
Mikhail Naganov00603d12022-05-02 22:52:13 +0000196//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000197std::unique_ptr<Configuration> getPrimaryConfiguration() {
198 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000199 const std::vector<AudioProfile> standardPcmAudioProfiles = {
200 createProfile(PcmType::INT_16_BIT,
201 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000202 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000203 Configuration c;
204
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000205 // Device ports
206
207 AudioPort speakerOutDevice =
208 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000209 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
210 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000211 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000212 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700213 createDynamicPortConfig(speakerOutDevice.id, speakerOutDevice.id, 0, false,
214 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000215
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000216 AudioPort micInDevice =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700217 createPort(c.nextPortId++, "Built-In Mic", 0, true,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000218 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
219 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
220 c.ports.push_back(micInDevice);
221 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700222 createDynamicPortConfig(micInDevice.id, micInDevice.id, 0, true,
223 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000224
225 AudioPort telephonyTxOutDevice =
226 createPort(c.nextPortId++, "Telephony Tx", 0, false,
227 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
228 c.ports.push_back(telephonyTxOutDevice);
229 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700230 createDynamicPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id, 0, false,
231 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000232
233 AudioPort telephonyRxInDevice =
234 createPort(c.nextPortId++, "Telephony Rx", 0, true,
235 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
236 c.ports.push_back(telephonyRxInDevice);
237 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700238 createDynamicPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id, 0, true,
239 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000240
241 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
242 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
243 c.ports.push_back(fmTunerInDevice);
244 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700245 createDynamicPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, 0, true,
246 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000247
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000248 // Mix ports
249
Mikhail Naganov00603d12022-05-02 22:52:13 +0000250 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000251 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Shunkai Yao24618912023-08-18 23:58:05 +0000252 false, createPortMixExt(0, 0));
Mikhail Naganov00603d12022-05-02 22:52:13 +0000253 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
254 standardPcmAudioProfiles.begin(),
255 standardPcmAudioProfiles.end());
256 c.ports.push_back(primaryOutMix);
257
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000258 AudioPort primaryInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700259 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(0, 1));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000260 primaryInMix.profiles.push_back(
261 createProfile(PcmType::INT_16_BIT,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700262 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
263 {8000, 11025, 16000, 32000, 44100, 48000}));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000264 c.ports.push_back(primaryInMix);
265
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000266 AudioPort telephonyTxOutMix =
267 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
268 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
269 standardPcmAudioProfiles.begin(),
270 standardPcmAudioProfiles.end());
271 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000272
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000273 AudioPort telephonyRxInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700274 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000275 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
276 standardPcmAudioProfiles.begin(),
277 standardPcmAudioProfiles.end());
278 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000279
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000280 AudioPort fmTunerInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700281 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000282 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
283 standardPcmAudioProfiles.begin(),
284 standardPcmAudioProfiles.end());
285 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000286
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700287 c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700288 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000289 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700290 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000291 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000292
293 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000294
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000295 return c;
296 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000297 return std::make_unique<Configuration>(configuration);
298}
299
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700300// Note: When transitioning to loading of XML configs, either keep the configuration
301// of the remote submix sources from this static configuration, or update the XML
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700302// config to match it. There are several reasons for that:
303// 1. The "Remote Submix In" device is listed in the XML config as "attached",
304// however in the AIDL scheme its device type has a "virtual" connection.
305// 2. The canonical r_submix configuration only lists 'STEREO' and '48000',
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700306// however the framework attempts to open streams for other sample rates
307// as well. The legacy r_submix implementation allowed that, but libaudiohal@aidl
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800308// will not find a mix port to use. Because of that, list all sample rates that
309// the legacy implementation allowed (note that mono was not allowed, the framework
310// is expected to upmix mono tracks into stereo if needed).
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700311// 3. The legacy implementation had a hard limit on the number of routes (10),
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700312// and this is checked indirectly by AudioPlaybackCaptureTest#testPlaybackCaptureDoS
313// CTS test. Instead of hardcoding the number of routes, we can use
314// "maxOpen/ActiveStreamCount" to enforce a similar limit. However, the canonical
315// XML file lacks this specification.
316//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000317// Remote Submix configuration:
318//
319// Device ports:
320// * "Remote Submix Out", OUT_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800321// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000322// * "Remote Submix In", IN_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800323// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000324//
325// Mix ports:
Mikhail Naganov06085452023-11-27 17:28:51 -0800326// * "r_submix output", maximum 10 opened streams, maximum 10 active streams
Dean Wheatley488ea4e2024-02-13 05:39:47 +1100327// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
Mikhail Naganov06085452023-11-27 17:28:51 -0800328// * "r_submix input", maximum 10 opened streams, maximum 10 active streams
Dean Wheatley488ea4e2024-02-13 05:39:47 +1100329// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000330//
331// Routes:
Mikhail Naganov27719f12023-12-21 16:10:52 -0800332// "r_submix output" -> "Remote Submix Out"
333// "Remote Submix In" -> "r_submix input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000334//
335std::unique_ptr<Configuration> getRSubmixConfiguration() {
336 static const Configuration configuration = []() {
337 Configuration c;
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800338 const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
339 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
Dean Wheatley488ea4e2024-02-13 05:39:47 +1100340 {8000, 11025, 16000, 32000, 44100, 48000, 192000})};
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000341
342 // Device ports
343
Mikhail Naganov26526f12023-05-12 13:51:06 -0700344 AudioPort rsubmixOutDevice =
345 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
346 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
347 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000348 c.ports.push_back(rsubmixOutDevice);
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800349 c.connectedProfiles[rsubmixOutDevice.id] = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000350
David Lib089c0c2023-08-10 12:47:44 +0800351 AudioPort rsubmixInDevice =
352 createPort(c.nextPortId++, "Remote Submix In", 0, true,
353 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0,
354 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000355 c.ports.push_back(rsubmixInDevice);
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800356 c.connectedProfiles[rsubmixInDevice.id] = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000357
358 // Mix ports
359
360 AudioPort rsubmixOutMix =
Mikhail Naganov06085452023-11-27 17:28:51 -0800361 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(10, 10));
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800362 rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000363 c.ports.push_back(rsubmixOutMix);
364
365 AudioPort rsubmixInMix =
Mikhail Naganov06085452023-11-27 17:28:51 -0800366 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800367 rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000368 c.ports.push_back(rsubmixInMix);
369
Mikhail Naganov27719f12023-12-21 16:10:52 -0800370 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000371 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
372
373 return c;
374 }();
375 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000376}
377
jiabinb309d8d2023-01-20 19:07:15 +0000378// Usb configuration:
379//
380// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700381// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
382// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000383// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
384// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700385// * "USB Device In", IN_DEVICE, CONNECTION_USB
386// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000387// * "USB Headset In", IN_HEADSET, CONNECTION_USB
388// - no profiles specified
389//
390// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700391// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000392// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700393// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000394// - no profiles specified
395//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700396// Routes:
397// * "usb_device output" -> "USB Device Out"
398// * "usb_device output" -> "USB Headset Out"
399// * "USB Device In", "USB Headset In" -> "usb_device input"
400//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700401// Profiles for device port connected state (when simulating connections):
Mikhail Naganov521fc492023-07-11 17:24:08 -0700402// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000403// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
404// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700405// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000406// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
407// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
408//
409std::unique_ptr<Configuration> getUsbConfiguration() {
410 static const Configuration configuration = []() {
411 const std::vector<AudioProfile> standardPcmAudioProfiles = {
412 createProfile(PcmType::INT_16_BIT,
413 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
414 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
415 {44100, 48000}),
416 createProfile(PcmType::INT_24_BIT,
417 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
418 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
419 {44100, 48000})};
420 Configuration c;
421
422 // Device ports
423
Mikhail Naganov521fc492023-07-11 17:24:08 -0700424 AudioPort usbOutDevice =
425 createPort(c.nextPortId++, "USB Device Out", 0, false,
426 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
427 AudioDeviceDescription::CONNECTION_USB));
428 c.ports.push_back(usbOutDevice);
429 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
430
jiabinb309d8d2023-01-20 19:07:15 +0000431 AudioPort usbOutHeadset =
432 createPort(c.nextPortId++, "USB Headset Out", 0, false,
433 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
434 AudioDeviceDescription::CONNECTION_USB));
435 c.ports.push_back(usbOutHeadset);
436 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
437
Mikhail Naganov521fc492023-07-11 17:24:08 -0700438 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
439 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
440 AudioDeviceDescription::CONNECTION_USB));
441 c.ports.push_back(usbInDevice);
442 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
443
jiabinb309d8d2023-01-20 19:07:15 +0000444 AudioPort usbInHeadset =
445 createPort(c.nextPortId++, "USB Headset In", 0, true,
446 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
447 AudioDeviceDescription::CONNECTION_USB));
448 c.ports.push_back(usbInHeadset);
449 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
450
451 // Mix ports
452
Mikhail Naganov521fc492023-07-11 17:24:08 -0700453 AudioPort usbDeviceOutMix =
454 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
455 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000456
Mikhail Naganov521fc492023-07-11 17:24:08 -0700457 AudioPort usbDeviceInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700458 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(0, 1));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700459 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000460
Mikhail Naganov521fc492023-07-11 17:24:08 -0700461 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
462 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
463 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
464
465 return c;
466 }();
467 return std::make_unique<Configuration>(configuration);
468}
469
470// Stub configuration:
471//
472// Device ports:
473// * "Test Out", OUT_AFE_PROXY
474// - no profiles specified
475// * "Test In", IN_AFE_PROXY
476// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700477// * "Wired Headset", OUT_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700478// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700479// * "Wired Headset Mic", IN_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700480// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700481//
482// Mix ports:
483// * "test output", 1 max open, 1 max active stream
484// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700485// * "test fast output", 1 max open, 1 max active stream
486// - profile PCM 24-bit; STEREO; 44100, 48000
487// * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
488// stream
Mikhail Naganov521fc492023-07-11 17:24:08 -0700489// - profile MP3; MONO, STEREO; 44100, 48000
490// * "test input", 2 max open, 2 max active streams
491// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700492// 8000, 11025, 16000, 22050, 32000, 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700493//
494// Routes:
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700495// "test output", "test fast output", "test compressed offload" -> "Test Out"
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700496// "test output" -> "Wired Headset"
497// "Test In", "Wired Headset Mic" -> "test input"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700498//
499// Initial port configs:
500// * "Test Out" device port: PCM 24-bit; STEREO; 48000
501// * "Test In" device port: PCM 24-bit; MONO; 48000
502//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700503// Profiles for device port connected state (when simulating connections):
504// * "Wired Headset": dynamic profiles
505// * "Wired Headset Mic": dynamic profiles
506//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700507std::unique_ptr<Configuration> getStubConfiguration() {
508 static const Configuration configuration = []() {
509 Configuration c;
510
511 // Device ports
512
513 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
514 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
515 c.ports.push_back(testOutDevice);
516 c.initialConfigs.push_back(
517 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
518 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
519 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
520
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700521 AudioPort headsetOutDevice =
522 createPort(c.nextPortId++, "Wired Headset", 0, false,
523 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
524 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700525 c.ports.push_back(headsetOutDevice);
526
Mikhail Naganov521fc492023-07-11 17:24:08 -0700527 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
528 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
529 c.ports.push_back(testInDevice);
530 c.initialConfigs.push_back(
531 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
532 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
533 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
534
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700535 AudioPort headsetInDevice =
536 createPort(c.nextPortId++, "Wired Headset Mic", 0, true,
537 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
538 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700539 c.ports.push_back(headsetInDevice);
540
Mikhail Naganov521fc492023-07-11 17:24:08 -0700541 // Mix ports
542
543 AudioPort testOutMix =
544 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
545 testOutMix.profiles.push_back(
546 createProfile(PcmType::INT_24_BIT,
547 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
548 {8000, 11025, 16000, 32000, 44100, 48000}));
549 c.ports.push_back(testOutMix);
550
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700551 AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
552 makeBitPositionFlagMask({AudioOutputFlags::FAST}),
553 false, createPortMixExt(1, 1));
554 testFastOutMix.profiles.push_back(createProfile(
555 PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
556 c.ports.push_back(testFastOutMix);
557
Mikhail Naganov521fc492023-07-11 17:24:08 -0700558 AudioPort compressedOffloadOutMix =
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700559 createPort(c.nextPortId++, "test compressed offload",
Mikhail Naganov521fc492023-07-11 17:24:08 -0700560 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
561 AudioOutputFlags::COMPRESS_OFFLOAD,
562 AudioOutputFlags::NON_BLOCKING}),
563 false, createPortMixExt(1, 1));
564 compressedOffloadOutMix.profiles.push_back(
565 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
566 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
567 {44100, 48000}));
568 c.ports.push_back(compressedOffloadOutMix);
569
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700570 AudioPort testInMix =
Mikhail Naganov521fc492023-07-11 17:24:08 -0700571 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700572 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700573 createProfile(PcmType::INT_16_BIT,
574 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
575 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700576 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700577 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700578 createProfile(PcmType::INT_24_BIT,
579 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
580 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700581 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700582 c.ports.push_back(testInMix);
Mikhail Naganov521fc492023-07-11 17:24:08 -0700583
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700584 c.routes.push_back(
585 createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700586 c.routes.push_back(createRoute({testOutMix}, headsetOutDevice));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700587 c.routes.push_back(createRoute({testInDevice, headsetInDevice}, testInMix));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700588
589 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000590
591 return c;
592 }();
593 return std::make_unique<Configuration>(configuration);
594}
595
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700596// Bluetooth configuration:
597//
598// Device ports:
599// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
600// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700601// * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700602// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
603// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
604// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
605// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
606// - no profiles specified
607//
608// Mix ports:
609// * "a2dp output", 1 max open, 1 max active stream
610// - no profiles specified
611// * "hearing aid output", 1 max open, 1 max active stream
612// - profile PCM 16-bit; STEREO; 16000, 24000
613//
614// Routes:
615// "a2dp output" -> "BT A2DP Out"
616// "a2dp output" -> "BT A2DP Headphones"
617// "a2dp output" -> "BT A2DP Speaker"
618// "hearing aid output" -> "BT Hearing Aid Out"
619//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700620// Profiles for device port connected state (when simulating connections):
621// * "BT A2DP Out", "BT A2DP Headphones", "BT A2DP Speaker":
622// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
623// * "BT Hearing Aid Out":
624// - profile PCM 16-bit; STEREO; 16000, 24000
625//
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700626std::unique_ptr<Configuration> getBluetoothConfiguration() {
627 static const Configuration configuration = []() {
628 const std::vector<AudioProfile> standardPcmAudioProfiles = {
629 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
630 {44100, 48000, 88200, 96000})};
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700631 const std::vector<AudioProfile> hearingAidAudioProfiles = {createProfile(
632 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000})};
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700633 Configuration c;
634
635 // Device ports
636 AudioPort btOutDevice =
637 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
638 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
639 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700640 btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
641 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700642 c.ports.push_back(btOutDevice);
643 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
644
645 AudioPort btOutHeadphone =
646 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700647 createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700648 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700649 btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
650 standardPcmAudioProfiles.begin(),
651 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700652 c.ports.push_back(btOutHeadphone);
653 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
654
655 AudioPort btOutSpeaker =
656 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
657 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
658 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700659 btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
660 standardPcmAudioProfiles.begin(),
661 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700662 c.ports.push_back(btOutSpeaker);
663 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
664
665 AudioPort btOutHearingAid =
666 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
667 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
668 AudioDeviceDescription::CONNECTION_WIRELESS));
669 c.ports.push_back(btOutHearingAid);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700670 c.connectedProfiles[btOutHearingAid.id] = hearingAidAudioProfiles;
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700671
672 // Mix ports
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700673 AudioPort btOutMix =
674 createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
675 c.ports.push_back(btOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700676
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700677 AudioPort btHearingOutMix =
678 createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700679 btHearingOutMix.profiles = hearingAidAudioProfiles;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700680 c.ports.push_back(btHearingOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700681
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700682 c.routes.push_back(createRoute({btOutMix}, btOutDevice));
683 c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
684 c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
685 c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700686
687 return c;
688 }();
689 return std::make_unique<Configuration>(configuration);
690}
691
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +0000692std::unique_ptr<Module::Configuration> getConfiguration(Module::Type moduleType) {
693 switch (moduleType) {
694 case Module::Type::DEFAULT:
695 return getPrimaryConfiguration();
696 case Module::Type::R_SUBMIX:
697 return getRSubmixConfiguration();
698 case Module::Type::STUB:
699 return getStubConfiguration();
700 case Module::Type::USB:
701 return getUsbConfiguration();
702 case Module::Type::BLUETOOTH:
703 return getBluetoothConfiguration();
704 }
705}
706
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000707} // namespace aidl::android::hardware::audio::core::internal