blob: 7b2deb743192199d9dc5403206159d0e67d3a843 [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 Naganov00603d12022-05-02 22:52:13 +000079 deviceExt.device.type.connection = std::move(connection);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +000080 deviceExt.flags = flags;
81 return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
82}
83
84static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
85 AudioPortMixExt mixExt;
86 mixExt.maxOpenStreamCount = maxOpenStreamCount;
87 mixExt.maxActiveStreamCount = maxActiveStreamCount;
88 return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
89}
90
91static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
92 const AudioPortExt& ext) {
93 AudioPort port;
94 port.id = id;
95 port.name = name;
96 port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
97 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
98 port.ext = ext;
99 return port;
100}
101
102static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
103 int32_t sampleRate, int32_t flags, bool isInput,
104 const AudioPortExt& ext) {
105 AudioPortConfig config;
106 config.id = id;
107 config.portId = portId;
108 config.sampleRate = Int{.value = sampleRate};
109 config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
110 config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
111 config.gain = AudioGainConfig();
112 config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
113 : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
114 config.ext = ext;
115 return config;
116}
117
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000118static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000119 AudioRoute route;
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000120 route.sinkPortId = sink.id;
121 std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
122 [](const auto& port) { return port.id; });
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000123 return route;
124}
125
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000126// Primary (default) configuration:
Mikhail Naganov00603d12022-05-02 22:52:13 +0000127//
128// Device ports:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000129// * "Speaker", OUT_SPEAKER, default
Mikhail Naganov00603d12022-05-02 22:52:13 +0000130// - no profiles specified
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000131// * "Built-in Mic", IN_MICROPHONE, default
132// - no profiles specified
133// * "Telephony Tx", OUT_TELEPHONY_TX
134// - no profiles specified
135// * "Telephony Rx", IN_TELEPHONY_RX
136// - no profiles specified
137// * "FM Tuner", IN_FM_TUNER
138// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000139// * "USB Out", OUT_DEVICE, CONNECTION_USB
140// - no profiles specified
Mikhail Naganov00603d12022-05-02 22:52:13 +0000141// * "USB In", IN_DEVICE, CONNECTION_USB
142// - no profiles specified
143//
144// Mix ports:
145// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000146// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
147// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000148// * "compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active stream
149// - profile MP3; MONO, STEREO; 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000150// * "primary input", 2 max open, 2 max active streams
151// - profile PCM 16-bit; MONO, STEREO, FRONT_BACK;
152// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
153// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
154// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000155// * "telephony_tx", 1 max open, 1 max active stream
156// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
157// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
158// * "telephony_rx", 1 max open, 1 max active stream
159// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
160// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
161// * "fm_tuner", 1 max open, 1 max active stream
162// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
163// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000164//
165// Routes:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000166// "primary out", "compressed offload" -> "Speaker"
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000167// "primary out", "compressed offload" -> "USB Out"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000168// "Built-in Mic", "USB In" -> "primary input"
169// "telephony_tx" -> "Telephony Tx"
170// "Telephony Rx" -> "telephony_rx"
171// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000172//
173// Initial port configs:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000174// * "Speaker" device port: PCM 24-bit; STEREO; 48000
175// * "Built-in Mic" device port: PCM 24-bit; MONO; 48000
176// * "Telephony Tx" device port: PCM 24-bit; MONO; 48000
177// * "Telephony Rx" device port: PCM 24-bit; MONO; 48000
178// * "FM Tuner" device port: PCM 24-bit; STEREO; 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000179//
180// Profiles for device port connected state:
181// * USB Out":
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000182// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
183// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000184// * USB In":
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000185// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
186// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000187//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000188std::unique_ptr<Configuration> getPrimaryConfiguration() {
189 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000190 const std::vector<AudioProfile> standardPcmAudioProfiles = {
191 createProfile(PcmType::INT_16_BIT,
192 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000193 {8000, 11025, 16000, 32000, 44100, 48000}),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000194 createProfile(PcmType::INT_24_BIT,
195 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000196 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000197 Configuration c;
198
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000199 // Device ports
200
201 AudioPort speakerOutDevice =
202 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000203 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
204 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000205 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000206 c.initialConfigs.push_back(
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000207 createPortConfig(speakerOutDevice.id, speakerOutDevice.id, PcmType::INT_24_BIT,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000208 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
209 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
210
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000211 AudioPort micInDevice =
212 createPort(c.nextPortId++, "Built-in Mic", 0, true,
213 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
214 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
215 c.ports.push_back(micInDevice);
216 c.initialConfigs.push_back(
217 createPortConfig(micInDevice.id, micInDevice.id, PcmType::INT_24_BIT,
218 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
219 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
220
221 AudioPort telephonyTxOutDevice =
222 createPort(c.nextPortId++, "Telephony Tx", 0, false,
223 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
224 c.ports.push_back(telephonyTxOutDevice);
225 c.initialConfigs.push_back(
226 createPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id,
227 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
228 false, createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
229
230 AudioPort telephonyRxInDevice =
231 createPort(c.nextPortId++, "Telephony Rx", 0, true,
232 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
233 c.ports.push_back(telephonyRxInDevice);
234 c.initialConfigs.push_back(
235 createPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id,
236 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
237 true, createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
238
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(
243 createPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, PcmType::INT_24_BIT,
244 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, true,
245 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
246
247 AudioPort usbOutDevice =
248 createPort(c.nextPortId++, "USB Out", 0, false,
249 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
250 AudioDeviceDescription::CONNECTION_USB));
251 c.ports.push_back(usbOutDevice);
252 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
253
254 AudioPort usbInDevice = createPort(c.nextPortId++, "USB In", 0, true,
255 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
256 AudioDeviceDescription::CONNECTION_USB));
257 c.ports.push_back(usbInDevice);
258 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
259
260 // Mix ports
261
Mikhail Naganov00603d12022-05-02 22:52:13 +0000262 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000263 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000264 false, createPortMixExt(1, 1));
265 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
266 standardPcmAudioProfiles.begin(),
267 standardPcmAudioProfiles.end());
268 c.ports.push_back(primaryOutMix);
269
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000270 AudioPort compressedOffloadOutMix =
271 createPort(c.nextPortId++, "compressed offload",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000272 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
273 AudioOutputFlags::COMPRESS_OFFLOAD,
274 AudioOutputFlags::NON_BLOCKING}),
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000275 false, createPortMixExt(1, 1));
276 compressedOffloadOutMix.profiles.push_back(
277 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
278 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
279 {44100, 48000}));
280 c.ports.push_back(compressedOffloadOutMix);
281
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000282 AudioPort primaryInMix =
283 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(2, 2));
284 primaryInMix.profiles.push_back(
285 createProfile(PcmType::INT_16_BIT,
286 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
287 AudioChannelLayout::LAYOUT_FRONT_BACK},
288 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
289 primaryInMix.profiles.push_back(
290 createProfile(PcmType::INT_24_BIT,
291 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
292 AudioChannelLayout::LAYOUT_FRONT_BACK},
293 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
294 c.ports.push_back(primaryInMix);
295
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000296 AudioPort telephonyTxOutMix =
297 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
298 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
299 standardPcmAudioProfiles.begin(),
300 standardPcmAudioProfiles.end());
301 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000302
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000303 AudioPort telephonyRxInMix =
304 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(1, 1));
305 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
306 standardPcmAudioProfiles.begin(),
307 standardPcmAudioProfiles.end());
308 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000309
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000310 AudioPort fmTunerInMix =
311 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(1, 1));
312 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
313 standardPcmAudioProfiles.begin(),
314 standardPcmAudioProfiles.end());
315 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000316
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000317 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, speakerOutDevice));
318 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, usbOutDevice));
319 c.routes.push_back(createRoute({micInDevice, usbInDevice}, primaryInMix));
320 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
321 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
322 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000323
324 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000325
326 MicrophoneInfo mic;
327 mic.id = "mic";
328 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
329 mic.group = 0;
330 mic.indexInTheGroup = 0;
331 c.microphones = std::vector<MicrophoneInfo>{mic};
332
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000333 return c;
334 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000335 return std::make_unique<Configuration>(configuration);
336}
337
338// Remote Submix configuration:
339//
340// Device ports:
341// * "Remote Submix Out", OUT_SUBMIX
342// - profile PCM 24-bit; STEREO; 48000
343// * "Remote Submix In", IN_SUBMIX
344// - profile PCM 24-bit; STEREO; 48000
345//
346// Mix ports:
347// * "r_submix output", stream count unlimited
348// - profile PCM 24-bit; STEREO; 48000
349// * "r_submix input", stream count unlimited
350// - profile PCM 24-bit; STEREO; 48000
351//
352// Routes:
353// "r_submix output" -> "Remote Submix Out"
354// "Remote Submix In" -> "r_submix input"
355//
356std::unique_ptr<Configuration> getRSubmixConfiguration() {
357 static const Configuration configuration = []() {
358 Configuration c;
359
360 // Device ports
361
362 AudioPort rsubmixOutDevice = createPort(c.nextPortId++, "Remote Submix Out", 0, false,
363 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0));
364 rsubmixOutDevice.profiles.push_back(
365 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
366 c.ports.push_back(rsubmixOutDevice);
367
368 AudioPort rsubmixInDevice = createPort(c.nextPortId++, "Remote Submix In", 0, true,
369 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0));
370 rsubmixInDevice.profiles.push_back(
371 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
372 c.ports.push_back(rsubmixInDevice);
373
374 // Mix ports
375
376 AudioPort rsubmixOutMix =
377 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(0, 0));
378 rsubmixOutMix.profiles.push_back(
379 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
380 c.ports.push_back(rsubmixOutMix);
381
382 AudioPort rsubmixInMix =
383 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(0, 0));
384 rsubmixInMix.profiles.push_back(
385 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
386 c.ports.push_back(rsubmixInMix);
387
388 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
389 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
390
391 return c;
392 }();
393 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000394}
395
jiabinb309d8d2023-01-20 19:07:15 +0000396// Usb configuration:
397//
398// Device ports:
399// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
400// - no profiles specified
401// * "USB Headset In", IN_HEADSET, CONNECTION_USB
402// - no profiles specified
403//
404// Mix ports:
405// * "usb_headset output", 1 max open, 1 max active stream
406// - no profiles specified
407// * "usb_headset input", 1 max open, 1 max active stream
408// - no profiles specified
409//
410// Profiles for device port connected state:
411// * USB Headset Out":
412// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
413// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
414// * USB Headset In":
415// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
416// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
417//
418std::unique_ptr<Configuration> getUsbConfiguration() {
419 static const Configuration configuration = []() {
420 const std::vector<AudioProfile> standardPcmAudioProfiles = {
421 createProfile(PcmType::INT_16_BIT,
422 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
423 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
424 {44100, 48000}),
425 createProfile(PcmType::INT_24_BIT,
426 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
427 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
428 {44100, 48000})};
429 Configuration c;
430
431 // Device ports
432
433 AudioPort usbOutHeadset =
434 createPort(c.nextPortId++, "USB Headset Out", 0, false,
435 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
436 AudioDeviceDescription::CONNECTION_USB));
437 c.ports.push_back(usbOutHeadset);
438 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
439
440 AudioPort usbInHeadset =
441 createPort(c.nextPortId++, "USB Headset In", 0, true,
442 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
443 AudioDeviceDescription::CONNECTION_USB));
444 c.ports.push_back(usbInHeadset);
445 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
446
447 // Mix ports
448
449 AudioPort usbHeadsetOutMix =
450 createPort(c.nextPortId++, "usb_headset output", 0, false, createPortMixExt(1, 1));
451 c.ports.push_back(usbHeadsetOutMix);
452
453 AudioPort usbHeadsetInMix =
454 createPort(c.nextPortId++, "usb_headset input", 0, true, createPortMixExt(1, 1));
455 c.ports.push_back(usbHeadsetInMix);
456
457 c.routes.push_back(createRoute({usbHeadsetOutMix}, usbOutHeadset));
458 c.routes.push_back(createRoute({usbInHeadset}, usbHeadsetInMix));
459
460 return c;
461 }();
462 return std::make_unique<Configuration>(configuration);
463}
464
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000465} // namespace aidl::android::hardware::audio::core::internal