blob: 385ffbf9fc3a6b6953616f42f4ee9b59394c84f3 [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//
148// Mix ports:
149// * "primary output", PRIMARY, 1 max open, 1 max active stream
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000150// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
151// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000152// * "compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active stream
153// - profile MP3; MONO, STEREO; 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000154// * "primary input", 2 max open, 2 max active streams
155// - profile PCM 16-bit; MONO, STEREO, FRONT_BACK;
156// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
157// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
158// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000159// * "telephony_tx", 1 max open, 1 max active stream
160// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
161// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
162// * "telephony_rx", 1 max open, 1 max active stream
163// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
164// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
165// * "fm_tuner", 1 max open, 1 max active stream
166// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
167// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000168//
169// Routes:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000170// "primary out", "compressed offload" -> "Speaker"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700171// "Built-in Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000172// "telephony_tx" -> "Telephony Tx"
173// "Telephony Rx" -> "telephony_rx"
174// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000175//
176// Initial port configs:
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000177// * "Speaker" device port: PCM 24-bit; STEREO; 48000
178// * "Built-in Mic" device port: PCM 24-bit; MONO; 48000
179// * "Telephony Tx" device port: PCM 24-bit; MONO; 48000
180// * "Telephony Rx" device port: PCM 24-bit; MONO; 48000
181// * "FM Tuner" device port: PCM 24-bit; STEREO; 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000182//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000183std::unique_ptr<Configuration> getPrimaryConfiguration() {
184 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000185 const std::vector<AudioProfile> standardPcmAudioProfiles = {
186 createProfile(PcmType::INT_16_BIT,
187 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000188 {8000, 11025, 16000, 32000, 44100, 48000}),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000189 createProfile(PcmType::INT_24_BIT,
190 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000191 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000192 Configuration c;
193
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000194 // Device ports
195
196 AudioPort speakerOutDevice =
197 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000198 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
199 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000200 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000201 c.initialConfigs.push_back(
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000202 createPortConfig(speakerOutDevice.id, speakerOutDevice.id, PcmType::INT_24_BIT,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000203 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
204 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
205
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000206 AudioPort micInDevice =
207 createPort(c.nextPortId++, "Built-in Mic", 0, true,
208 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
209 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
210 c.ports.push_back(micInDevice);
211 c.initialConfigs.push_back(
212 createPortConfig(micInDevice.id, micInDevice.id, PcmType::INT_24_BIT,
213 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
214 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
215
216 AudioPort telephonyTxOutDevice =
217 createPort(c.nextPortId++, "Telephony Tx", 0, false,
218 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
219 c.ports.push_back(telephonyTxOutDevice);
220 c.initialConfigs.push_back(
221 createPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id,
222 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
223 false, createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
224
225 AudioPort telephonyRxInDevice =
226 createPort(c.nextPortId++, "Telephony Rx", 0, true,
227 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
228 c.ports.push_back(telephonyRxInDevice);
229 c.initialConfigs.push_back(
230 createPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id,
231 PcmType::INT_24_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
232 true, createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
233
234 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
235 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
236 c.ports.push_back(fmTunerInDevice);
237 c.initialConfigs.push_back(
238 createPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, PcmType::INT_24_BIT,
239 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, true,
240 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
241
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000242 // Mix ports
243
Mikhail Naganov00603d12022-05-02 22:52:13 +0000244 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000245 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000246 false, createPortMixExt(1, 1));
247 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
248 standardPcmAudioProfiles.begin(),
249 standardPcmAudioProfiles.end());
250 c.ports.push_back(primaryOutMix);
251
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000252 AudioPort compressedOffloadOutMix =
253 createPort(c.nextPortId++, "compressed offload",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000254 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
255 AudioOutputFlags::COMPRESS_OFFLOAD,
256 AudioOutputFlags::NON_BLOCKING}),
Mikhail Naganov111e0ce2022-06-17 21:41:19 +0000257 false, createPortMixExt(1, 1));
258 compressedOffloadOutMix.profiles.push_back(
259 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
260 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
261 {44100, 48000}));
262 c.ports.push_back(compressedOffloadOutMix);
263
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000264 AudioPort primaryInMix =
265 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(2, 2));
266 primaryInMix.profiles.push_back(
267 createProfile(PcmType::INT_16_BIT,
268 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
269 AudioChannelLayout::LAYOUT_FRONT_BACK},
270 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
271 primaryInMix.profiles.push_back(
272 createProfile(PcmType::INT_24_BIT,
273 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
274 AudioChannelLayout::LAYOUT_FRONT_BACK},
275 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
276 c.ports.push_back(primaryInMix);
277
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000278 AudioPort telephonyTxOutMix =
279 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
280 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
281 standardPcmAudioProfiles.begin(),
282 standardPcmAudioProfiles.end());
283 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000284
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000285 AudioPort telephonyRxInMix =
286 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(1, 1));
287 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
288 standardPcmAudioProfiles.begin(),
289 standardPcmAudioProfiles.end());
290 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000291
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000292 AudioPort fmTunerInMix =
293 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(1, 1));
294 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
295 standardPcmAudioProfiles.begin(),
296 standardPcmAudioProfiles.end());
297 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000298
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000299 c.routes.push_back(createRoute({primaryOutMix, compressedOffloadOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700300 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000301 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
302 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
303 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000304
305 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000306
307 MicrophoneInfo mic;
308 mic.id = "mic";
309 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
310 mic.group = 0;
311 mic.indexInTheGroup = 0;
312 c.microphones = std::vector<MicrophoneInfo>{mic};
313
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000314 return c;
315 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000316 return std::make_unique<Configuration>(configuration);
317}
318
319// Remote Submix configuration:
320//
321// Device ports:
322// * "Remote Submix Out", OUT_SUBMIX
323// - profile PCM 24-bit; STEREO; 48000
324// * "Remote Submix In", IN_SUBMIX
325// - profile PCM 24-bit; STEREO; 48000
326//
327// Mix ports:
328// * "r_submix output", stream count unlimited
329// - profile PCM 24-bit; STEREO; 48000
330// * "r_submix input", stream count unlimited
331// - profile PCM 24-bit; STEREO; 48000
332//
333// Routes:
334// "r_submix output" -> "Remote Submix Out"
335// "Remote Submix In" -> "r_submix input"
336//
337std::unique_ptr<Configuration> getRSubmixConfiguration() {
338 static const Configuration configuration = []() {
339 Configuration c;
340
341 // Device ports
342
Mikhail Naganov26526f12023-05-12 13:51:06 -0700343 AudioPort rsubmixOutDevice =
344 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
345 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
346 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000347 rsubmixOutDevice.profiles.push_back(
348 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
349 c.ports.push_back(rsubmixOutDevice);
350
351 AudioPort rsubmixInDevice = createPort(c.nextPortId++, "Remote Submix In", 0, true,
352 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0));
353 rsubmixInDevice.profiles.push_back(
354 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
355 c.ports.push_back(rsubmixInDevice);
356
357 // Mix ports
358
359 AudioPort rsubmixOutMix =
360 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(0, 0));
361 rsubmixOutMix.profiles.push_back(
362 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
363 c.ports.push_back(rsubmixOutMix);
364
365 AudioPort rsubmixInMix =
366 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(0, 0));
367 rsubmixInMix.profiles.push_back(
368 createProfile(PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
369 c.ports.push_back(rsubmixInMix);
370
371 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
372 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
373
374 return c;
375 }();
376 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000377}
378
jiabinb309d8d2023-01-20 19:07:15 +0000379// Usb configuration:
380//
381// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700382// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
383// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000384// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
385// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700386// * "USB Device In", IN_DEVICE, CONNECTION_USB
387// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000388// * "USB Headset In", IN_HEADSET, CONNECTION_USB
389// - no profiles specified
390//
391// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700392// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000393// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700394// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000395// - no profiles specified
396//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700397// Routes:
398// * "usb_device output" -> "USB Device Out"
399// * "usb_device output" -> "USB Headset Out"
400// * "USB Device In", "USB Headset In" -> "usb_device input"
401//
jiabinb309d8d2023-01-20 19:07:15 +0000402// Profiles for device port connected state:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700403// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000404// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
405// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700406// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000407// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
408// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
409//
410std::unique_ptr<Configuration> getUsbConfiguration() {
411 static const Configuration configuration = []() {
412 const std::vector<AudioProfile> standardPcmAudioProfiles = {
413 createProfile(PcmType::INT_16_BIT,
414 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
415 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
416 {44100, 48000}),
417 createProfile(PcmType::INT_24_BIT,
418 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
419 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
420 {44100, 48000})};
421 Configuration c;
422
423 // Device ports
424
Mikhail Naganov521fc492023-07-11 17:24:08 -0700425 AudioPort usbOutDevice =
426 createPort(c.nextPortId++, "USB Device Out", 0, false,
427 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
428 AudioDeviceDescription::CONNECTION_USB));
429 c.ports.push_back(usbOutDevice);
430 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
431
jiabinb309d8d2023-01-20 19:07:15 +0000432 AudioPort usbOutHeadset =
433 createPort(c.nextPortId++, "USB Headset Out", 0, false,
434 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
435 AudioDeviceDescription::CONNECTION_USB));
436 c.ports.push_back(usbOutHeadset);
437 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
438
Mikhail Naganov521fc492023-07-11 17:24:08 -0700439 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
440 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
441 AudioDeviceDescription::CONNECTION_USB));
442 c.ports.push_back(usbInDevice);
443 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
444
jiabinb309d8d2023-01-20 19:07:15 +0000445 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
Mikhail Naganov521fc492023-07-11 17:24:08 -0700454 AudioPort usbDeviceOutMix =
455 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
456 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000457
Mikhail Naganov521fc492023-07-11 17:24:08 -0700458 AudioPort usbDeviceInMix =
459 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(1, 1));
460 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000461
Mikhail Naganov521fc492023-07-11 17:24:08 -0700462 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
463 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
464 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
465
466 return c;
467 }();
468 return std::make_unique<Configuration>(configuration);
469}
470
471// Stub configuration:
472//
473// Device ports:
474// * "Test Out", OUT_AFE_PROXY
475// - no profiles specified
476// * "Test In", IN_AFE_PROXY
477// - no profiles specified
478//
479// Mix ports:
480// * "test output", 1 max open, 1 max active stream
481// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
482// * "compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active stream
483// - profile MP3; MONO, STEREO; 44100, 48000
484// * "test input", 2 max open, 2 max active streams
485// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
486// 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
487//
488// Routes:
489// "test output", "compressed offload" -> "Test Out"
490// "Test In" -> "test input"
491//
492// Initial port configs:
493// * "Test Out" device port: PCM 24-bit; STEREO; 48000
494// * "Test In" device port: PCM 24-bit; MONO; 48000
495//
496std::unique_ptr<Configuration> getStubConfiguration() {
497 static const Configuration configuration = []() {
498 Configuration c;
499
500 // Device ports
501
502 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
503 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
504 c.ports.push_back(testOutDevice);
505 c.initialConfigs.push_back(
506 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
507 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
508 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
509
510 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
511 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
512 c.ports.push_back(testInDevice);
513 c.initialConfigs.push_back(
514 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
515 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
516 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
517
518 // Mix ports
519
520 AudioPort testOutMix =
521 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
522 testOutMix.profiles.push_back(
523 createProfile(PcmType::INT_24_BIT,
524 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
525 {8000, 11025, 16000, 32000, 44100, 48000}));
526 c.ports.push_back(testOutMix);
527
528 AudioPort compressedOffloadOutMix =
529 createPort(c.nextPortId++, "compressed offload",
530 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
531 AudioOutputFlags::COMPRESS_OFFLOAD,
532 AudioOutputFlags::NON_BLOCKING}),
533 false, createPortMixExt(1, 1));
534 compressedOffloadOutMix.profiles.push_back(
535 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
536 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
537 {44100, 48000}));
538 c.ports.push_back(compressedOffloadOutMix);
539
540 AudioPort testInMIx =
541 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
542 testInMIx.profiles.push_back(
543 createProfile(PcmType::INT_16_BIT,
544 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
545 AudioChannelLayout::LAYOUT_FRONT_BACK},
546 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
547 testInMIx.profiles.push_back(
548 createProfile(PcmType::INT_24_BIT,
549 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
550 AudioChannelLayout::LAYOUT_FRONT_BACK},
551 {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}));
552 c.ports.push_back(testInMIx);
553
554 c.routes.push_back(createRoute({testOutMix, compressedOffloadOutMix}, testOutDevice));
555 c.routes.push_back(createRoute({testInDevice}, testInMIx));
556
557 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000558
559 return c;
560 }();
561 return std::make_unique<Configuration>(configuration);
562}
563
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700564// Bluetooth configuration:
565//
566// Device ports:
567// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
568// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
569// * "BT A2DP Headphones", OUT_HEADSET, CONNECTION_BT_A2DP
570// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
571// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
572// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
573// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
574// - no profiles specified
575//
576// Mix ports:
577// * "a2dp output", 1 max open, 1 max active stream
578// - no profiles specified
579// * "hearing aid output", 1 max open, 1 max active stream
580// - profile PCM 16-bit; STEREO; 16000, 24000
581//
582// Routes:
583// "a2dp output" -> "BT A2DP Out"
584// "a2dp output" -> "BT A2DP Headphones"
585// "a2dp output" -> "BT A2DP Speaker"
586// "hearing aid output" -> "BT Hearing Aid Out"
587//
588std::unique_ptr<Configuration> getBluetoothConfiguration() {
589 static const Configuration configuration = []() {
590 const std::vector<AudioProfile> standardPcmAudioProfiles = {
591 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
592 {44100, 48000, 88200, 96000})};
593 Configuration c;
594
595 // Device ports
596 AudioPort btOutDevice =
597 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
598 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
599 AudioDeviceDescription::CONNECTION_BT_A2DP));
600 c.ports.push_back(btOutDevice);
601 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
602
603 AudioPort btOutHeadphone =
604 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
605 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
606 AudioDeviceDescription::CONNECTION_BT_A2DP));
607 c.ports.push_back(btOutHeadphone);
608 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
609
610 AudioPort btOutSpeaker =
611 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
612 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
613 AudioDeviceDescription::CONNECTION_BT_A2DP));
614 c.ports.push_back(btOutSpeaker);
615 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
616
617 AudioPort btOutHearingAid =
618 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
619 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
620 AudioDeviceDescription::CONNECTION_WIRELESS));
621 c.ports.push_back(btOutHearingAid);
622 c.connectedProfiles[btOutHearingAid.id] = std::vector<AudioProfile>(
623 {createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000})});
624
625 // Mix ports
626 AudioPort btInMix =
627 createPort(c.nextPortId++, "a2dp output", 0, true, createPortMixExt(1, 1));
628 c.ports.push_back(btInMix);
629
630 AudioPort btHeadsetInMix =
631 createPort(c.nextPortId++, "hearing aid output", 0, true, createPortMixExt(1, 1));
632 btHeadsetInMix.profiles.push_back(createProfile(
633 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000}));
634 c.ports.push_back(btHeadsetInMix);
635
636 c.routes.push_back(createRoute({btInMix}, btOutDevice));
637 c.routes.push_back(createRoute({btInMix}, btOutHeadphone));
638 c.routes.push_back(createRoute({btInMix}, btOutSpeaker));
639 c.routes.push_back(createRoute({btHeadsetInMix}, btOutHearingAid));
640
641 return c;
642 }();
643 return std::make_unique<Configuration>(configuration);
644}
645
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000646} // namespace aidl::android::hardware::audio::core::internal