blob: baaa55f9b9fd4b59ac215fc4b2d10ffcad5a7a3e [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;
Dean Wheatleyce9767a2023-10-24 11:23:49 +110035using aidl::android::media::audio::common::AudioInputFlags;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000036using aidl::android::media::audio::common::AudioIoFlags;
37using aidl::android::media::audio::common::AudioOutputFlags;
38using aidl::android::media::audio::common::AudioPort;
39using aidl::android::media::audio::common::AudioPortConfig;
40using aidl::android::media::audio::common::AudioPortDeviceExt;
41using aidl::android::media::audio::common::AudioPortExt;
42using aidl::android::media::audio::common::AudioPortMixExt;
43using aidl::android::media::audio::common::AudioProfile;
44using aidl::android::media::audio::common::Int;
45using 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
Lorena Torres-Huertaf7492512023-01-14 02:49:41 +0000139std::vector<AudioProfile> getStandard16And24BitPcmAudioProfiles() {
140 auto createStdPcmAudioProfile = [](const PcmType& pcmType) {
141 return AudioProfile{
142 .format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType},
143 .channelMasks = {AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
144 AudioChannelLayout::LAYOUT_MONO),
145 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
146 AudioChannelLayout::LAYOUT_STEREO)},
147 .sampleRates = {8000, 11025, 16000, 32000, 44100, 48000}};
148 };
149 return {
150 createStdPcmAudioProfile(PcmType::INT_16_BIT),
151 createStdPcmAudioProfile(PcmType::INT_24_BIT),
152 };
153}
154
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000155// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000156//
157// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000158// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000159// - no profiles specified
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700160// * "Built-In Mic", IN_MICROPHONE, default
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000161// - no profiles specified
162// * "Telephony Tx", OUT_TELEPHONY_TX
163// - no profiles specified
164// * "Telephony Rx", IN_TELEPHONY_RX
165// - no profiles specified
166// * "FM Tuner", IN_FM_TUNER
167// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000168//
169// Mix ports:
170// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000171// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700172// * "primary input", 1 max open, 1 max active stream
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700173// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000174// * "telephony_tx", 1 max open, 1 max active stream
175// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000176// * "telephony_rx", 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// * "fm_tuner", 1 max open, 1 max active stream
179// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000180//
181// Routes:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700182// "primary out" -> "Speaker"
183// "Built-In Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000184// "Telephony Rx" -> "telephony_rx"
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700185// "telephony_tx" -> "Telephony Tx"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000186// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000187//
188// Initial port configs:
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700189// * "Speaker" device port: dynamic configuration
190// * "Built-In Mic" device port: dynamic configuration
191// * "Telephony Tx" device port: dynamic configuration
192// * "Telephony Rx" device port: dynamic configuration
193// * "FM Tuner" device port: dynamic configuration
Mikhail Naganov00603d12022-05-02 22:52:13 +0000194//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000195std::unique_ptr<Configuration> getPrimaryConfiguration() {
196 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000197 const std::vector<AudioProfile> standardPcmAudioProfiles = {
198 createProfile(PcmType::INT_16_BIT,
199 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000200 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000201 Configuration c;
202
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000203 // Device ports
204
205 AudioPort speakerOutDevice =
206 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000207 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
208 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000209 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000210 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700211 createDynamicPortConfig(speakerOutDevice.id, speakerOutDevice.id, 0, false,
212 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000213
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000214 AudioPort micInDevice =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700215 createPort(c.nextPortId++, "Built-In Mic", 0, true,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000216 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
217 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
218 c.ports.push_back(micInDevice);
219 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700220 createDynamicPortConfig(micInDevice.id, micInDevice.id, 0, true,
221 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000222
223 AudioPort telephonyTxOutDevice =
224 createPort(c.nextPortId++, "Telephony Tx", 0, false,
225 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
226 c.ports.push_back(telephonyTxOutDevice);
227 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700228 createDynamicPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id, 0, false,
229 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000230
231 AudioPort telephonyRxInDevice =
232 createPort(c.nextPortId++, "Telephony Rx", 0, true,
233 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
234 c.ports.push_back(telephonyRxInDevice);
235 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700236 createDynamicPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id, 0, true,
237 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000238
239 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
240 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
241 c.ports.push_back(fmTunerInDevice);
242 c.initialConfigs.push_back(
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700243 createDynamicPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, 0, true,
244 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000245
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000246 // Mix ports
247
Mikhail Naganov00603d12022-05-02 22:52:13 +0000248 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000249 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Shunkai Yao24618912023-08-18 23:58:05 +0000250 false, createPortMixExt(0, 0));
Mikhail Naganov00603d12022-05-02 22:52:13 +0000251 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
252 standardPcmAudioProfiles.begin(),
253 standardPcmAudioProfiles.end());
254 c.ports.push_back(primaryOutMix);
255
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000256 AudioPort primaryInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700257 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(0, 1));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000258 primaryInMix.profiles.push_back(
259 createProfile(PcmType::INT_16_BIT,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700260 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
261 {8000, 11025, 16000, 32000, 44100, 48000}));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000262 c.ports.push_back(primaryInMix);
263
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000264 AudioPort telephonyTxOutMix =
265 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
266 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
267 standardPcmAudioProfiles.begin(),
268 standardPcmAudioProfiles.end());
269 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000270
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000271 AudioPort telephonyRxInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700272 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000273 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
274 standardPcmAudioProfiles.begin(),
275 standardPcmAudioProfiles.end());
276 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000277
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000278 AudioPort fmTunerInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700279 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(0, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000280 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
281 standardPcmAudioProfiles.begin(),
282 standardPcmAudioProfiles.end());
283 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000284
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700285 c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700286 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000287 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700288 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000289 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000290
291 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000292
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000293 return c;
294 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000295 return std::make_unique<Configuration>(configuration);
296}
297
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700298// Note: When transitioning to loading of XML configs, either keep the configuration
299// of the remote submix sources from this static configuration, or update the XML
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700300// config to match it. There are several reasons for that:
301// 1. The "Remote Submix In" device is listed in the XML config as "attached",
302// however in the AIDL scheme its device type has a "virtual" connection.
303// 2. The canonical r_submix configuration only lists 'STEREO' and '48000',
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700304// however the framework attempts to open streams for other sample rates
305// as well. The legacy r_submix implementation allowed that, but libaudiohal@aidl
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800306// will not find a mix port to use. Because of that, list all sample rates that
307// the legacy implementation allowed (note that mono was not allowed, the framework
308// is expected to upmix mono tracks into stereo if needed).
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700309// 3. The legacy implementation had a hard limit on the number of routes (10),
Mikhail Naganov21d4b962023-09-18 17:00:10 -0700310// and this is checked indirectly by AudioPlaybackCaptureTest#testPlaybackCaptureDoS
311// CTS test. Instead of hardcoding the number of routes, we can use
312// "maxOpen/ActiveStreamCount" to enforce a similar limit. However, the canonical
313// XML file lacks this specification.
314//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000315// Remote Submix configuration:
316//
317// Device ports:
318// * "Remote Submix Out", OUT_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800319// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000320// * "Remote Submix In", IN_SUBMIX
David Lib089c0c2023-08-10 12:47:44 +0800321// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000322//
323// Mix ports:
Mikhail Naganov06085452023-11-27 17:28:51 -0800324// * "r_submix output", maximum 10 opened streams, maximum 10 active streams
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100325// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
Mikhail Naganov06085452023-11-27 17:28:51 -0800326// * "r_submix input", maximum 10 opened streams, maximum 10 active streams
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100327// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
328// * "r_submix output direct", DIRECT|IEC958_NONAUDIO, 1 max open, 1 max active
329// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
330// * "r_submix input direct", DIRECT, 1 max open, 1 max active
331// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
332
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000333//
334// Routes:
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100335// "r_submix output", "r_submix output direct" -> "Remote Submix Out"
336// "Remote Submix In" -> "r_submix input", "r_submix input direct"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000337//
338std::unique_ptr<Configuration> getRSubmixConfiguration() {
339 static const Configuration configuration = []() {
340 Configuration c;
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800341 const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
342 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100343 {8000, 11025, 16000, 32000, 44100, 48000, 192000})};
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000344
345 // Device ports
346
Mikhail Naganov26526f12023-05-12 13:51:06 -0700347 AudioPort rsubmixOutDevice =
348 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
349 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
350 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000351 c.ports.push_back(rsubmixOutDevice);
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800352 c.connectedProfiles[rsubmixOutDevice.id] = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000353
David Lib089c0c2023-08-10 12:47:44 +0800354 AudioPort rsubmixInDevice =
355 createPort(c.nextPortId++, "Remote Submix In", 0, true,
356 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0,
357 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000358 c.ports.push_back(rsubmixInDevice);
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800359 c.connectedProfiles[rsubmixInDevice.id] = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000360
361 // Mix ports
362
363 AudioPort rsubmixOutMix =
Mikhail Naganov06085452023-11-27 17:28:51 -0800364 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(10, 10));
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800365 rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000366 c.ports.push_back(rsubmixOutMix);
367
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100368 // Adding a DIRECT flag to rsubmixInMix breaks the mixer paths, so we need separate
369 // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
370 // need the DIRECT and IEC958_NONAUDIO flags as AudioFlinger adds them.
371 AudioPort rsubmixOutDirectMix =
372 createPort(c.nextPortId++, "r_submix output direct",
373 makeBitPositionFlagMask({
374 AudioOutputFlags::DIRECT,
375 AudioOutputFlags::IEC958_NONAUDIO}),
376 false /* isInput */,
377 createPortMixExt(1 /* maxOpenStreamCount */,
378 1 /* maxActiveStreamCount */));
379 rsubmixOutDirectMix.profiles = remoteSubmixPcmAudioProfiles;
380 c.ports.push_back(rsubmixOutDirectMix);
381
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000382 AudioPort rsubmixInMix =
Mikhail Naganov06085452023-11-27 17:28:51 -0800383 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
Mikhail Naganov2ebe3902023-11-07 16:43:26 -0800384 rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000385 c.ports.push_back(rsubmixInMix);
386
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100387 // Adding a DIRECT flag to rsubmixInMix breaks the capture paths, so we need separate
388 // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
389 // need the DIRECT flag for the capability so AudioFlinger can find a DIRECT input match.
390 AudioPort rsubmixInDirectMix =
391 createPort(c.nextPortId++, "r_submix input direct",
392 makeBitPositionFlagMask({AudioInputFlags::DIRECT}),
393 true /* isInput */,
394 createPortMixExt(1 /* maxOpenStreamCount */,
395 1 /* maxActiveStreamCount */));
396 rsubmixInDirectMix.profiles = remoteSubmixPcmAudioProfiles;
397 c.ports.push_back(rsubmixInDirectMix);
398
399 c.routes.push_back(createRoute(
400 {rsubmixOutMix, rsubmixOutDirectMix}, rsubmixOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000401 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
Dean Wheatleyce9767a2023-10-24 11:23:49 +1100402 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInDirectMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000403
404 return c;
405 }();
406 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000407}
408
jiabinb309d8d2023-01-20 19:07:15 +0000409// Usb configuration:
410//
411// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700412// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
413// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000414// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
415// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700416// * "USB Device In", IN_DEVICE, CONNECTION_USB
417// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000418// * "USB Headset In", IN_HEADSET, CONNECTION_USB
419// - no profiles specified
420//
421// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700422// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000423// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700424// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000425// - no profiles specified
426//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700427// Routes:
428// * "usb_device output" -> "USB Device Out"
429// * "usb_device output" -> "USB Headset Out"
430// * "USB Device In", "USB Headset In" -> "usb_device input"
431//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700432// Profiles for device port connected state (when simulating connections):
Mikhail Naganov521fc492023-07-11 17:24:08 -0700433// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000434// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
435// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700436// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000437// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
438// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
439//
440std::unique_ptr<Configuration> getUsbConfiguration() {
441 static const Configuration configuration = []() {
442 const std::vector<AudioProfile> standardPcmAudioProfiles = {
443 createProfile(PcmType::INT_16_BIT,
444 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
445 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
446 {44100, 48000}),
447 createProfile(PcmType::INT_24_BIT,
448 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
449 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
450 {44100, 48000})};
451 Configuration c;
452
453 // Device ports
454
Mikhail Naganov521fc492023-07-11 17:24:08 -0700455 AudioPort usbOutDevice =
456 createPort(c.nextPortId++, "USB Device Out", 0, false,
457 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
458 AudioDeviceDescription::CONNECTION_USB));
459 c.ports.push_back(usbOutDevice);
460 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
461
jiabinb309d8d2023-01-20 19:07:15 +0000462 AudioPort usbOutHeadset =
463 createPort(c.nextPortId++, "USB Headset Out", 0, false,
464 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
465 AudioDeviceDescription::CONNECTION_USB));
466 c.ports.push_back(usbOutHeadset);
467 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
468
Mikhail Naganov521fc492023-07-11 17:24:08 -0700469 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
470 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
471 AudioDeviceDescription::CONNECTION_USB));
472 c.ports.push_back(usbInDevice);
473 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
474
jiabinb309d8d2023-01-20 19:07:15 +0000475 AudioPort usbInHeadset =
476 createPort(c.nextPortId++, "USB Headset In", 0, true,
477 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
478 AudioDeviceDescription::CONNECTION_USB));
479 c.ports.push_back(usbInHeadset);
480 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
481
482 // Mix ports
483
Mikhail Naganov521fc492023-07-11 17:24:08 -0700484 AudioPort usbDeviceOutMix =
485 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
486 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000487
Mikhail Naganov521fc492023-07-11 17:24:08 -0700488 AudioPort usbDeviceInMix =
Mikhail Naganov8dbc5112023-10-02 14:51:50 -0700489 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(0, 1));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700490 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000491
Mikhail Naganov521fc492023-07-11 17:24:08 -0700492 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
493 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
494 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
495
496 return c;
497 }();
498 return std::make_unique<Configuration>(configuration);
499}
500
501// Stub configuration:
502//
503// Device ports:
504// * "Test Out", OUT_AFE_PROXY
505// - no profiles specified
506// * "Test In", IN_AFE_PROXY
507// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700508// * "Wired Headset", OUT_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700509// - no profiles specified
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700510// * "Wired Headset Mic", IN_HEADSET
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700511// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700512//
513// Mix ports:
514// * "test output", 1 max open, 1 max active stream
515// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700516// * "test fast output", 1 max open, 1 max active stream
517// - profile PCM 24-bit; STEREO; 44100, 48000
518// * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
519// stream
Mikhail Naganov521fc492023-07-11 17:24:08 -0700520// - profile MP3; MONO, STEREO; 44100, 48000
521// * "test input", 2 max open, 2 max active streams
522// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700523// 8000, 11025, 16000, 22050, 32000, 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700524//
525// Routes:
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700526// "test output", "test fast output", "test compressed offload" -> "Test Out"
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700527// "test output" -> "Wired Headset"
528// "Test In", "Wired Headset Mic" -> "test input"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700529//
530// Initial port configs:
531// * "Test Out" device port: PCM 24-bit; STEREO; 48000
532// * "Test In" device port: PCM 24-bit; MONO; 48000
533//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700534// Profiles for device port connected state (when simulating connections):
535// * "Wired Headset": dynamic profiles
536// * "Wired Headset Mic": dynamic profiles
537//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700538std::unique_ptr<Configuration> getStubConfiguration() {
539 static const Configuration configuration = []() {
540 Configuration c;
541
542 // Device ports
543
544 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
545 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
546 c.ports.push_back(testOutDevice);
547 c.initialConfigs.push_back(
548 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
549 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
550 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
551
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700552 AudioPort headsetOutDevice =
553 createPort(c.nextPortId++, "Wired Headset", 0, false,
554 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
555 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700556 c.ports.push_back(headsetOutDevice);
557
Mikhail Naganov521fc492023-07-11 17:24:08 -0700558 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
559 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
560 c.ports.push_back(testInDevice);
561 c.initialConfigs.push_back(
562 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
563 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
564 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
565
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700566 AudioPort headsetInDevice =
567 createPort(c.nextPortId++, "Wired Headset Mic", 0, true,
568 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
569 AudioDeviceDescription::CONNECTION_ANALOG));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700570 c.ports.push_back(headsetInDevice);
571
Mikhail Naganov521fc492023-07-11 17:24:08 -0700572 // Mix ports
573
574 AudioPort testOutMix =
575 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
576 testOutMix.profiles.push_back(
577 createProfile(PcmType::INT_24_BIT,
578 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
579 {8000, 11025, 16000, 32000, 44100, 48000}));
580 c.ports.push_back(testOutMix);
581
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700582 AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
583 makeBitPositionFlagMask({AudioOutputFlags::FAST}),
584 false, createPortMixExt(1, 1));
585 testFastOutMix.profiles.push_back(createProfile(
586 PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
587 c.ports.push_back(testFastOutMix);
588
Mikhail Naganov521fc492023-07-11 17:24:08 -0700589 AudioPort compressedOffloadOutMix =
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700590 createPort(c.nextPortId++, "test compressed offload",
Mikhail Naganov521fc492023-07-11 17:24:08 -0700591 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
592 AudioOutputFlags::COMPRESS_OFFLOAD,
593 AudioOutputFlags::NON_BLOCKING}),
594 false, createPortMixExt(1, 1));
595 compressedOffloadOutMix.profiles.push_back(
596 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
597 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
598 {44100, 48000}));
599 c.ports.push_back(compressedOffloadOutMix);
600
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700601 AudioPort testInMix =
Mikhail Naganov521fc492023-07-11 17:24:08 -0700602 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700603 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700604 createProfile(PcmType::INT_16_BIT,
605 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
606 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700607 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700608 testInMix.profiles.push_back(
Mikhail Naganov521fc492023-07-11 17:24:08 -0700609 createProfile(PcmType::INT_24_BIT,
610 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
611 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700612 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700613 c.ports.push_back(testInMix);
Mikhail Naganov521fc492023-07-11 17:24:08 -0700614
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700615 c.routes.push_back(
616 createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
Mikhail Naganovfe47b002023-09-15 18:53:42 -0700617 c.routes.push_back(createRoute({testOutMix}, headsetOutDevice));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700618 c.routes.push_back(createRoute({testInDevice, headsetInDevice}, testInMix));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700619
620 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000621
622 return c;
623 }();
624 return std::make_unique<Configuration>(configuration);
625}
626
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700627// Bluetooth configuration:
628//
629// Device ports:
630// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
631// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700632// * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700633// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
634// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
635// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
636// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
637// - no profiles specified
638//
639// Mix ports:
640// * "a2dp output", 1 max open, 1 max active stream
641// - no profiles specified
642// * "hearing aid output", 1 max open, 1 max active stream
643// - profile PCM 16-bit; STEREO; 16000, 24000
644//
645// Routes:
646// "a2dp output" -> "BT A2DP Out"
647// "a2dp output" -> "BT A2DP Headphones"
648// "a2dp output" -> "BT A2DP Speaker"
649// "hearing aid output" -> "BT Hearing Aid Out"
650//
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700651// Profiles for device port connected state (when simulating connections):
652// * "BT A2DP Out", "BT A2DP Headphones", "BT A2DP Speaker":
653// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
654// * "BT Hearing Aid Out":
655// - profile PCM 16-bit; STEREO; 16000, 24000
656//
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700657std::unique_ptr<Configuration> getBluetoothConfiguration() {
658 static const Configuration configuration = []() {
659 const std::vector<AudioProfile> standardPcmAudioProfiles = {
660 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
661 {44100, 48000, 88200, 96000})};
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700662 const std::vector<AudioProfile> hearingAidAudioProfiles = {createProfile(
663 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000})};
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700664 Configuration c;
665
666 // Device ports
667 AudioPort btOutDevice =
668 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
669 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
670 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700671 btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
672 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700673 c.ports.push_back(btOutDevice);
674 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
675
676 AudioPort btOutHeadphone =
677 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700678 createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700679 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700680 btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
681 standardPcmAudioProfiles.begin(),
682 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700683 c.ports.push_back(btOutHeadphone);
684 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
685
686 AudioPort btOutSpeaker =
687 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
688 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
689 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700690 btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
691 standardPcmAudioProfiles.begin(),
692 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700693 c.ports.push_back(btOutSpeaker);
694 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
695
696 AudioPort btOutHearingAid =
697 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
698 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
699 AudioDeviceDescription::CONNECTION_WIRELESS));
700 c.ports.push_back(btOutHearingAid);
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700701 c.connectedProfiles[btOutHearingAid.id] = hearingAidAudioProfiles;
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700702
703 // Mix ports
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700704 AudioPort btOutMix =
705 createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
706 c.ports.push_back(btOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700707
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700708 AudioPort btHearingOutMix =
709 createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
Mikhail Naganov84bcc042023-10-05 17:36:57 -0700710 btHearingOutMix.profiles = hearingAidAudioProfiles;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700711 c.ports.push_back(btHearingOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700712
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700713 c.routes.push_back(createRoute({btOutMix}, btOutDevice));
714 c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
715 c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
716 c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700717
718 return c;
719 }();
720 return std::make_unique<Configuration>(configuration);
721}
722
Lorena Torres-Huerta394e2522022-12-20 02:21:41 +0000723std::unique_ptr<Module::Configuration> getConfiguration(Module::Type moduleType) {
724 switch (moduleType) {
725 case Module::Type::DEFAULT:
726 return getPrimaryConfiguration();
727 case Module::Type::R_SUBMIX:
728 return getRSubmixConfiguration();
729 case Module::Type::STUB:
730 return getStubConfiguration();
731 case Module::Type::USB:
732 return getUsbConfiguration();
733 case Module::Type::BLUETOOTH:
734 return getBluetoothConfiguration();
735 }
736}
737
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000738} // namespace aidl::android::hardware::audio::core::internal