blob: 854c7f372c0bd5d7e7a987a1cdcaccb77ea12a8a [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
28using aidl::android::media::audio::common::AudioChannelLayout;
Mikhail Naganov00603d12022-05-02 22:52:13 +000029using aidl::android::media::audio::common::AudioDeviceDescription;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000030using aidl::android::media::audio::common::AudioDeviceType;
31using aidl::android::media::audio::common::AudioFormatDescription;
32using aidl::android::media::audio::common::AudioFormatType;
33using aidl::android::media::audio::common::AudioGainConfig;
34using aidl::android::media::audio::common::AudioIoFlags;
35using aidl::android::media::audio::common::AudioOutputFlags;
36using aidl::android::media::audio::common::AudioPort;
37using aidl::android::media::audio::common::AudioPortConfig;
38using aidl::android::media::audio::common::AudioPortDeviceExt;
39using aidl::android::media::audio::common::AudioPortExt;
40using aidl::android::media::audio::common::AudioPortMixExt;
41using aidl::android::media::audio::common::AudioProfile;
42using aidl::android::media::audio::common::Int;
43using aidl::android::media::audio::common::PcmType;
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +000044using android::hardware::audio::common::makeBitPositionFlagMask;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000045
46namespace aidl::android::hardware::audio::core::internal {
47
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000048static void fillProfile(AudioProfile* profile, const std::vector<int32_t>& channelLayouts,
49 const std::vector<int32_t>& sampleRates) {
50 for (auto layout : channelLayouts) {
51 profile->channelMasks.push_back(
52 AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout));
53 }
54 profile->sampleRates.insert(profile->sampleRates.end(), sampleRates.begin(), sampleRates.end());
55}
56
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000057static AudioProfile createProfile(PcmType pcmType, const std::vector<int32_t>& channelLayouts,
58 const std::vector<int32_t>& sampleRates) {
59 AudioProfile profile;
60 profile.format.type = AudioFormatType::PCM;
61 profile.format.pcm = pcmType;
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000062 fillProfile(&profile, channelLayouts, sampleRates);
63 return profile;
64}
65
66static AudioProfile createProfile(const std::string& encodingType,
67 const std::vector<int32_t>& channelLayouts,
68 const std::vector<int32_t>& sampleRates) {
69 AudioProfile profile;
70 profile.format.encoding = encodingType;
71 fillProfile(&profile, channelLayouts, sampleRates);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000072 return profile;
73}
74
Mikhail Naganov00603d12022-05-02 22:52:13 +000075static AudioPortExt createDeviceExt(AudioDeviceType devType, int32_t flags,
76 std::string connection = "") {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000077 AudioPortDeviceExt deviceExt;
78 deviceExt.device.type.type = devType;
Mikhail Naganovb0f3d972023-01-27 16:08:29 -080079 if (devType == AudioDeviceType::IN_MICROPHONE && connection.empty()) {
80 deviceExt.device.address = "bottom";
81 } else if (devType == AudioDeviceType::IN_MICROPHONE_BACK && connection.empty()) {
82 deviceExt.device.address = "back";
83 }
Mikhail Naganov00603d12022-05-02 22:52:13 +000084 deviceExt.device.type.connection = std::move(connection);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000085 deviceExt.flags = flags;
86 return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
87}
88
89static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
90 AudioPortMixExt mixExt;
91 mixExt.maxOpenStreamCount = maxOpenStreamCount;
92 mixExt.maxActiveStreamCount = maxActiveStreamCount;
93 return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
94}
95
96static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
97 const AudioPortExt& ext) {
98 AudioPort port;
99 port.id = id;
100 port.name = name;
101 port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
102 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
103 port.ext = ext;
104 return port;
105}
106
107static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
108 int32_t sampleRate, int32_t flags, bool isInput,
109 const AudioPortExt& ext) {
110 AudioPortConfig config;
111 config.id = id;
112 config.portId = portId;
113 config.sampleRate = Int{.value = sampleRate};
114 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
115 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
116 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 Naganovc8e43122022-12-09 00:33:47 +0000123static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000124 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000125 route.sinkPortId = sink.id;
126 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
127 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000128 return route;
129}
130
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000131// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000132//
133// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000134// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000135// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000136// * "Built-in Mic", IN_MICROPHONE, default
137// - no profiles specified
138// * "Telephony Tx", OUT_TELEPHONY_TX
139// - no profiles specified
140// * "Telephony Rx", IN_TELEPHONY_RX
141// - no profiles specified
142// * "FM Tuner", IN_FM_TUNER
143// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000144// * "USB Out", OUT_DEVICE, CONNECTION_USB
145// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000146// * "USB In", IN_DEVICE, CONNECTION_USB
147// - no profiles specified
148//
149// Mix ports:
150// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000151// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
152// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000153// * "compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active stream
154// - profile MP3; MONO, STEREO; 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000155// * "primary input", 2 max open, 2 max active streams
156// - profile PCM 16-bit; MONO, STEREO, FRONT_BACK;
157// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
158// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
159// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000160// * "telephony_tx", 1 max open, 1 max active stream
161// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
162// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
163// * "telephony_rx", 1 max open, 1 max active stream
164// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
165// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
166// * "fm_tuner", 1 max open, 1 max active stream
167// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
168// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000169//
170// Routes:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000171// "primary out", "compressed offload" -> "Speaker"
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000172// "primary out", "compressed offload" -> "USB Out"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000173// "Built-in Mic", "USB In" -> "primary input"
174// "telephony_tx" -> "Telephony Tx"
175// "Telephony Rx" -> "telephony_rx"
176// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000177//
178// Initial port configs:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000179// * "Speaker" device port: PCM 24-bit; STEREO; 48000
180// * "Built-in Mic" device port: PCM 24-bit; MONO; 48000
181// * "Telephony Tx" device port: PCM 24-bit; MONO; 48000
182// * "Telephony Rx" device port: PCM 24-bit; MONO; 48000
183// * "FM Tuner" device port: PCM 24-bit; STEREO; 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000184//
185// Profiles for device port connected state:
186// * USB Out":
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000187// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
188// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000189// * USB In":
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000190// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
191// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000192//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000193std::unique_ptr<Configuration> getPrimaryConfiguration() {
194 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000195 const std::vector<AudioProfile> standardPcmAudioProfiles = {
196 createProfile(PcmType::INT_16_BIT,
197 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000198 {8000, 11025, 16000, 32000, 44100, 48000}),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000199 createProfile(PcmType::INT_24_BIT,
200 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000201 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000202 Configuration c;
203
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000204 // Device ports
205
206 AudioPort speakerOutDevice =
207 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000208 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
209 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000210 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000211 c.initialConfigs.push_back(
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000212 createPortConfig(speakerOutDevice.id, speakerOutDevice.id, PcmType::INT_24_BIT,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000213 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
214 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
215
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000216 AudioPort micInDevice =
217 createPort(c.nextPortId++, "Built-in Mic", 0, true,
218 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
219 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
220 c.ports.push_back(micInDevice);
221 c.initialConfigs.push_back(
222 createPortConfig(micInDevice.id, micInDevice.id, PcmType::INT_24_BIT,
223 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
224 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
225
226 AudioPort telephonyTxOutDevice =
227 createPort(c.nextPortId++, "Telephony Tx", 0, false,
228 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
229 c.ports.push_back(telephonyTxOutDevice);
230 c.initialConfigs.push_back(
231 createPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id,
232 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
233 false, createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
234
235 AudioPort telephonyRxInDevice =
236 createPort(c.nextPortId++, "Telephony Rx", 0, true,
237 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
238 c.ports.push_back(telephonyRxInDevice);
239 c.initialConfigs.push_back(
240 createPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id,
241 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
242 true, createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
243
244 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
245 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
246 c.ports.push_back(fmTunerInDevice);
247 c.initialConfigs.push_back(
248 createPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, PcmType::INT_24_BIT,
249 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, true,
250 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
251
252 AudioPort usbOutDevice =
253 createPort(c.nextPortId++, "USB Out", 0, false,
254 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
255 AudioDeviceDescription::CONNECTION_USB));
256 c.ports.push_back(usbOutDevice);
257 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
258
259 AudioPort usbInDevice = createPort(c.nextPortId++, "USB In", 0, true,
260 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
261 AudioDeviceDescription::CONNECTION_USB));
262 c.ports.push_back(usbInDevice);
263 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
264
265 // Mix ports
266
Mikhail Naganov00603d12022-05-02 22:52:13 +0000267 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000268 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000269 false, createPortMixExt(1, 1));
270 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
271 standardPcmAudioProfiles.begin(),
272 standardPcmAudioProfiles.end());
273 c.ports.push_back(primaryOutMix);
274
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000275 AudioPort compressedOffloadOutMix =
276 createPort(c.nextPortId++, "compressed offload",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000277 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
278 AudioOutputFlags::COMPRESS_OFFLOAD,
279 AudioOutputFlags::NON_BLOCKING}),
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000280 false, createPortMixExt(1, 1));
281 compressedOffloadOutMix.profiles.push_back(
282 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
283 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
284 {44100, 48000}));
285 c.ports.push_back(compressedOffloadOutMix);
286
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000287 AudioPort primaryInMix =
288 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(2, 2));
289 primaryInMix.profiles.push_back(
290 createProfile(PcmType::INT_16_BIT,
291 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
292 AudioChannelLayout::LAYOUT_FRONT_BACK},
293 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
294 primaryInMix.profiles.push_back(
295 createProfile(PcmType::INT_24_BIT,
296 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
297 AudioChannelLayout::LAYOUT_FRONT_BACK},
298 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
299 c.ports.push_back(primaryInMix);
300
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000301 AudioPort telephonyTxOutMix =
302 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
303 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
304 standardPcmAudioProfiles.begin(),
305 standardPcmAudioProfiles.end());
306 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000307
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000308 AudioPort telephonyRxInMix =
309 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(1, 1));
310 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
311 standardPcmAudioProfiles.begin(),
312 standardPcmAudioProfiles.end());
313 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000314
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000315 AudioPort fmTunerInMix =
316 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(1, 1));
317 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
318 standardPcmAudioProfiles.begin(),
319 standardPcmAudioProfiles.end());
320 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000321
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000322 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, speakerOutDevice));
323 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, usbOutDevice));
324 c.routes.push_back(createRoute({micInDevice, usbInDevice}, primaryInMix));
325 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
326 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
327 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000328
329 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000330
331 MicrophoneInfo mic;
332 mic.id = "mic";
333 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
334 mic.group = 0;
335 mic.indexInTheGroup = 0;
336 c.microphones = std::vector<MicrophoneInfo>{mic};
337
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000338 return c;
339 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000340 return std::make_unique<Configuration>(configuration);
341}
342
343// Remote Submix configuration:
344//
345// Device ports:
346// * "Remote Submix Out", OUT_SUBMIX
347// - profile PCM 24-bit; STEREO; 48000
348// * "Remote Submix In", IN_SUBMIX
349// - profile PCM 24-bit; STEREO; 48000
350//
351// Mix ports:
352// * "r_submix output", stream count unlimited
353// - profile PCM 24-bit; STEREO; 48000
354// * "r_submix input", stream count unlimited
355// - profile PCM 24-bit; STEREO; 48000
356//
357// Routes:
358// "r_submix output" -> "Remote Submix Out"
359// "Remote Submix In" -> "r_submix input"
360//
361std::unique_ptr<Configuration> getRSubmixConfiguration() {
362 static const Configuration configuration = []() {
363 Configuration c;
364
365 // Device ports
366
367 AudioPort rsubmixOutDevice = createPort(c.nextPortId++, "Remote Submix Out", 0, false,
368 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0));
369 rsubmixOutDevice.profiles.push_back(
370 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
371 c.ports.push_back(rsubmixOutDevice);
372
373 AudioPort rsubmixInDevice = createPort(c.nextPortId++, "Remote Submix In", 0, true,
374 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0));
375 rsubmixInDevice.profiles.push_back(
376 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
377 c.ports.push_back(rsubmixInDevice);
378
379 // Mix ports
380
381 AudioPort rsubmixOutMix =
382 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(0, 0));
383 rsubmixOutMix.profiles.push_back(
384 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
385 c.ports.push_back(rsubmixOutMix);
386
387 AudioPort rsubmixInMix =
388 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(0, 0));
389 rsubmixInMix.profiles.push_back(
390 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
391 c.ports.push_back(rsubmixInMix);
392
393 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
394 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
395
396 return c;
397 }();
398 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000399}
400
jiabinb309d8d2023-01-20 19:07:15 +0000401// Usb configuration:
402//
403// Device ports:
404// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
405// - no profiles specified
406// * "USB Headset In", IN_HEADSET, CONNECTION_USB
407// - no profiles specified
408//
409// Mix ports:
410// * "usb_headset output", 1 max open, 1 max active stream
411// - no profiles specified
412// * "usb_headset input", 1 max open, 1 max active stream
413// - no profiles specified
414//
415// Profiles for device port connected state:
416// * USB Headset Out":
417// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
418// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
419// * USB Headset In":
420// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
421// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
422//
423std::unique_ptr<Configuration> getUsbConfiguration() {
424 static const Configuration configuration = []() {
425 const std::vector<AudioProfile> standardPcmAudioProfiles = {
426 createProfile(PcmType::INT_16_BIT,
427 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
428 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
429 {44100, 48000}),
430 createProfile(PcmType::INT_24_BIT,
431 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
432 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
433 {44100, 48000})};
434 Configuration c;
435
436 // Device ports
437
438 AudioPort usbOutHeadset =
439 createPort(c.nextPortId++, "USB Headset Out", 0, false,
440 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
441 AudioDeviceDescription::CONNECTION_USB));
442 c.ports.push_back(usbOutHeadset);
443 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
444
445 AudioPort usbInHeadset =
446 createPort(c.nextPortId++, "USB Headset In", 0, true,
447 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
448 AudioDeviceDescription::CONNECTION_USB));
449 c.ports.push_back(usbInHeadset);
450 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
451
452 // Mix ports
453
454 AudioPort usbHeadsetOutMix =
455 createPort(c.nextPortId++, "usb_headset output", 0, false, createPortMixExt(1, 1));
456 c.ports.push_back(usbHeadsetOutMix);
457
458 AudioPort usbHeadsetInMix =
459 createPort(c.nextPortId++, "usb_headset input", 0, true, createPortMixExt(1, 1));
460 c.ports.push_back(usbHeadsetInMix);
461
462 c.routes.push_back(createRoute({usbHeadsetOutMix}, usbOutHeadset));
463 c.routes.push_back(createRoute({usbInHeadset}, usbHeadsetInMix));
464
465 return c;
466 }();
467 return std::make_unique<Configuration>(configuration);
468}
469
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000470} // namespace aidl::android::hardware::audio::core::internal