blob: d41ea67329a2c16b364163f1ee33cd7cf38a95d4 [file] [log] [blame]
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +000017#include <Utils.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000018#include <aidl/android/media/audio/common/AudioChannelLayout.h>
19#include <aidl/android/media/audio/common/AudioDeviceType.h>
Mikhail Naganov00603d12022-05-02 22:52:13 +000020#include <aidl/android/media/audio/common/AudioFormatDescription.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000021#include <aidl/android/media/audio/common/AudioFormatType.h>
22#include <aidl/android/media/audio/common/AudioIoFlags.h>
23#include <aidl/android/media/audio/common/AudioOutputFlags.h>
Mikhail Naganov111e0ce2022-06-17 21:41:19 +000024#include <media/stagefright/foundation/MediaDefs.h>
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000025
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000026#include "core-impl/Configuration.h"
27
Mikhail Naganov872d4a62023-03-09 18:19:01 -080028using aidl::android::hardware::audio::common::makeBitPositionFlagMask;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000029using aidl::android::media::audio::common::AudioChannelLayout;
Mikhail Naganov00603d12022-05-02 22:52:13 +000030using aidl::android::media::audio::common::AudioDeviceDescription;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000031using aidl::android::media::audio::common::AudioDeviceType;
32using aidl::android::media::audio::common::AudioFormatDescription;
33using aidl::android::media::audio::common::AudioFormatType;
34using aidl::android::media::audio::common::AudioGainConfig;
35using aidl::android::media::audio::common::AudioIoFlags;
36using aidl::android::media::audio::common::AudioOutputFlags;
37using aidl::android::media::audio::common::AudioPort;
38using aidl::android::media::audio::common::AudioPortConfig;
39using aidl::android::media::audio::common::AudioPortDeviceExt;
40using aidl::android::media::audio::common::AudioPortExt;
41using aidl::android::media::audio::common::AudioPortMixExt;
42using aidl::android::media::audio::common::AudioProfile;
43using aidl::android::media::audio::common::Int;
Mikhail Naganov6725ef52023-02-09 17:52:50 -080044using aidl::android::media::audio::common::MicrophoneInfo;
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000045using aidl::android::media::audio::common::PcmType;
46
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";
Mikhail Naganov26526f12023-05-12 13:51:06 -070084 } else if (devType == AudioDeviceType::IN_SUBMIX || devType == AudioDeviceType::OUT_SUBMIX) {
85 deviceExt.device.address = "0";
Mikhail Naganovb0f3d972023-01-27 16:08:29 -080086 }
Mikhail Naganov00603d12022-05-02 22:52:13 +000087 deviceExt.device.type.connection = std::move(connection);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000088 deviceExt.flags = flags;
89 return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
90}
91
92static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
93 AudioPortMixExt mixExt;
94 mixExt.maxOpenStreamCount = maxOpenStreamCount;
95 mixExt.maxActiveStreamCount = maxActiveStreamCount;
96 return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
97}
98
99static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
100 const AudioPortExt& ext) {
101 AudioPort port;
102 port.id = id;
103 port.name = name;
104 port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
105 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
106 port.ext = ext;
107 return port;
108}
109
110static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
111 int32_t sampleRate, int32_t flags, bool isInput,
112 const AudioPortExt& ext) {
113 AudioPortConfig config;
114 config.id = id;
115 config.portId = portId;
116 config.sampleRate = Int{.value = sampleRate};
117 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
118 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
119 config.gain = AudioGainConfig();
120 config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
121 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
122 config.ext = ext;
123 return config;
124}
125
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000126static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000127 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000128 route.sinkPortId = sink.id;
129 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
130 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000131 return route;
132}
133
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000134// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000135//
136// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000137// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000138// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000139// * "Built-in Mic", IN_MICROPHONE, default
140// - no profiles specified
141// * "Telephony Tx", OUT_TELEPHONY_TX
142// - no profiles specified
143// * "Telephony Rx", IN_TELEPHONY_RX
144// - no profiles specified
145// * "FM Tuner", IN_FM_TUNER
146// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000147// * "USB Out", OUT_DEVICE, CONNECTION_USB
148// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000149// * "USB In", IN_DEVICE, CONNECTION_USB
150// - no profiles specified
151//
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
155// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000156// * "compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active stream
157// - profile MP3; MONO, STEREO; 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000158// * "primary input", 2 max open, 2 max active streams
159// - profile PCM 16-bit; MONO, STEREO, FRONT_BACK;
160// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
161// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
162// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000163// * "telephony_tx", 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// * "telephony_rx", 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
169// * "fm_tuner", 1 max open, 1 max active stream
170// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
171// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000172//
173// Routes:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000174// "primary out", "compressed offload" -> "Speaker"
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000175// "primary out", "compressed offload" -> "USB Out"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000176// "Built-in Mic", "USB In" -> "primary input"
177// "telephony_tx" -> "Telephony Tx"
178// "Telephony Rx" -> "telephony_rx"
179// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000180//
181// Initial port configs:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000182// * "Speaker" device port: PCM 24-bit; STEREO; 48000
183// * "Built-in Mic" device port: PCM 24-bit; MONO; 48000
184// * "Telephony Tx" device port: PCM 24-bit; MONO; 48000
185// * "Telephony Rx" device port: PCM 24-bit; MONO; 48000
186// * "FM Tuner" device port: PCM 24-bit; STEREO; 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000187//
188// Profiles for device port connected state:
189// * USB Out":
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// * USB In":
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000193// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
194// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000195//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000196std::unique_ptr<Configuration> getPrimaryConfiguration() {
197 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000198 const std::vector<AudioProfile> standardPcmAudioProfiles = {
199 createProfile(PcmType::INT_16_BIT,
200 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000201 {8000, 11025, 16000, 32000, 44100, 48000}),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000202 createProfile(PcmType::INT_24_BIT,
203 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000204 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000205 Configuration c;
206
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000207 // Device ports
208
209 AudioPort speakerOutDevice =
210 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000211 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
212 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000213 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000214 c.initialConfigs.push_back(
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000215 createPortConfig(speakerOutDevice.id, speakerOutDevice.id, PcmType::INT_24_BIT,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000216 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
217 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
218
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000219 AudioPort micInDevice =
220 createPort(c.nextPortId++, "Built-in Mic", 0, true,
221 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
222 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
223 c.ports.push_back(micInDevice);
224 c.initialConfigs.push_back(
225 createPortConfig(micInDevice.id, micInDevice.id, PcmType::INT_24_BIT,
226 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
227 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
228
229 AudioPort telephonyTxOutDevice =
230 createPort(c.nextPortId++, "Telephony Tx", 0, false,
231 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
232 c.ports.push_back(telephonyTxOutDevice);
233 c.initialConfigs.push_back(
234 createPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id,
235 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
236 false, createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
237
238 AudioPort telephonyRxInDevice =
239 createPort(c.nextPortId++, "Telephony Rx", 0, true,
240 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
241 c.ports.push_back(telephonyRxInDevice);
242 c.initialConfigs.push_back(
243 createPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id,
244 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
245 true, createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
246
247 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
248 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
249 c.ports.push_back(fmTunerInDevice);
250 c.initialConfigs.push_back(
251 createPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, PcmType::INT_24_BIT,
252 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, true,
253 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
254
255 AudioPort usbOutDevice =
256 createPort(c.nextPortId++, "USB Out", 0, false,
257 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
258 AudioDeviceDescription::CONNECTION_USB));
259 c.ports.push_back(usbOutDevice);
260 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
261
262 AudioPort usbInDevice = createPort(c.nextPortId++, "USB In", 0, true,
263 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
264 AudioDeviceDescription::CONNECTION_USB));
265 c.ports.push_back(usbInDevice);
266 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
267
268 // Mix ports
269
Mikhail Naganov00603d12022-05-02 22:52:13 +0000270 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000271 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000272 false, createPortMixExt(1, 1));
273 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
274 standardPcmAudioProfiles.begin(),
275 standardPcmAudioProfiles.end());
276 c.ports.push_back(primaryOutMix);
277
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000278 AudioPort compressedOffloadOutMix =
279 createPort(c.nextPortId++, "compressed offload",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000280 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
281 AudioOutputFlags::COMPRESS_OFFLOAD,
282 AudioOutputFlags::NON_BLOCKING}),
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000283 false, createPortMixExt(1, 1));
284 compressedOffloadOutMix.profiles.push_back(
285 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
286 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
287 {44100, 48000}));
288 c.ports.push_back(compressedOffloadOutMix);
289
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000290 AudioPort primaryInMix =
291 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(2, 2));
292 primaryInMix.profiles.push_back(
293 createProfile(PcmType::INT_16_BIT,
294 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
295 AudioChannelLayout::LAYOUT_FRONT_BACK},
296 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
297 primaryInMix.profiles.push_back(
298 createProfile(PcmType::INT_24_BIT,
299 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
300 AudioChannelLayout::LAYOUT_FRONT_BACK},
301 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
302 c.ports.push_back(primaryInMix);
303
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000304 AudioPort telephonyTxOutMix =
305 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
306 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
307 standardPcmAudioProfiles.begin(),
308 standardPcmAudioProfiles.end());
309 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000310
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000311 AudioPort telephonyRxInMix =
312 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(1, 1));
313 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
314 standardPcmAudioProfiles.begin(),
315 standardPcmAudioProfiles.end());
316 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000317
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000318 AudioPort fmTunerInMix =
319 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(1, 1));
320 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
321 standardPcmAudioProfiles.begin(),
322 standardPcmAudioProfiles.end());
323 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000324
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000325 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, speakerOutDevice));
326 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, usbOutDevice));
327 c.routes.push_back(createRoute({micInDevice, usbInDevice}, primaryInMix));
328 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
329 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
330 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000331
332 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000333
334 MicrophoneInfo mic;
335 mic.id = "mic";
336 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
337 mic.group = 0;
338 mic.indexInTheGroup = 0;
339 c.microphones = std::vector<MicrophoneInfo>{mic};
340
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000341 return c;
342 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000343 return std::make_unique<Configuration>(configuration);
344}
345
346// Remote Submix configuration:
347//
348// Device ports:
349// * "Remote Submix Out", OUT_SUBMIX
350// - profile PCM 24-bit; STEREO; 48000
351// * "Remote Submix In", IN_SUBMIX
352// - profile PCM 24-bit; STEREO; 48000
353//
354// Mix ports:
355// * "r_submix output", stream count unlimited
356// - profile PCM 24-bit; STEREO; 48000
357// * "r_submix input", stream count unlimited
358// - profile PCM 24-bit; STEREO; 48000
359//
360// Routes:
361// "r_submix output" -> "Remote Submix Out"
362// "Remote Submix In" -> "r_submix input"
363//
364std::unique_ptr<Configuration> getRSubmixConfiguration() {
365 static const Configuration configuration = []() {
366 Configuration c;
367
368 // Device ports
369
Mikhail Naganov26526f12023-05-12 13:51:06 -0700370 AudioPort rsubmixOutDevice =
371 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
372 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
373 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000374 rsubmixOutDevice.profiles.push_back(
375 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
376 c.ports.push_back(rsubmixOutDevice);
377
378 AudioPort rsubmixInDevice = createPort(c.nextPortId++, "Remote Submix In", 0, true,
379 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0));
380 rsubmixInDevice.profiles.push_back(
381 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
382 c.ports.push_back(rsubmixInDevice);
383
384 // Mix ports
385
386 AudioPort rsubmixOutMix =
387 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(0, 0));
388 rsubmixOutMix.profiles.push_back(
389 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
390 c.ports.push_back(rsubmixOutMix);
391
392 AudioPort rsubmixInMix =
393 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(0, 0));
394 rsubmixInMix.profiles.push_back(
395 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
396 c.ports.push_back(rsubmixInMix);
397
398 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
399 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
400
401 return c;
402 }();
403 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000404}
405
jiabinb309d8d2023-01-20 19:07:15 +0000406// Usb configuration:
407//
408// Device ports:
409// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
410// - no profiles specified
411// * "USB Headset In", IN_HEADSET, CONNECTION_USB
412// - no profiles specified
413//
414// Mix ports:
415// * "usb_headset output", 1 max open, 1 max active stream
416// - no profiles specified
417// * "usb_headset input", 1 max open, 1 max active stream
418// - no profiles specified
419//
420// Profiles for device port connected state:
421// * USB Headset Out":
422// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
423// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
424// * USB Headset In":
425// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
426// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
427//
428std::unique_ptr<Configuration> getUsbConfiguration() {
429 static const Configuration configuration = []() {
430 const std::vector<AudioProfile> standardPcmAudioProfiles = {
431 createProfile(PcmType::INT_16_BIT,
432 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
433 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
434 {44100, 48000}),
435 createProfile(PcmType::INT_24_BIT,
436 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
437 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
438 {44100, 48000})};
439 Configuration c;
440
441 // Device ports
442
443 AudioPort usbOutHeadset =
444 createPort(c.nextPortId++, "USB Headset Out", 0, false,
445 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
446 AudioDeviceDescription::CONNECTION_USB));
447 c.ports.push_back(usbOutHeadset);
448 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
449
450 AudioPort usbInHeadset =
451 createPort(c.nextPortId++, "USB Headset In", 0, true,
452 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
453 AudioDeviceDescription::CONNECTION_USB));
454 c.ports.push_back(usbInHeadset);
455 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
456
457 // Mix ports
458
459 AudioPort usbHeadsetOutMix =
460 createPort(c.nextPortId++, "usb_headset output", 0, false, createPortMixExt(1, 1));
461 c.ports.push_back(usbHeadsetOutMix);
462
463 AudioPort usbHeadsetInMix =
464 createPort(c.nextPortId++, "usb_headset input", 0, true, createPortMixExt(1, 1));
465 c.ports.push_back(usbHeadsetInMix);
466
467 c.routes.push_back(createRoute({usbHeadsetOutMix}, usbOutHeadset));
468 c.routes.push_back(createRoute({usbInHeadset}, usbHeadsetInMix));
469
470 return c;
471 }();
472 return std::make_unique<Configuration>(configuration);
473}
474
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000475} // namespace aidl::android::hardware::audio::core::internal