blob: 0fbf55bb128069dffb5bd6cdaeefebd5d4a957c4 [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 Naganovcf824f62023-07-24 14:51:36 -0700139// * "Built-In Mic", IN_MICROPHONE, default
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000140// - 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
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700151// * "primary input", 1 max open, 1 max active stream
152// - profile PCM 16-bit; MONO, STEREO;
153// 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000154// * "telephony_tx", 1 max open, 1 max active stream
155// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000156// * "telephony_rx", 1 max open, 1 max active stream
157// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000158// * "fm_tuner", 1 max open, 1 max active stream
159// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000160//
161// Routes:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700162// "primary out" -> "Speaker"
163// "Built-In Mic" -> "primary input"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000164// "Telephony Rx" -> "telephony_rx"
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700165// "telephony_tx" -> "Telephony Tx"
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000166// "FM Tuner" -> "fm_tuner"
Mikhail Naganov00603d12022-05-02 22:52:13 +0000167//
168// Initial port configs:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700169// * "Speaker" device port: PCM 16-bit; STEREO; 48000
170// * "Built-In Mic" device port: PCM 16-bit; MONO; 48000
171// * "Telephony Tx" device port: PCM 16-bit; MONO; 48000
172// * "Telephony Rx" device port: PCM 16-bit; MONO; 48000
173// * "FM Tuner" device port: PCM 16-bit; STEREO; 48000
Mikhail Naganov00603d12022-05-02 22:52:13 +0000174//
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000175std::unique_ptr<Configuration> getPrimaryConfiguration() {
176 static const Configuration configuration = []() {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000177 const std::vector<AudioProfile> standardPcmAudioProfiles = {
178 createProfile(PcmType::INT_16_BIT,
179 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000180 {8000, 11025, 16000, 32000, 44100, 48000})};
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000181 Configuration c;
182
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000183 // Device ports
184
185 AudioPort speakerOutDevice =
186 createPort(c.nextPortId++, "Speaker", 0, false,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000187 createDeviceExt(AudioDeviceType::OUT_SPEAKER,
188 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000189 c.ports.push_back(speakerOutDevice);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000190 c.initialConfigs.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700191 createPortConfig(speakerOutDevice.id, speakerOutDevice.id, PcmType::INT_16_BIT,
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000192 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
193 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
194
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000195 AudioPort micInDevice =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700196 createPort(c.nextPortId++, "Built-In Mic", 0, true,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000197 createDeviceExt(AudioDeviceType::IN_MICROPHONE,
198 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
199 c.ports.push_back(micInDevice);
200 c.initialConfigs.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700201 createPortConfig(micInDevice.id, micInDevice.id, PcmType::INT_16_BIT,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000202 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
203 createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
204
205 AudioPort telephonyTxOutDevice =
206 createPort(c.nextPortId++, "Telephony Tx", 0, false,
207 createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
208 c.ports.push_back(telephonyTxOutDevice);
209 c.initialConfigs.push_back(
210 createPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700211 PcmType::INT_16_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000212 false, createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
213
214 AudioPort telephonyRxInDevice =
215 createPort(c.nextPortId++, "Telephony Rx", 0, true,
216 createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
217 c.ports.push_back(telephonyRxInDevice);
218 c.initialConfigs.push_back(
219 createPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700220 PcmType::INT_16_BIT, AudioChannelLayout::LAYOUT_MONO, 48000, 0,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000221 true, createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
222
223 AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
224 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
225 c.ports.push_back(fmTunerInDevice);
226 c.initialConfigs.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700227 createPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, PcmType::INT_16_BIT,
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000228 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, true,
229 createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
230
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000231 // Mix ports
232
Mikhail Naganov00603d12022-05-02 22:52:13 +0000233 AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
Mikhail Naganova2c5ddf2022-09-12 22:57:14 +0000234 makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
Mikhail Naganov00603d12022-05-02 22:52:13 +0000235 false, createPortMixExt(1, 1));
236 primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
237 standardPcmAudioProfiles.begin(),
238 standardPcmAudioProfiles.end());
239 c.ports.push_back(primaryOutMix);
240
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000241 AudioPort primaryInMix =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700242 createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(1, 1));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000243 primaryInMix.profiles.push_back(
244 createProfile(PcmType::INT_16_BIT,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700245 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
246 {8000, 11025, 16000, 32000, 44100, 48000}));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000247 c.ports.push_back(primaryInMix);
248
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000249 AudioPort telephonyTxOutMix =
250 createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
251 telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
252 standardPcmAudioProfiles.begin(),
253 standardPcmAudioProfiles.end());
254 c.ports.push_back(telephonyTxOutMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000255
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000256 AudioPort telephonyRxInMix =
257 createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(1, 1));
258 telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
259 standardPcmAudioProfiles.begin(),
260 standardPcmAudioProfiles.end());
261 c.ports.push_back(telephonyRxInMix);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000262
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000263 AudioPort fmTunerInMix =
264 createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(1, 1));
265 fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
266 standardPcmAudioProfiles.begin(),
267 standardPcmAudioProfiles.end());
268 c.ports.push_back(fmTunerInMix);
Mikhail Naganov00603d12022-05-02 22:52:13 +0000269
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700270 c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700271 c.routes.push_back(createRoute({micInDevice}, primaryInMix));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000272 c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700273 c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000274 c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000275
276 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000277
278 MicrophoneInfo mic;
279 mic.id = "mic";
280 mic.device = micInDevice.ext.get<AudioPortExt::Tag::device>().device;
281 mic.group = 0;
282 mic.indexInTheGroup = 0;
283 c.microphones = std::vector<MicrophoneInfo>{mic};
284
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000285 return c;
286 }();
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000287 return std::make_unique<Configuration>(configuration);
288}
289
290// Remote Submix configuration:
291//
292// Device ports:
293// * "Remote Submix Out", OUT_SUBMIX
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700294// - profile PCM 16-bit; STEREO; 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000295// * "Remote Submix In", IN_SUBMIX
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700296// - profile PCM 16-bit; STEREO; 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000297//
298// Mix ports:
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700299// * "r_submix output", 1 max open, 1 max active stream
300// - profile PCM 16-bit; STEREO; 48000
301// * "r_submix input", 1 max open, 1 max active stream
302// - profile PCM 16-bit; STEREO; 48000
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000303//
304// Routes:
305// "r_submix output" -> "Remote Submix Out"
306// "Remote Submix In" -> "r_submix input"
307//
308std::unique_ptr<Configuration> getRSubmixConfiguration() {
309 static const Configuration configuration = []() {
310 Configuration c;
311
312 // Device ports
313
Mikhail Naganov26526f12023-05-12 13:51:06 -0700314 AudioPort rsubmixOutDevice =
315 createPort(c.nextPortId++, "Remote Submix Out", 0, false,
316 createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
317 AudioDeviceDescription::CONNECTION_VIRTUAL));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000318 rsubmixOutDevice.profiles.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700319 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000320 c.ports.push_back(rsubmixOutDevice);
321
322 AudioPort rsubmixInDevice = createPort(c.nextPortId++, "Remote Submix In", 0, true,
323 createDeviceExt(AudioDeviceType::IN_SUBMIX, 0));
324 rsubmixInDevice.profiles.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700325 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000326 c.ports.push_back(rsubmixInDevice);
327
328 // Mix ports
329
330 AudioPort rsubmixOutMix =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700331 createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(1, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000332 rsubmixOutMix.profiles.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700333 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000334 c.ports.push_back(rsubmixOutMix);
335
336 AudioPort rsubmixInMix =
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700337 createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(1, 1));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000338 rsubmixInMix.profiles.push_back(
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700339 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {48000}));
Mikhail Naganovc8e43122022-12-09 00:33:47 +0000340 c.ports.push_back(rsubmixInMix);
341
342 c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
343 c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
344
345 return c;
346 }();
347 return std::make_unique<Configuration>(configuration);
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000348}
349
jiabinb309d8d2023-01-20 19:07:15 +0000350// Usb configuration:
351//
352// Device ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700353// * "USB Device Out", OUT_DEVICE, CONNECTION_USB
354// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000355// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
356// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700357// * "USB Device In", IN_DEVICE, CONNECTION_USB
358// - no profiles specified
jiabinb309d8d2023-01-20 19:07:15 +0000359// * "USB Headset In", IN_HEADSET, CONNECTION_USB
360// - no profiles specified
361//
362// Mix ports:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700363// * "usb_device output", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000364// - no profiles specified
Mikhail Naganov521fc492023-07-11 17:24:08 -0700365// * "usb_device input", 1 max open, 1 max active stream
jiabinb309d8d2023-01-20 19:07:15 +0000366// - no profiles specified
367//
Mikhail Naganov521fc492023-07-11 17:24:08 -0700368// Routes:
369// * "usb_device output" -> "USB Device Out"
370// * "usb_device output" -> "USB Headset Out"
371// * "USB Device In", "USB Headset In" -> "usb_device input"
372//
jiabinb309d8d2023-01-20 19:07:15 +0000373// Profiles for device port connected state:
Mikhail Naganov521fc492023-07-11 17:24:08 -0700374// * "USB Device Out", "USB Headset Out":
jiabinb309d8d2023-01-20 19:07:15 +0000375// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
376// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700377// * "USB Device In", "USB Headset In":
jiabinb309d8d2023-01-20 19:07:15 +0000378// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
379// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
380//
381std::unique_ptr<Configuration> getUsbConfiguration() {
382 static const Configuration configuration = []() {
383 const std::vector<AudioProfile> standardPcmAudioProfiles = {
384 createProfile(PcmType::INT_16_BIT,
385 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
386 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
387 {44100, 48000}),
388 createProfile(PcmType::INT_24_BIT,
389 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
390 AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
391 {44100, 48000})};
392 Configuration c;
393
394 // Device ports
395
Mikhail Naganov521fc492023-07-11 17:24:08 -0700396 AudioPort usbOutDevice =
397 createPort(c.nextPortId++, "USB Device Out", 0, false,
398 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
399 AudioDeviceDescription::CONNECTION_USB));
400 c.ports.push_back(usbOutDevice);
401 c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
402
jiabinb309d8d2023-01-20 19:07:15 +0000403 AudioPort usbOutHeadset =
404 createPort(c.nextPortId++, "USB Headset Out", 0, false,
405 createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
406 AudioDeviceDescription::CONNECTION_USB));
407 c.ports.push_back(usbOutHeadset);
408 c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
409
Mikhail Naganov521fc492023-07-11 17:24:08 -0700410 AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
411 createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
412 AudioDeviceDescription::CONNECTION_USB));
413 c.ports.push_back(usbInDevice);
414 c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
415
jiabinb309d8d2023-01-20 19:07:15 +0000416 AudioPort usbInHeadset =
417 createPort(c.nextPortId++, "USB Headset In", 0, true,
418 createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
419 AudioDeviceDescription::CONNECTION_USB));
420 c.ports.push_back(usbInHeadset);
421 c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
422
423 // Mix ports
424
Mikhail Naganov521fc492023-07-11 17:24:08 -0700425 AudioPort usbDeviceOutMix =
426 createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
427 c.ports.push_back(usbDeviceOutMix);
jiabinb309d8d2023-01-20 19:07:15 +0000428
Mikhail Naganov521fc492023-07-11 17:24:08 -0700429 AudioPort usbDeviceInMix =
430 createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(1, 1));
431 c.ports.push_back(usbDeviceInMix);
jiabinb309d8d2023-01-20 19:07:15 +0000432
Mikhail Naganov521fc492023-07-11 17:24:08 -0700433 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
434 c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
435 c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
436
437 return c;
438 }();
439 return std::make_unique<Configuration>(configuration);
440}
441
442// Stub configuration:
443//
444// Device ports:
445// * "Test Out", OUT_AFE_PROXY
446// - no profiles specified
447// * "Test In", IN_AFE_PROXY
448// - no profiles specified
449//
450// Mix ports:
451// * "test output", 1 max open, 1 max active stream
452// - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700453// * "test fast output", 1 max open, 1 max active stream
454// - profile PCM 24-bit; STEREO; 44100, 48000
455// * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
456// stream
Mikhail Naganov521fc492023-07-11 17:24:08 -0700457// - profile MP3; MONO, STEREO; 44100, 48000
458// * "test input", 2 max open, 2 max active streams
459// - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700460// 8000, 11025, 16000, 22050, 32000, 44100, 48000
Mikhail Naganov521fc492023-07-11 17:24:08 -0700461//
462// Routes:
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700463// "test output", "test fast output", "test compressed offload" -> "Test Out"
Mikhail Naganov521fc492023-07-11 17:24:08 -0700464// "Test In" -> "test input"
465//
466// Initial port configs:
467// * "Test Out" device port: PCM 24-bit; STEREO; 48000
468// * "Test In" device port: PCM 24-bit; MONO; 48000
469//
470std::unique_ptr<Configuration> getStubConfiguration() {
471 static const Configuration configuration = []() {
472 Configuration c;
473
474 // Device ports
475
476 AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
477 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
478 c.ports.push_back(testOutDevice);
479 c.initialConfigs.push_back(
480 createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
481 AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
482 createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
483
484 AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
485 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
486 c.ports.push_back(testInDevice);
487 c.initialConfigs.push_back(
488 createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
489 AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
490 createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
491
492 // Mix ports
493
494 AudioPort testOutMix =
495 createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
496 testOutMix.profiles.push_back(
497 createProfile(PcmType::INT_24_BIT,
498 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
499 {8000, 11025, 16000, 32000, 44100, 48000}));
500 c.ports.push_back(testOutMix);
501
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700502 AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
503 makeBitPositionFlagMask({AudioOutputFlags::FAST}),
504 false, createPortMixExt(1, 1));
505 testFastOutMix.profiles.push_back(createProfile(
506 PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
507 c.ports.push_back(testFastOutMix);
508
Mikhail Naganov521fc492023-07-11 17:24:08 -0700509 AudioPort compressedOffloadOutMix =
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700510 createPort(c.nextPortId++, "test compressed offload",
Mikhail Naganov521fc492023-07-11 17:24:08 -0700511 makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
512 AudioOutputFlags::COMPRESS_OFFLOAD,
513 AudioOutputFlags::NON_BLOCKING}),
514 false, createPortMixExt(1, 1));
515 compressedOffloadOutMix.profiles.push_back(
516 createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
517 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
518 {44100, 48000}));
519 c.ports.push_back(compressedOffloadOutMix);
520
521 AudioPort testInMIx =
522 createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
523 testInMIx.profiles.push_back(
524 createProfile(PcmType::INT_16_BIT,
525 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
526 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700527 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700528 testInMIx.profiles.push_back(
529 createProfile(PcmType::INT_24_BIT,
530 {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
531 AudioChannelLayout::LAYOUT_FRONT_BACK},
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700532 {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700533 c.ports.push_back(testInMIx);
534
Mikhail Naganov4bf68992023-08-07 17:11:14 -0700535 c.routes.push_back(
536 createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
Mikhail Naganov521fc492023-07-11 17:24:08 -0700537 c.routes.push_back(createRoute({testInDevice}, testInMIx));
538
539 c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
jiabinb309d8d2023-01-20 19:07:15 +0000540
541 return c;
542 }();
543 return std::make_unique<Configuration>(configuration);
544}
545
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700546// Bluetooth configuration:
547//
548// Device ports:
549// * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
550// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700551// * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700552// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
553// * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
554// - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
555// * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
556// - no profiles specified
557//
558// Mix ports:
559// * "a2dp output", 1 max open, 1 max active stream
560// - no profiles specified
561// * "hearing aid output", 1 max open, 1 max active stream
562// - profile PCM 16-bit; STEREO; 16000, 24000
563//
564// Routes:
565// "a2dp output" -> "BT A2DP Out"
566// "a2dp output" -> "BT A2DP Headphones"
567// "a2dp output" -> "BT A2DP Speaker"
568// "hearing aid output" -> "BT Hearing Aid Out"
569//
570std::unique_ptr<Configuration> getBluetoothConfiguration() {
571 static const Configuration configuration = []() {
572 const std::vector<AudioProfile> standardPcmAudioProfiles = {
573 createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
574 {44100, 48000, 88200, 96000})};
575 Configuration c;
576
577 // Device ports
578 AudioPort btOutDevice =
579 createPort(c.nextPortId++, "BT A2DP Out", 0, false,
580 createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
581 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700582 btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
583 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700584 c.ports.push_back(btOutDevice);
585 c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
586
587 AudioPort btOutHeadphone =
588 createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700589 createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700590 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700591 btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
592 standardPcmAudioProfiles.begin(),
593 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700594 c.ports.push_back(btOutHeadphone);
595 c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
596
597 AudioPort btOutSpeaker =
598 createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
599 createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
600 AudioDeviceDescription::CONNECTION_BT_A2DP));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700601 btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
602 standardPcmAudioProfiles.begin(),
603 standardPcmAudioProfiles.end());
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700604 c.ports.push_back(btOutSpeaker);
605 c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
606
607 AudioPort btOutHearingAid =
608 createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
609 createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
610 AudioDeviceDescription::CONNECTION_WIRELESS));
611 c.ports.push_back(btOutHearingAid);
612 c.connectedProfiles[btOutHearingAid.id] = std::vector<AudioProfile>(
613 {createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000})});
614
615 // Mix ports
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700616 AudioPort btOutMix =
617 createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
618 c.ports.push_back(btOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700619
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700620 AudioPort btHearingOutMix =
621 createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
622 btHearingOutMix.profiles.push_back(createProfile(
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700623 PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000}));
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700624 c.ports.push_back(btHearingOutMix);
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700625
Mikhail Naganovcf824f62023-07-24 14:51:36 -0700626 c.routes.push_back(createRoute({btOutMix}, btOutDevice));
627 c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
628 c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
629 c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
Mikhail Naganovb03b5c42023-07-26 13:13:35 -0700630
631 return c;
632 }();
633 return std::make_unique<Configuration>(configuration);
634}
635
Mikhail Naganovdf5adfd2021-11-11 22:09:22 +0000636} // namespace aidl::android::hardware::audio::core::internal