blob: cf5f066c7ca04628451b4d7b0b7b32c67c115db5 [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;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000113 config.gain = AudioGainConfig();
114 config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
115 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
116 config.ext = ext;
117 return config;
118}
119
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700120static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
121 int32_t sampleRate, int32_t flags, bool isInput,
122 const AudioPortExt& ext) {
123 AudioPortConfig config = createDynamicPortConfig(id, portId, flags, isInput, ext);
124 config.sampleRate = Int{.value = sampleRate};
125 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
126 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
127 return config;
128}
129
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000130static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000131 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000132 route.sinkPortId = sink.id;
133 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
134 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000135 return route;
136}
137
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000138// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000139//
140// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000141// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000142// - no profiles specified
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700143// * "Built-In Mic", IN_MICROPHONE, default
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000144// - no profiles specified
145// * "Telephony Tx", OUT_TELEPHONY_TX
146// - no profiles specified
147// * "Telephony Rx", IN_TELEPHONY_RX
148// - no profiles specified
149// * "FM Tuner", IN_FM_TUNER
150// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000151//
152// Mix ports:
153// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000154// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700155// * "primary input", 1 max open, 1 max active stream
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700156// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000157// * "telephony_tx", 1 max open, 1 max active stream
158// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000159// * "telephony_rx", 1 max open, 1 max active stream
160// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000161// * "fm_tuner", 1 max open, 1 max active stream
162// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000163//
164// Routes:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700165// "primary out" -> "Speaker"
166// "Built-In Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000167// "Telephony Rx" -> "telephony_rx"
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700168// "telephony_tx" -> "Telephony Tx"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000169// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000170//
171// Initial port configs:
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700172// * "Speaker" device port: dynamic configuration
173// * "Built-In Mic" device port: dynamic configuration
174// * "Telephony Tx" device port: dynamic configuration
175// * "Telephony Rx" device port: dynamic configuration
176// * "FM Tuner" device port: dynamic configuration
Mikhail Naganov00603d12022-05-02 22:52:13 +0000177//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000178std::unique_ptr<Configuration> getPrimaryConfiguration() {
179 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000180 const std::vector<AudioProfile> standardPcmAudioProfiles = {
181 createProfile(PcmType::INT_16_BIT,
182 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000183 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000184 Configuration c;
185
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000186 // Device ports
187
188 AudioPort speakerOutDevice =
189 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000190 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
191 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000192 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000193 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700194 createDynamicPortConfig(speakerOutDevice.id, speakerOutDevice.id, 0, false,
195 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000196
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000197 AudioPort micInDevice =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700198 createPort(c.nextPortId++, "Built-In Mic", 0, true,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000199 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
200 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
201 c.ports.push_back(micInDevice);
202 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700203 createDynamicPortConfig(micInDevice.id, micInDevice.id, 0, true,
204 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000205
206 AudioPort telephonyTxOutDevice =
207 createPort(c.nextPortId++, "Telephony Tx", 0, false,
208 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
209 c.ports.push_back(telephonyTxOutDevice);
210 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700211 createDynamicPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id, 0, false,
212 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000213
214 AudioPort telephonyRxInDevice =
215 createPort(c.nextPortId++, "Telephony Rx", 0, true,
216 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
217 c.ports.push_back(telephonyRxInDevice);
218 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700219 createDynamicPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id, 0, true,
220 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000221
222 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
223 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
224 c.ports.push_back(fmTunerInDevice);
225 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700226 createDynamicPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, 0, true,
227 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000228
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000229 // Mix ports
230
Mikhail Naganov00603d12022-05-02 22:52:13 +0000231 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000232 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Shunkai Yao24618912023-08-18 23:58:05 +0000233 false, createPortMixExt(0, 0));
Mikhail Naganov00603d12022-05-02 22:52:13 +0000234 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
235 standardPcmAudioProfiles.begin(),
236 standardPcmAudioProfiles.end());
237 c.ports.push_back(primaryOutMix);
238
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000239 AudioPort primaryInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700240 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(0, 1));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000241 primaryInMix.profiles.push_back(
242 createProfile(PcmType::INT_16_BIT,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700243 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
244 {8000, 11025, 16000, 32000, 44100, 48000}));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000245 c.ports.push_back(primaryInMix);
246
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000247 AudioPort telephonyTxOutMix =
248 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
249 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
250 standardPcmAudioProfiles.begin(),
251 standardPcmAudioProfiles.end());
252 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000253
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000254 AudioPort telephonyRxInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700255 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000256 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
257 standardPcmAudioProfiles.begin(),
258 standardPcmAudioProfiles.end());
259 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000260
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000261 AudioPort fmTunerInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700262 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000263 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
264 standardPcmAudioProfiles.begin(),
265 standardPcmAudioProfiles.end());
266 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000267
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700268 c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700269 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000270 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700271 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000272 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000273
274 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000275
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000276 return c;
277 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000278 return std::make_unique<Configuration>(configuration);
279}
280
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700281// Note: When transitioning to loading of XML configs, either keep the configuration
282// of the remote submix sources from this static configuration, or update the XML
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700283// config to match it. There are several reasons for that:
284// 1. The "Remote Submix In" device is listed in the XML config as "attached",
285// however in the AIDL scheme its device type has a "virtual" connection.
286// 2. The canonical r_submix configuration only lists 'STEREO' and '48000',
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700287// however the framework attempts to open streams for other sample rates
288// as well. The legacy r_submix implementation allowed that, but libaudiohal@aidl
289// will not find a mix port to use. Because of that, list all channel
290// masks and sample rates that the legacy implementation allowed.
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700291// 3. The legacy implementation had a hard limit on the number of routes (10),
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700292// and this is checked indirectly by AudioPlaybackCaptureTest#testPlaybackCaptureDoS
293// CTS test. Instead of hardcoding the number of routes, we can use
294// "maxOpen/ActiveStreamCount" to enforce a similar limit. However, the canonical
295// XML file lacks this specification.
296//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000297// Remote Submix configuration:
298//
299// Device ports:
300// * "Remote Submix Out", OUT_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800301// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000302// * "Remote Submix In", IN_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800303// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000304//
305// Mix ports:
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700306// * "r_submix output", maximum 20 opened streams, maximum 10 active streams
David Lib089c0c2023-08-10 12:47:44 +0800307// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700308// * "r_submix input", maximum 20 opened streams, maximum 10 active streams
David Lib089c0c2023-08-10 12:47:44 +0800309// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000310//
311// Routes:
312// "r_submix output" -> "Remote Submix Out"
313// "Remote Submix In" -> "r_submix input"
314//
315std::unique_ptr<Configuration> getRSubmixConfiguration() {
316 static const Configuration configuration = []() {
317 Configuration c;
David Lib089c0c2023-08-10 12:47:44 +0800318 const std::vector<AudioProfile> standardPcmAudioProfiles{
David Lib089c0c2023-08-10 12:47:44 +0800319 createProfile(PcmType::INT_16_BIT,
320 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
321 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000322
323 // Device ports
324
Mikhail Naganov26526f12023-05-12 13:51:06 -0700325 AudioPort rsubmixOutDevice =
326 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
327 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
328 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000329 c.ports.push_back(rsubmixOutDevice);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700330 c.connectedProfiles[rsubmixOutDevice.id] = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000331
David Lib089c0c2023-08-10 12:47:44 +0800332 AudioPort rsubmixInDevice =
333 createPort(c.nextPortId++, "Remote Submix In", 0, true,
334 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0,
335 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000336 c.ports.push_back(rsubmixInDevice);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700337 c.connectedProfiles[rsubmixInDevice.id] = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000338
339 // Mix ports
340
341 AudioPort rsubmixOutMix =
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700342 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(20, 10));
David Lib089c0c2023-08-10 12:47:44 +0800343 rsubmixOutMix.profiles = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000344 c.ports.push_back(rsubmixOutMix);
345
346 AudioPort rsubmixInMix =
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700347 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(20, 10));
David Lib089c0c2023-08-10 12:47:44 +0800348 rsubmixInMix.profiles = standardPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000349 c.ports.push_back(rsubmixInMix);
350
351 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
352 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
353
354 return c;
355 }();
356 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000357}
358
jiabinb309d8d2023-01-20 19:07:15 +0000359// Usb configuration:
360//
361// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700362// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
363// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000364// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
365// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700366// * "USB Device In", IN_DEVICE, CONNECTION_USB
367// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000368// * "USB Headset In", IN_HEADSET, CONNECTION_USB
369// - no profiles specified
370//
371// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700372// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000373// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700374// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000375// - no profiles specified
376//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700377// Routes:
378// * "usb_device output" -> "USB Device Out"
379// * "usb_device output" -> "USB Headset Out"
380// * "USB Device In", "USB Headset In" -> "usb_device input"
381//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700382// Profiles for device port connected state (when simulating connections):
Mikhail Naganov521fc492023-07-11 17:24:08 -0700383// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000384// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
385// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700386// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000387// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
388// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
389//
390std::unique_ptr<Configuration> getUsbConfiguration() {
391 static const Configuration configuration = []() {
392 const std::vector<AudioProfile> standardPcmAudioProfiles = {
393 createProfile(PcmType::INT_16_BIT,
394 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
395 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
396 {44100, 48000}),
397 createProfile(PcmType::INT_24_BIT,
398 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
399 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
400 {44100, 48000})};
401 Configuration c;
402
403 // Device ports
404
Mikhail Naganov521fc492023-07-11 17:24:08 -0700405 AudioPort usbOutDevice =
406 createPort(c.nextPortId++, "USB Device Out", 0, false,
407 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
408 AudioDeviceDescription::CONNECTION_USB));
409 c.ports.push_back(usbOutDevice);
410 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
411
jiabinb309d8d2023-01-20 19:07:15 +0000412 AudioPort usbOutHeadset =
413 createPort(c.nextPortId++, "USB Headset Out", 0, false,
414 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
415 AudioDeviceDescription::CONNECTION_USB));
416 c.ports.push_back(usbOutHeadset);
417 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
418
Mikhail Naganov521fc492023-07-11 17:24:08 -0700419 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
420 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
421 AudioDeviceDescription::CONNECTION_USB));
422 c.ports.push_back(usbInDevice);
423 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
424
jiabinb309d8d2023-01-20 19:07:15 +0000425 AudioPort usbInHeadset =
426 createPort(c.nextPortId++, "USB Headset In", 0, true,
427 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
428 AudioDeviceDescription::CONNECTION_USB));
429 c.ports.push_back(usbInHeadset);
430 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
431
432 // Mix ports
433
Mikhail Naganov521fc492023-07-11 17:24:08 -0700434 AudioPort usbDeviceOutMix =
435 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
436 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000437
Mikhail Naganov521fc492023-07-11 17:24:08 -0700438 AudioPort usbDeviceInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700439 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(0, 1));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700440 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000441
Mikhail Naganov521fc492023-07-11 17:24:08 -0700442 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
443 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
444 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
445
446 return c;
447 }();
448 return std::make_unique<Configuration>(configuration);
449}
450
451// Stub configuration:
452//
453// Device ports:
454// * "Test Out", OUT_AFE_PROXY
455// - no profiles specified
456// * "Test In", IN_AFE_PROXY
457// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700458// * "Wired Headset", OUT_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700459// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700460// * "Wired Headset Mic", IN_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700461// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700462//
463// Mix ports:
464// * "test output", 1 max open, 1 max active stream
465// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700466// * "test fast output", 1 max open, 1 max active stream
467// - profile PCM 24-bit; STEREO; 44100, 48000
468// * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
469// stream
Mikhail Naganov521fc492023-07-11 17:24:08 -0700470// - profile MP3; MONO, STEREO; 44100, 48000
471// * "test input", 2 max open, 2 max active streams
472// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700473// 8000, 11025, 16000, 22050, 32000, 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700474//
475// Routes:
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700476// "test output", "test fast output", "test compressed offload" -> "Test Out"
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700477// "test output" -> "Wired Headset"
478// "Test In", "Wired Headset Mic" -> "test input"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700479//
480// Initial port configs:
481// * "Test Out" device port: PCM 24-bit; STEREO; 48000
482// * "Test In" device port: PCM 24-bit; MONO; 48000
483//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700484// Profiles for device port connected state (when simulating connections):
485// * "Wired Headset": dynamic profiles
486// * "Wired Headset Mic": dynamic profiles
487//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700488std::unique_ptr<Configuration> getStubConfiguration() {
489 static const Configuration configuration = []() {
490 Configuration c;
491
492 // Device ports
493
494 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
495 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
496 c.ports.push_back(testOutDevice);
497 c.initialConfigs.push_back(
498 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
499 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
500 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
501
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700502 AudioPort headsetOutDevice =
503 createPort(c.nextPortId++, "Wired Headset", 0, false,
504 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
505 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700506 c.ports.push_back(headsetOutDevice);
507
Mikhail Naganov521fc492023-07-11 17:24:08 -0700508 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
509 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
510 c.ports.push_back(testInDevice);
511 c.initialConfigs.push_back(
512 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
513 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
514 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
515
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700516 AudioPort headsetInDevice =
517 createPort(c.nextPortId++, "Wired Headset Mic", 0, true,
518 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
519 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700520 c.ports.push_back(headsetInDevice);
521
Mikhail Naganov521fc492023-07-11 17:24:08 -0700522 // Mix ports
523
524 AudioPort testOutMix =
525 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
526 testOutMix.profiles.push_back(
527 createProfile(PcmType::INT_24_BIT,
528 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
529 {8000, 11025, 16000, 32000, 44100, 48000}));
530 c.ports.push_back(testOutMix);
531
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700532 AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
533 makeBitPositionFlagMask({AudioOutputFlags::FAST}),
534 false, createPortMixExt(1, 1));
535 testFastOutMix.profiles.push_back(createProfile(
536 PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
537 c.ports.push_back(testFastOutMix);
538
Mikhail Naganov521fc492023-07-11 17:24:08 -0700539 AudioPort compressedOffloadOutMix =
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700540 createPort(c.nextPortId++, "test compressed offload",
Mikhail Naganov521fc492023-07-11 17:24:08 -0700541 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
542 AudioOutputFlags::COMPRESS_OFFLOAD,
543 AudioOutputFlags::NON_BLOCKING}),
544 false, createPortMixExt(1, 1));
545 compressedOffloadOutMix.profiles.push_back(
546 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
547 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
548 {44100, 48000}));
549 c.ports.push_back(compressedOffloadOutMix);
550
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700551 AudioPort testInMix =
Mikhail Naganov521fc492023-07-11 17:24:08 -0700552 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700553 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700554 createProfile(PcmType::INT_16_BIT,
555 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
556 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700557 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700558 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700559 createProfile(PcmType::INT_24_BIT,
560 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
561 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700562 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700563 c.ports.push_back(testInMix);
Mikhail Naganov521fc492023-07-11 17:24:08 -0700564
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700565 c.routes.push_back(
566 createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700567 c.routes.push_back(createRoute({testOutMix}, headsetOutDevice));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700568 c.routes.push_back(createRoute({testInDevice, headsetInDevice}, testInMix));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700569
570 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000571
572 return c;
573 }();
574 return std::make_unique<Configuration>(configuration);
575}
576
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700577// Bluetooth configuration:
578//
579// Device ports:
580// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
581// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700582// * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700583// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
584// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
585// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
586// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
587// - no profiles specified
588//
589// Mix ports:
590// * "a2dp output", 1 max open, 1 max active stream
591// - no profiles specified
592// * "hearing aid output", 1 max open, 1 max active stream
593// - profile PCM 16-bit; STEREO; 16000, 24000
594//
595// Routes:
596// "a2dp output" -> "BT A2DP Out"
597// "a2dp output" -> "BT A2DP Headphones"
598// "a2dp output" -> "BT A2DP Speaker"
599// "hearing aid output" -> "BT Hearing Aid Out"
600//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700601// Profiles for device port connected state (when simulating connections):
602// * "BT A2DP Out", "BT A2DP Headphones", "BT A2DP Speaker":
603// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
604// * "BT Hearing Aid Out":
605// - profile PCM 16-bit; STEREO; 16000, 24000
606//
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700607std::unique_ptr<Configuration> getBluetoothConfiguration() {
608 static const Configuration configuration = []() {
609 const std::vector<AudioProfile> standardPcmAudioProfiles = {
610 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
611 {44100, 48000, 88200, 96000})};
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700612 const std::vector<AudioProfile> hearingAidAudioProfiles = {createProfile(
613 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000})};
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700614 Configuration c;
615
616 // Device ports
617 AudioPort btOutDevice =
618 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
619 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
620 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700621 btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
622 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700623 c.ports.push_back(btOutDevice);
624 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
625
626 AudioPort btOutHeadphone =
627 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700628 createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700629 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700630 btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
631 standardPcmAudioProfiles.begin(),
632 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700633 c.ports.push_back(btOutHeadphone);
634 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
635
636 AudioPort btOutSpeaker =
637 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
638 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
639 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700640 btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
641 standardPcmAudioProfiles.begin(),
642 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700643 c.ports.push_back(btOutSpeaker);
644 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
645
646 AudioPort btOutHearingAid =
647 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
648 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
649 AudioDeviceDescription::CONNECTION_WIRELESS));
650 c.ports.push_back(btOutHearingAid);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700651 c.connectedProfiles[btOutHearingAid.id] = hearingAidAudioProfiles;
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700652
653 // Mix ports
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700654 AudioPort btOutMix =
655 createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
656 c.ports.push_back(btOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700657
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700658 AudioPort btHearingOutMix =
659 createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700660 btHearingOutMix.profiles = hearingAidAudioProfiles;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700661 c.ports.push_back(btHearingOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700662
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700663 c.routes.push_back(createRoute({btOutMix}, btOutDevice));
664 c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
665 c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
666 c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700667
668 return c;
669 }();
670 return std::make_unique<Configuration>(configuration);
671}
672
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +0000673std::unique_ptr<Module::Configuration> getConfiguration(Module::Type moduleType) {
674 switch (moduleType) {
675 case Module::Type::DEFAULT:
676 return getPrimaryConfiguration();
677 case Module::Type::R_SUBMIX:
678 return getRSubmixConfiguration();
679 case Module::Type::STUB:
680 return getStubConfiguration();
681 case Module::Type::USB:
682 return getUsbConfiguration();
683 case Module::Type::BLUETOOTH:
684 return getBluetoothConfiguration();
685 }
686}
687
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000688} // namespace aidl::android::hardware::audio::core::internal