1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include <Utils.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioChannelLayout.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioDeviceType.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioFormatDescription.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioFormatType.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioIoFlags.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioOutputFlags.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <media/stagefright/foundation/MediaDefs.h>
25*4d7e907cSAndroid Build Coastguard Worker
26*4d7e907cSAndroid Build Coastguard Worker #include "core-impl/Configuration.h"
27*4d7e907cSAndroid Build Coastguard Worker
28*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::audio::common::makeBitPositionFlagMask;
29*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioChannelLayout;
30*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioDeviceDescription;
31*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioDeviceType;
32*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioFormatDescription;
33*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioFormatType;
34*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioGainConfig;
35*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioIoFlags;
36*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioOutputFlags;
37*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioPort;
38*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioPortConfig;
39*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioPortDeviceExt;
40*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioPortExt;
41*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioPortMixExt;
42*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioProfile;
43*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::Int;
44*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::PcmType;
45*4d7e907cSAndroid Build Coastguard Worker using Configuration = aidl::android::hardware::audio::core::Module::Configuration;
46*4d7e907cSAndroid Build Coastguard Worker
47*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::audio::core::internal {
48*4d7e907cSAndroid Build Coastguard Worker
fillProfile(AudioProfile * profile,const std::vector<int32_t> & channelLayouts,const std::vector<int32_t> & sampleRates)49*4d7e907cSAndroid Build Coastguard Worker static void fillProfile(AudioProfile* profile, const std::vector<int32_t>& channelLayouts,
50*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& sampleRates) {
51*4d7e907cSAndroid Build Coastguard Worker for (auto layout : channelLayouts) {
52*4d7e907cSAndroid Build Coastguard Worker profile->channelMasks.push_back(
53*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout));
54*4d7e907cSAndroid Build Coastguard Worker }
55*4d7e907cSAndroid Build Coastguard Worker profile->sampleRates.insert(profile->sampleRates.end(), sampleRates.begin(), sampleRates.end());
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker
createProfile(PcmType pcmType,const std::vector<int32_t> & channelLayouts,const std::vector<int32_t> & sampleRates)58*4d7e907cSAndroid Build Coastguard Worker static AudioProfile createProfile(PcmType pcmType, const std::vector<int32_t>& channelLayouts,
59*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& sampleRates) {
60*4d7e907cSAndroid Build Coastguard Worker AudioProfile profile;
61*4d7e907cSAndroid Build Coastguard Worker profile.format.type = AudioFormatType::PCM;
62*4d7e907cSAndroid Build Coastguard Worker profile.format.pcm = pcmType;
63*4d7e907cSAndroid Build Coastguard Worker fillProfile(&profile, channelLayouts, sampleRates);
64*4d7e907cSAndroid Build Coastguard Worker return profile;
65*4d7e907cSAndroid Build Coastguard Worker }
66*4d7e907cSAndroid Build Coastguard Worker
createProfile(const std::string & encodingType,const std::vector<int32_t> & channelLayouts,const std::vector<int32_t> & sampleRates)67*4d7e907cSAndroid Build Coastguard Worker static AudioProfile createProfile(const std::string& encodingType,
68*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& channelLayouts,
69*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& sampleRates) {
70*4d7e907cSAndroid Build Coastguard Worker AudioProfile profile;
71*4d7e907cSAndroid Build Coastguard Worker profile.format.encoding = encodingType;
72*4d7e907cSAndroid Build Coastguard Worker fillProfile(&profile, channelLayouts, sampleRates);
73*4d7e907cSAndroid Build Coastguard Worker return profile;
74*4d7e907cSAndroid Build Coastguard Worker }
75*4d7e907cSAndroid Build Coastguard Worker
createDeviceExt(AudioDeviceType devType,int32_t flags,std::string connection="")76*4d7e907cSAndroid Build Coastguard Worker static AudioPortExt createDeviceExt(AudioDeviceType devType, int32_t flags,
77*4d7e907cSAndroid Build Coastguard Worker std::string connection = "") {
78*4d7e907cSAndroid Build Coastguard Worker AudioPortDeviceExt deviceExt;
79*4d7e907cSAndroid Build Coastguard Worker deviceExt.device.type.type = devType;
80*4d7e907cSAndroid Build Coastguard Worker if (devType == AudioDeviceType::IN_MICROPHONE && connection.empty()) {
81*4d7e907cSAndroid Build Coastguard Worker deviceExt.device.address = "bottom";
82*4d7e907cSAndroid Build Coastguard Worker } else if (devType == AudioDeviceType::IN_MICROPHONE_BACK && connection.empty()) {
83*4d7e907cSAndroid Build Coastguard Worker deviceExt.device.address = "back";
84*4d7e907cSAndroid Build Coastguard Worker }
85*4d7e907cSAndroid Build Coastguard Worker deviceExt.device.type.connection = std::move(connection);
86*4d7e907cSAndroid Build Coastguard Worker deviceExt.flags = flags;
87*4d7e907cSAndroid Build Coastguard Worker return AudioPortExt::make<AudioPortExt::Tag::device>(deviceExt);
88*4d7e907cSAndroid Build Coastguard Worker }
89*4d7e907cSAndroid Build Coastguard Worker
createPortMixExt(int32_t maxOpenStreamCount,int32_t maxActiveStreamCount)90*4d7e907cSAndroid Build Coastguard Worker static AudioPortExt createPortMixExt(int32_t maxOpenStreamCount, int32_t maxActiveStreamCount) {
91*4d7e907cSAndroid Build Coastguard Worker AudioPortMixExt mixExt;
92*4d7e907cSAndroid Build Coastguard Worker mixExt.maxOpenStreamCount = maxOpenStreamCount;
93*4d7e907cSAndroid Build Coastguard Worker mixExt.maxActiveStreamCount = maxActiveStreamCount;
94*4d7e907cSAndroid Build Coastguard Worker return AudioPortExt::make<AudioPortExt::Tag::mix>(mixExt);
95*4d7e907cSAndroid Build Coastguard Worker }
96*4d7e907cSAndroid Build Coastguard Worker
createPort(int32_t id,const std::string & name,int32_t flags,bool isInput,const AudioPortExt & ext)97*4d7e907cSAndroid Build Coastguard Worker static AudioPort createPort(int32_t id, const std::string& name, int32_t flags, bool isInput,
98*4d7e907cSAndroid Build Coastguard Worker const AudioPortExt& ext) {
99*4d7e907cSAndroid Build Coastguard Worker AudioPort port;
100*4d7e907cSAndroid Build Coastguard Worker port.id = id;
101*4d7e907cSAndroid Build Coastguard Worker port.name = name;
102*4d7e907cSAndroid Build Coastguard Worker port.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
103*4d7e907cSAndroid Build Coastguard Worker : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
104*4d7e907cSAndroid Build Coastguard Worker port.ext = ext;
105*4d7e907cSAndroid Build Coastguard Worker return port;
106*4d7e907cSAndroid Build Coastguard Worker }
107*4d7e907cSAndroid Build Coastguard Worker
createDynamicPortConfig(int32_t id,int32_t portId,int32_t flags,bool isInput,const AudioPortExt & ext)108*4d7e907cSAndroid Build Coastguard Worker static AudioPortConfig createDynamicPortConfig(int32_t id, int32_t portId, int32_t flags,
109*4d7e907cSAndroid Build Coastguard Worker bool isInput, const AudioPortExt& ext) {
110*4d7e907cSAndroid Build Coastguard Worker AudioPortConfig config;
111*4d7e907cSAndroid Build Coastguard Worker config.id = id;
112*4d7e907cSAndroid Build Coastguard Worker config.portId = portId;
113*4d7e907cSAndroid Build Coastguard Worker config.format = AudioFormatDescription{};
114*4d7e907cSAndroid Build Coastguard Worker config.channelMask = AudioChannelLayout{};
115*4d7e907cSAndroid Build Coastguard Worker config.sampleRate = Int{.value = 0};
116*4d7e907cSAndroid Build Coastguard Worker config.gain = AudioGainConfig();
117*4d7e907cSAndroid Build Coastguard Worker config.flags = isInput ? AudioIoFlags::make<AudioIoFlags::Tag::input>(flags)
118*4d7e907cSAndroid Build Coastguard Worker : AudioIoFlags::make<AudioIoFlags::Tag::output>(flags);
119*4d7e907cSAndroid Build Coastguard Worker config.ext = ext;
120*4d7e907cSAndroid Build Coastguard Worker return config;
121*4d7e907cSAndroid Build Coastguard Worker }
122*4d7e907cSAndroid Build Coastguard Worker
createPortConfig(int32_t id,int32_t portId,PcmType pcmType,int32_t layout,int32_t sampleRate,int32_t flags,bool isInput,const AudioPortExt & ext)123*4d7e907cSAndroid Build Coastguard Worker static AudioPortConfig createPortConfig(int32_t id, int32_t portId, PcmType pcmType, int32_t layout,
124*4d7e907cSAndroid Build Coastguard Worker int32_t sampleRate, int32_t flags, bool isInput,
125*4d7e907cSAndroid Build Coastguard Worker const AudioPortExt& ext) {
126*4d7e907cSAndroid Build Coastguard Worker AudioPortConfig config = createDynamicPortConfig(id, portId, flags, isInput, ext);
127*4d7e907cSAndroid Build Coastguard Worker config.sampleRate = Int{.value = sampleRate};
128*4d7e907cSAndroid Build Coastguard Worker config.channelMask = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layout);
129*4d7e907cSAndroid Build Coastguard Worker config.format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
130*4d7e907cSAndroid Build Coastguard Worker return config;
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker
createRoute(const std::vector<AudioPort> & sources,const AudioPort & sink)133*4d7e907cSAndroid Build Coastguard Worker static AudioRoute createRoute(const std::vector<AudioPort>& sources, const AudioPort& sink) {
134*4d7e907cSAndroid Build Coastguard Worker AudioRoute route;
135*4d7e907cSAndroid Build Coastguard Worker route.sinkPortId = sink.id;
136*4d7e907cSAndroid Build Coastguard Worker std::transform(sources.begin(), sources.end(), std::back_inserter(route.sourcePortIds),
137*4d7e907cSAndroid Build Coastguard Worker [](const auto& port) { return port.id; });
138*4d7e907cSAndroid Build Coastguard Worker return route;
139*4d7e907cSAndroid Build Coastguard Worker }
140*4d7e907cSAndroid Build Coastguard Worker
getStandard16And24BitPcmAudioProfiles()141*4d7e907cSAndroid Build Coastguard Worker std::vector<AudioProfile> getStandard16And24BitPcmAudioProfiles() {
142*4d7e907cSAndroid Build Coastguard Worker auto createStdPcmAudioProfile = [](const PcmType& pcmType) {
143*4d7e907cSAndroid Build Coastguard Worker return AudioProfile{
144*4d7e907cSAndroid Build Coastguard Worker .format = AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType},
145*4d7e907cSAndroid Build Coastguard Worker .channelMasks = {AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
146*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_MONO),
147*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
148*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_STEREO)},
149*4d7e907cSAndroid Build Coastguard Worker .sampleRates = {8000, 11025, 16000, 32000, 44100, 48000}};
150*4d7e907cSAndroid Build Coastguard Worker };
151*4d7e907cSAndroid Build Coastguard Worker return {
152*4d7e907cSAndroid Build Coastguard Worker createStdPcmAudioProfile(PcmType::INT_16_BIT),
153*4d7e907cSAndroid Build Coastguard Worker createStdPcmAudioProfile(PcmType::INT_24_BIT),
154*4d7e907cSAndroid Build Coastguard Worker };
155*4d7e907cSAndroid Build Coastguard Worker }
156*4d7e907cSAndroid Build Coastguard Worker
157*4d7e907cSAndroid Build Coastguard Worker // Primary (default) configuration:
158*4d7e907cSAndroid Build Coastguard Worker //
159*4d7e907cSAndroid Build Coastguard Worker // Device ports:
160*4d7e907cSAndroid Build Coastguard Worker // * "Speaker", OUT_SPEAKER, default
161*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
162*4d7e907cSAndroid Build Coastguard Worker // * "Built-In Mic", IN_MICROPHONE, default
163*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
164*4d7e907cSAndroid Build Coastguard Worker // * "Telephony Tx", OUT_TELEPHONY_TX
165*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
166*4d7e907cSAndroid Build Coastguard Worker // * "Telephony Rx", IN_TELEPHONY_RX
167*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
168*4d7e907cSAndroid Build Coastguard Worker // * "FM Tuner", IN_FM_TUNER
169*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
170*4d7e907cSAndroid Build Coastguard Worker //
171*4d7e907cSAndroid Build Coastguard Worker // Mix ports:
172*4d7e907cSAndroid Build Coastguard Worker // * "primary output", PRIMARY, 1 max open, 1 max active stream
173*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
174*4d7e907cSAndroid Build Coastguard Worker // * "primary input", 1 max open, 1 max active stream
175*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
176*4d7e907cSAndroid Build Coastguard Worker // * "telephony_tx", 1 max open, 1 max active stream
177*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
178*4d7e907cSAndroid Build Coastguard Worker // * "telephony_rx", 1 max open, 1 max active stream
179*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
180*4d7e907cSAndroid Build Coastguard Worker // * "fm_tuner", 1 max open, 1 max active stream
181*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
182*4d7e907cSAndroid Build Coastguard Worker //
183*4d7e907cSAndroid Build Coastguard Worker // Routes:
184*4d7e907cSAndroid Build Coastguard Worker // "primary out" -> "Speaker"
185*4d7e907cSAndroid Build Coastguard Worker // "Built-In Mic" -> "primary input"
186*4d7e907cSAndroid Build Coastguard Worker // "Telephony Rx" -> "telephony_rx"
187*4d7e907cSAndroid Build Coastguard Worker // "telephony_tx" -> "Telephony Tx"
188*4d7e907cSAndroid Build Coastguard Worker // "FM Tuner" -> "fm_tuner"
189*4d7e907cSAndroid Build Coastguard Worker //
190*4d7e907cSAndroid Build Coastguard Worker // Initial port configs:
191*4d7e907cSAndroid Build Coastguard Worker // * "Speaker" device port: dynamic configuration
192*4d7e907cSAndroid Build Coastguard Worker // * "Built-In Mic" device port: dynamic configuration
193*4d7e907cSAndroid Build Coastguard Worker // * "Telephony Tx" device port: dynamic configuration
194*4d7e907cSAndroid Build Coastguard Worker // * "Telephony Rx" device port: dynamic configuration
195*4d7e907cSAndroid Build Coastguard Worker // * "FM Tuner" device port: dynamic configuration
196*4d7e907cSAndroid Build Coastguard Worker //
getPrimaryConfiguration()197*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Configuration> getPrimaryConfiguration() {
198*4d7e907cSAndroid Build Coastguard Worker static const Configuration configuration = []() {
199*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioProfile> standardPcmAudioProfiles = {
200*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT,
201*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
202*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 32000, 44100, 48000})};
203*4d7e907cSAndroid Build Coastguard Worker Configuration c;
204*4d7e907cSAndroid Build Coastguard Worker
205*4d7e907cSAndroid Build Coastguard Worker // Device ports
206*4d7e907cSAndroid Build Coastguard Worker
207*4d7e907cSAndroid Build Coastguard Worker AudioPort speakerOutDevice =
208*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Speaker", 0, false,
209*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_SPEAKER,
210*4d7e907cSAndroid Build Coastguard Worker 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
211*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(speakerOutDevice);
212*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
213*4d7e907cSAndroid Build Coastguard Worker createDynamicPortConfig(speakerOutDevice.id, speakerOutDevice.id, 0, false,
214*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0)));
215*4d7e907cSAndroid Build Coastguard Worker
216*4d7e907cSAndroid Build Coastguard Worker AudioPort micInDevice =
217*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Built-In Mic", 0, true,
218*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_MICROPHONE,
219*4d7e907cSAndroid Build Coastguard Worker 1 << AudioPortDeviceExt::FLAG_INDEX_DEFAULT_DEVICE));
220*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(micInDevice);
221*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
222*4d7e907cSAndroid Build Coastguard Worker createDynamicPortConfig(micInDevice.id, micInDevice.id, 0, true,
223*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_MICROPHONE, 0)));
224*4d7e907cSAndroid Build Coastguard Worker
225*4d7e907cSAndroid Build Coastguard Worker AudioPort telephonyTxOutDevice =
226*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Telephony Tx", 0, false,
227*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0));
228*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(telephonyTxOutDevice);
229*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
230*4d7e907cSAndroid Build Coastguard Worker createDynamicPortConfig(telephonyTxOutDevice.id, telephonyTxOutDevice.id, 0, false,
231*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_TELEPHONY_TX, 0)));
232*4d7e907cSAndroid Build Coastguard Worker
233*4d7e907cSAndroid Build Coastguard Worker AudioPort telephonyRxInDevice =
234*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Telephony Rx", 0, true,
235*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0));
236*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(telephonyRxInDevice);
237*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
238*4d7e907cSAndroid Build Coastguard Worker createDynamicPortConfig(telephonyRxInDevice.id, telephonyRxInDevice.id, 0, true,
239*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_TELEPHONY_RX, 0)));
240*4d7e907cSAndroid Build Coastguard Worker
241*4d7e907cSAndroid Build Coastguard Worker AudioPort fmTunerInDevice = createPort(c.nextPortId++, "FM Tuner", 0, true,
242*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0));
243*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(fmTunerInDevice);
244*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
245*4d7e907cSAndroid Build Coastguard Worker createDynamicPortConfig(fmTunerInDevice.id, fmTunerInDevice.id, 0, true,
246*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_FM_TUNER, 0)));
247*4d7e907cSAndroid Build Coastguard Worker
248*4d7e907cSAndroid Build Coastguard Worker // Mix ports
249*4d7e907cSAndroid Build Coastguard Worker
250*4d7e907cSAndroid Build Coastguard Worker AudioPort primaryOutMix = createPort(c.nextPortId++, "primary output",
251*4d7e907cSAndroid Build Coastguard Worker makeBitPositionFlagMask(AudioOutputFlags::PRIMARY),
252*4d7e907cSAndroid Build Coastguard Worker false, createPortMixExt(0, 0));
253*4d7e907cSAndroid Build Coastguard Worker primaryOutMix.profiles.insert(primaryOutMix.profiles.begin(),
254*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
255*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
256*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(primaryOutMix);
257*4d7e907cSAndroid Build Coastguard Worker
258*4d7e907cSAndroid Build Coastguard Worker AudioPort primaryInMix =
259*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "primary input", 0, true, createPortMixExt(0, 1));
260*4d7e907cSAndroid Build Coastguard Worker primaryInMix.profiles.push_back(
261*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT,
262*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
263*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 32000, 44100, 48000}));
264*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(primaryInMix);
265*4d7e907cSAndroid Build Coastguard Worker
266*4d7e907cSAndroid Build Coastguard Worker AudioPort telephonyTxOutMix =
267*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "telephony_tx", 0, false, createPortMixExt(1, 1));
268*4d7e907cSAndroid Build Coastguard Worker telephonyTxOutMix.profiles.insert(telephonyTxOutMix.profiles.begin(),
269*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
270*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
271*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(telephonyTxOutMix);
272*4d7e907cSAndroid Build Coastguard Worker
273*4d7e907cSAndroid Build Coastguard Worker AudioPort telephonyRxInMix =
274*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "telephony_rx", 0, true, createPortMixExt(0, 1));
275*4d7e907cSAndroid Build Coastguard Worker telephonyRxInMix.profiles.insert(telephonyRxInMix.profiles.begin(),
276*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
277*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
278*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(telephonyRxInMix);
279*4d7e907cSAndroid Build Coastguard Worker
280*4d7e907cSAndroid Build Coastguard Worker AudioPort fmTunerInMix =
281*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "fm_tuner", 0, true, createPortMixExt(0, 1));
282*4d7e907cSAndroid Build Coastguard Worker fmTunerInMix.profiles.insert(fmTunerInMix.profiles.begin(),
283*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
284*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
285*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(fmTunerInMix);
286*4d7e907cSAndroid Build Coastguard Worker
287*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({primaryOutMix}, speakerOutDevice));
288*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({micInDevice}, primaryInMix));
289*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({telephonyRxInDevice}, telephonyRxInMix));
290*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({telephonyTxOutMix}, telephonyTxOutDevice));
291*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({fmTunerInDevice}, fmTunerInMix));
292*4d7e907cSAndroid Build Coastguard Worker
293*4d7e907cSAndroid Build Coastguard Worker c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
294*4d7e907cSAndroid Build Coastguard Worker
295*4d7e907cSAndroid Build Coastguard Worker return c;
296*4d7e907cSAndroid Build Coastguard Worker }();
297*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<Configuration>(configuration);
298*4d7e907cSAndroid Build Coastguard Worker }
299*4d7e907cSAndroid Build Coastguard Worker
300*4d7e907cSAndroid Build Coastguard Worker // Note: When transitioning to loading of XML configs, either keep the configuration
301*4d7e907cSAndroid Build Coastguard Worker // of the remote submix sources from this static configuration, or update the XML
302*4d7e907cSAndroid Build Coastguard Worker // config to match it. There are several reasons for that:
303*4d7e907cSAndroid Build Coastguard Worker // 1. The "Remote Submix In" device is listed in the XML config as "attached",
304*4d7e907cSAndroid Build Coastguard Worker // however in the AIDL scheme its device type has a "virtual" connection.
305*4d7e907cSAndroid Build Coastguard Worker // 2. The canonical r_submix configuration only lists 'STEREO' and '48000',
306*4d7e907cSAndroid Build Coastguard Worker // however the framework attempts to open streams for other sample rates
307*4d7e907cSAndroid Build Coastguard Worker // as well. The legacy r_submix implementation allowed that, but libaudiohal@aidl
308*4d7e907cSAndroid Build Coastguard Worker // will not find a mix port to use. Because of that, list all sample rates that
309*4d7e907cSAndroid Build Coastguard Worker // the legacy implementation allowed (note that mono was not allowed, the framework
310*4d7e907cSAndroid Build Coastguard Worker // is expected to upmix mono tracks into stereo if needed).
311*4d7e907cSAndroid Build Coastguard Worker // 3. The legacy implementation had a hard limit on the number of routes (10),
312*4d7e907cSAndroid Build Coastguard Worker // and this is checked indirectly by AudioPlaybackCaptureTest#testPlaybackCaptureDoS
313*4d7e907cSAndroid Build Coastguard Worker // CTS test. Instead of hardcoding the number of routes, we can use
314*4d7e907cSAndroid Build Coastguard Worker // "maxOpen/ActiveStreamCount" to enforce a similar limit. However, the canonical
315*4d7e907cSAndroid Build Coastguard Worker // XML file lacks this specification.
316*4d7e907cSAndroid Build Coastguard Worker //
317*4d7e907cSAndroid Build Coastguard Worker // Remote Submix configuration:
318*4d7e907cSAndroid Build Coastguard Worker //
319*4d7e907cSAndroid Build Coastguard Worker // Device ports:
320*4d7e907cSAndroid Build Coastguard Worker // * "Remote Submix Out", OUT_SUBMIX
321*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
322*4d7e907cSAndroid Build Coastguard Worker // * "Remote Submix In", IN_SUBMIX
323*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
324*4d7e907cSAndroid Build Coastguard Worker //
325*4d7e907cSAndroid Build Coastguard Worker // Mix ports:
326*4d7e907cSAndroid Build Coastguard Worker // * "r_submix output", maximum 10 opened streams, maximum 10 active streams
327*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
328*4d7e907cSAndroid Build Coastguard Worker // * "r_submix input", maximum 10 opened streams, maximum 10 active streams
329*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
330*4d7e907cSAndroid Build Coastguard Worker //
331*4d7e907cSAndroid Build Coastguard Worker // Routes:
332*4d7e907cSAndroid Build Coastguard Worker // "r_submix output" -> "Remote Submix Out"
333*4d7e907cSAndroid Build Coastguard Worker // "Remote Submix In" -> "r_submix input"
334*4d7e907cSAndroid Build Coastguard Worker //
getRSubmixConfiguration()335*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Configuration> getRSubmixConfiguration() {
336*4d7e907cSAndroid Build Coastguard Worker static const Configuration configuration = []() {
337*4d7e907cSAndroid Build Coastguard Worker Configuration c;
338*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
339*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
340*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 32000, 44100, 48000, 192000})};
341*4d7e907cSAndroid Build Coastguard Worker
342*4d7e907cSAndroid Build Coastguard Worker // Device ports
343*4d7e907cSAndroid Build Coastguard Worker
344*4d7e907cSAndroid Build Coastguard Worker AudioPort rsubmixOutDevice =
345*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Remote Submix Out", 0, false,
346*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_SUBMIX, 0,
347*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_VIRTUAL));
348*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(rsubmixOutDevice);
349*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[rsubmixOutDevice.id] = remoteSubmixPcmAudioProfiles;
350*4d7e907cSAndroid Build Coastguard Worker
351*4d7e907cSAndroid Build Coastguard Worker AudioPort rsubmixInDevice =
352*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Remote Submix In", 0, true,
353*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_SUBMIX, 0,
354*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_VIRTUAL));
355*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(rsubmixInDevice);
356*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[rsubmixInDevice.id] = remoteSubmixPcmAudioProfiles;
357*4d7e907cSAndroid Build Coastguard Worker
358*4d7e907cSAndroid Build Coastguard Worker // Mix ports
359*4d7e907cSAndroid Build Coastguard Worker
360*4d7e907cSAndroid Build Coastguard Worker AudioPort rsubmixOutMix =
361*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "r_submix output", 0, false, createPortMixExt(10, 10));
362*4d7e907cSAndroid Build Coastguard Worker rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
363*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(rsubmixOutMix);
364*4d7e907cSAndroid Build Coastguard Worker
365*4d7e907cSAndroid Build Coastguard Worker AudioPort rsubmixInMix =
366*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
367*4d7e907cSAndroid Build Coastguard Worker rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
368*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(rsubmixInMix);
369*4d7e907cSAndroid Build Coastguard Worker
370*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
371*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
372*4d7e907cSAndroid Build Coastguard Worker
373*4d7e907cSAndroid Build Coastguard Worker return c;
374*4d7e907cSAndroid Build Coastguard Worker }();
375*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<Configuration>(configuration);
376*4d7e907cSAndroid Build Coastguard Worker }
377*4d7e907cSAndroid Build Coastguard Worker
378*4d7e907cSAndroid Build Coastguard Worker // Usb configuration:
379*4d7e907cSAndroid Build Coastguard Worker //
380*4d7e907cSAndroid Build Coastguard Worker // Device ports:
381*4d7e907cSAndroid Build Coastguard Worker // * "USB Device Out", OUT_DEVICE, CONNECTION_USB
382*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
383*4d7e907cSAndroid Build Coastguard Worker // * "USB Headset Out", OUT_HEADSET, CONNECTION_USB
384*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
385*4d7e907cSAndroid Build Coastguard Worker // * "USB Device In", IN_DEVICE, CONNECTION_USB
386*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
387*4d7e907cSAndroid Build Coastguard Worker // * "USB Headset In", IN_HEADSET, CONNECTION_USB
388*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
389*4d7e907cSAndroid Build Coastguard Worker //
390*4d7e907cSAndroid Build Coastguard Worker // Mix ports:
391*4d7e907cSAndroid Build Coastguard Worker // * "usb_device output", 1 max open, 1 max active stream
392*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
393*4d7e907cSAndroid Build Coastguard Worker // * "usb_device input", 1 max open, 1 max active stream
394*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
395*4d7e907cSAndroid Build Coastguard Worker //
396*4d7e907cSAndroid Build Coastguard Worker // Routes:
397*4d7e907cSAndroid Build Coastguard Worker // * "usb_device output" -> "USB Device Out"
398*4d7e907cSAndroid Build Coastguard Worker // * "usb_device output" -> "USB Headset Out"
399*4d7e907cSAndroid Build Coastguard Worker // * "USB Device In", "USB Headset In" -> "usb_device input"
400*4d7e907cSAndroid Build Coastguard Worker //
401*4d7e907cSAndroid Build Coastguard Worker // Profiles for device port connected state (when simulating connections):
402*4d7e907cSAndroid Build Coastguard Worker // * "USB Device Out", "USB Headset Out":
403*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
404*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
405*4d7e907cSAndroid Build Coastguard Worker // * "USB Device In", "USB Headset In":
406*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
407*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000
408*4d7e907cSAndroid Build Coastguard Worker //
getUsbConfiguration()409*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Configuration> getUsbConfiguration() {
410*4d7e907cSAndroid Build Coastguard Worker static const Configuration configuration = []() {
411*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioProfile> standardPcmAudioProfiles = {
412*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT,
413*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
414*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
415*4d7e907cSAndroid Build Coastguard Worker {44100, 48000}),
416*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_24_BIT,
417*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
418*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2},
419*4d7e907cSAndroid Build Coastguard Worker {44100, 48000})};
420*4d7e907cSAndroid Build Coastguard Worker Configuration c;
421*4d7e907cSAndroid Build Coastguard Worker
422*4d7e907cSAndroid Build Coastguard Worker // Device ports
423*4d7e907cSAndroid Build Coastguard Worker
424*4d7e907cSAndroid Build Coastguard Worker AudioPort usbOutDevice =
425*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "USB Device Out", 0, false,
426*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
427*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_USB));
428*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbOutDevice);
429*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[usbOutDevice.id] = standardPcmAudioProfiles;
430*4d7e907cSAndroid Build Coastguard Worker
431*4d7e907cSAndroid Build Coastguard Worker AudioPort usbOutHeadset =
432*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "USB Headset Out", 0, false,
433*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
434*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_USB));
435*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbOutHeadset);
436*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles;
437*4d7e907cSAndroid Build Coastguard Worker
438*4d7e907cSAndroid Build Coastguard Worker AudioPort usbInDevice = createPort(c.nextPortId++, "USB Device In", 0, true,
439*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_DEVICE, 0,
440*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_USB));
441*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbInDevice);
442*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[usbInDevice.id] = standardPcmAudioProfiles;
443*4d7e907cSAndroid Build Coastguard Worker
444*4d7e907cSAndroid Build Coastguard Worker AudioPort usbInHeadset =
445*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "USB Headset In", 0, true,
446*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
447*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_USB));
448*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbInHeadset);
449*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles;
450*4d7e907cSAndroid Build Coastguard Worker
451*4d7e907cSAndroid Build Coastguard Worker // Mix ports
452*4d7e907cSAndroid Build Coastguard Worker
453*4d7e907cSAndroid Build Coastguard Worker AudioPort usbDeviceOutMix =
454*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "usb_device output", 0, false, createPortMixExt(1, 1));
455*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbDeviceOutMix);
456*4d7e907cSAndroid Build Coastguard Worker
457*4d7e907cSAndroid Build Coastguard Worker AudioPort usbDeviceInMix =
458*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "usb_device input", 0, true, createPortMixExt(0, 1));
459*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(usbDeviceInMix);
460*4d7e907cSAndroid Build Coastguard Worker
461*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutDevice));
462*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({usbDeviceOutMix}, usbOutHeadset));
463*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({usbInDevice, usbInHeadset}, usbDeviceInMix));
464*4d7e907cSAndroid Build Coastguard Worker
465*4d7e907cSAndroid Build Coastguard Worker return c;
466*4d7e907cSAndroid Build Coastguard Worker }();
467*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<Configuration>(configuration);
468*4d7e907cSAndroid Build Coastguard Worker }
469*4d7e907cSAndroid Build Coastguard Worker
470*4d7e907cSAndroid Build Coastguard Worker // Stub configuration:
471*4d7e907cSAndroid Build Coastguard Worker //
472*4d7e907cSAndroid Build Coastguard Worker // Device ports:
473*4d7e907cSAndroid Build Coastguard Worker // * "Test Out", OUT_AFE_PROXY
474*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
475*4d7e907cSAndroid Build Coastguard Worker // * "Test In", IN_AFE_PROXY
476*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
477*4d7e907cSAndroid Build Coastguard Worker // * "Wired Headset", OUT_HEADSET
478*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
479*4d7e907cSAndroid Build Coastguard Worker // * "Wired Headset Mic", IN_HEADSET
480*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
481*4d7e907cSAndroid Build Coastguard Worker //
482*4d7e907cSAndroid Build Coastguard Worker // Mix ports:
483*4d7e907cSAndroid Build Coastguard Worker // * "test output", 1 max open, 1 max active stream
484*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 24-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000
485*4d7e907cSAndroid Build Coastguard Worker // * "test fast output", 1 max open, 1 max active stream
486*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 24-bit; STEREO; 44100, 48000
487*4d7e907cSAndroid Build Coastguard Worker // * "test compressed offload", DIRECT|COMPRESS_OFFLOAD|NON_BLOCKING, 1 max open, 1 max active
488*4d7e907cSAndroid Build Coastguard Worker // stream
489*4d7e907cSAndroid Build Coastguard Worker // - profile MP3; MONO, STEREO; 44100, 48000
490*4d7e907cSAndroid Build Coastguard Worker // * "test input", 2 max open, 2 max active streams
491*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 24-bit; MONO, STEREO, FRONT_BACK;
492*4d7e907cSAndroid Build Coastguard Worker // 8000, 11025, 16000, 22050, 32000, 44100, 48000
493*4d7e907cSAndroid Build Coastguard Worker //
494*4d7e907cSAndroid Build Coastguard Worker // Routes:
495*4d7e907cSAndroid Build Coastguard Worker // "test output", "test fast output", "test compressed offload" -> "Test Out"
496*4d7e907cSAndroid Build Coastguard Worker // "test output" -> "Wired Headset"
497*4d7e907cSAndroid Build Coastguard Worker // "Test In", "Wired Headset Mic" -> "test input"
498*4d7e907cSAndroid Build Coastguard Worker //
499*4d7e907cSAndroid Build Coastguard Worker // Initial port configs:
500*4d7e907cSAndroid Build Coastguard Worker // * "Test Out" device port: PCM 24-bit; STEREO; 48000
501*4d7e907cSAndroid Build Coastguard Worker // * "Test In" device port: PCM 24-bit; MONO; 48000
502*4d7e907cSAndroid Build Coastguard Worker //
503*4d7e907cSAndroid Build Coastguard Worker // Profiles for device port connected state (when simulating connections):
504*4d7e907cSAndroid Build Coastguard Worker // * "Wired Headset": dynamic profiles
505*4d7e907cSAndroid Build Coastguard Worker // * "Wired Headset Mic": dynamic profiles
506*4d7e907cSAndroid Build Coastguard Worker //
getStubConfiguration()507*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Configuration> getStubConfiguration() {
508*4d7e907cSAndroid Build Coastguard Worker static const Configuration configuration = []() {
509*4d7e907cSAndroid Build Coastguard Worker Configuration c;
510*4d7e907cSAndroid Build Coastguard Worker
511*4d7e907cSAndroid Build Coastguard Worker // Device ports
512*4d7e907cSAndroid Build Coastguard Worker
513*4d7e907cSAndroid Build Coastguard Worker AudioPort testOutDevice = createPort(c.nextPortId++, "Test Out", 0, false,
514*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0));
515*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(testOutDevice);
516*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
517*4d7e907cSAndroid Build Coastguard Worker createPortConfig(testOutDevice.id, testOutDevice.id, PcmType::INT_24_BIT,
518*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_STEREO, 48000, 0, false,
519*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_AFE_PROXY, 0)));
520*4d7e907cSAndroid Build Coastguard Worker
521*4d7e907cSAndroid Build Coastguard Worker AudioPort headsetOutDevice =
522*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Wired Headset", 0, false,
523*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_HEADSET, 0,
524*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_ANALOG));
525*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(headsetOutDevice);
526*4d7e907cSAndroid Build Coastguard Worker
527*4d7e907cSAndroid Build Coastguard Worker AudioPort testInDevice = createPort(c.nextPortId++, "Test In", 0, true,
528*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0));
529*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(testInDevice);
530*4d7e907cSAndroid Build Coastguard Worker c.initialConfigs.push_back(
531*4d7e907cSAndroid Build Coastguard Worker createPortConfig(testInDevice.id, testInDevice.id, PcmType::INT_24_BIT,
532*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_MONO, 48000, 0, true,
533*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_AFE_PROXY, 0)));
534*4d7e907cSAndroid Build Coastguard Worker
535*4d7e907cSAndroid Build Coastguard Worker AudioPort headsetInDevice =
536*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "Wired Headset Mic", 0, true,
537*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::IN_HEADSET, 0,
538*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_ANALOG));
539*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(headsetInDevice);
540*4d7e907cSAndroid Build Coastguard Worker
541*4d7e907cSAndroid Build Coastguard Worker // Mix ports
542*4d7e907cSAndroid Build Coastguard Worker
543*4d7e907cSAndroid Build Coastguard Worker AudioPort testOutMix =
544*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "test output", 0, false, createPortMixExt(1, 1));
545*4d7e907cSAndroid Build Coastguard Worker testOutMix.profiles.push_back(
546*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_24_BIT,
547*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
548*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 32000, 44100, 48000}));
549*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(testOutMix);
550*4d7e907cSAndroid Build Coastguard Worker
551*4d7e907cSAndroid Build Coastguard Worker AudioPort testFastOutMix = createPort(c.nextPortId++, "test fast output",
552*4d7e907cSAndroid Build Coastguard Worker makeBitPositionFlagMask({AudioOutputFlags::FAST}),
553*4d7e907cSAndroid Build Coastguard Worker false, createPortMixExt(1, 1));
554*4d7e907cSAndroid Build Coastguard Worker testFastOutMix.profiles.push_back(createProfile(
555*4d7e907cSAndroid Build Coastguard Worker PcmType::INT_24_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {44100, 48000}));
556*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(testFastOutMix);
557*4d7e907cSAndroid Build Coastguard Worker
558*4d7e907cSAndroid Build Coastguard Worker AudioPort compressedOffloadOutMix =
559*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "test compressed offload",
560*4d7e907cSAndroid Build Coastguard Worker makeBitPositionFlagMask({AudioOutputFlags::DIRECT,
561*4d7e907cSAndroid Build Coastguard Worker AudioOutputFlags::COMPRESS_OFFLOAD,
562*4d7e907cSAndroid Build Coastguard Worker AudioOutputFlags::NON_BLOCKING}),
563*4d7e907cSAndroid Build Coastguard Worker false, createPortMixExt(1, 1));
564*4d7e907cSAndroid Build Coastguard Worker compressedOffloadOutMix.profiles.push_back(
565*4d7e907cSAndroid Build Coastguard Worker createProfile(::android::MEDIA_MIMETYPE_AUDIO_MPEG,
566*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO},
567*4d7e907cSAndroid Build Coastguard Worker {44100, 48000}));
568*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(compressedOffloadOutMix);
569*4d7e907cSAndroid Build Coastguard Worker
570*4d7e907cSAndroid Build Coastguard Worker AudioPort testInMix =
571*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "test input", 0, true, createPortMixExt(2, 2));
572*4d7e907cSAndroid Build Coastguard Worker testInMix.profiles.push_back(
573*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT,
574*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
575*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_FRONT_BACK},
576*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
577*4d7e907cSAndroid Build Coastguard Worker testInMix.profiles.push_back(
578*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_24_BIT,
579*4d7e907cSAndroid Build Coastguard Worker {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO,
580*4d7e907cSAndroid Build Coastguard Worker AudioChannelLayout::LAYOUT_FRONT_BACK},
581*4d7e907cSAndroid Build Coastguard Worker {8000, 11025, 16000, 22050, 32000, 44100, 48000}));
582*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(testInMix);
583*4d7e907cSAndroid Build Coastguard Worker
584*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(
585*4d7e907cSAndroid Build Coastguard Worker createRoute({testOutMix, testFastOutMix, compressedOffloadOutMix}, testOutDevice));
586*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({testOutMix}, headsetOutDevice));
587*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({testInDevice, headsetInDevice}, testInMix));
588*4d7e907cSAndroid Build Coastguard Worker
589*4d7e907cSAndroid Build Coastguard Worker c.portConfigs.insert(c.portConfigs.end(), c.initialConfigs.begin(), c.initialConfigs.end());
590*4d7e907cSAndroid Build Coastguard Worker
591*4d7e907cSAndroid Build Coastguard Worker return c;
592*4d7e907cSAndroid Build Coastguard Worker }();
593*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<Configuration>(configuration);
594*4d7e907cSAndroid Build Coastguard Worker }
595*4d7e907cSAndroid Build Coastguard Worker
596*4d7e907cSAndroid Build Coastguard Worker // Bluetooth configuration:
597*4d7e907cSAndroid Build Coastguard Worker //
598*4d7e907cSAndroid Build Coastguard Worker // Device ports:
599*4d7e907cSAndroid Build Coastguard Worker // * "BT A2DP Out", OUT_DEVICE, CONNECTION_BT_A2DP
600*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
601*4d7e907cSAndroid Build Coastguard Worker // * "BT A2DP Headphones", OUT_HEADPHONE, CONNECTION_BT_A2DP
602*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
603*4d7e907cSAndroid Build Coastguard Worker // * "BT A2DP Speaker", OUT_SPEAKER, CONNECTION_BT_A2DP
604*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
605*4d7e907cSAndroid Build Coastguard Worker // * "BT Hearing Aid Out", OUT_HEARING_AID, CONNECTION_WIRELESS
606*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
607*4d7e907cSAndroid Build Coastguard Worker //
608*4d7e907cSAndroid Build Coastguard Worker // Mix ports:
609*4d7e907cSAndroid Build Coastguard Worker // * "a2dp output", 1 max open, 1 max active stream
610*4d7e907cSAndroid Build Coastguard Worker // - no profiles specified
611*4d7e907cSAndroid Build Coastguard Worker // * "hearing aid output", 1 max open, 1 max active stream
612*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 16000, 24000
613*4d7e907cSAndroid Build Coastguard Worker //
614*4d7e907cSAndroid Build Coastguard Worker // Routes:
615*4d7e907cSAndroid Build Coastguard Worker // "a2dp output" -> "BT A2DP Out"
616*4d7e907cSAndroid Build Coastguard Worker // "a2dp output" -> "BT A2DP Headphones"
617*4d7e907cSAndroid Build Coastguard Worker // "a2dp output" -> "BT A2DP Speaker"
618*4d7e907cSAndroid Build Coastguard Worker // "hearing aid output" -> "BT Hearing Aid Out"
619*4d7e907cSAndroid Build Coastguard Worker //
620*4d7e907cSAndroid Build Coastguard Worker // Profiles for device port connected state (when simulating connections):
621*4d7e907cSAndroid Build Coastguard Worker // * "BT A2DP Out", "BT A2DP Headphones", "BT A2DP Speaker":
622*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 44100, 48000, 88200, 96000
623*4d7e907cSAndroid Build Coastguard Worker // * "BT Hearing Aid Out":
624*4d7e907cSAndroid Build Coastguard Worker // - profile PCM 16-bit; STEREO; 16000, 24000
625*4d7e907cSAndroid Build Coastguard Worker //
getBluetoothConfiguration()626*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Configuration> getBluetoothConfiguration() {
627*4d7e907cSAndroid Build Coastguard Worker static const Configuration configuration = []() {
628*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioProfile> standardPcmAudioProfiles = {
629*4d7e907cSAndroid Build Coastguard Worker createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
630*4d7e907cSAndroid Build Coastguard Worker {44100, 48000, 88200, 96000})};
631*4d7e907cSAndroid Build Coastguard Worker const std::vector<AudioProfile> hearingAidAudioProfiles = {createProfile(
632*4d7e907cSAndroid Build Coastguard Worker PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO}, {16000, 24000})};
633*4d7e907cSAndroid Build Coastguard Worker Configuration c;
634*4d7e907cSAndroid Build Coastguard Worker
635*4d7e907cSAndroid Build Coastguard Worker // Device ports
636*4d7e907cSAndroid Build Coastguard Worker AudioPort btOutDevice =
637*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "BT A2DP Out", 0, false,
638*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_DEVICE, 0,
639*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_BT_A2DP));
640*4d7e907cSAndroid Build Coastguard Worker btOutDevice.profiles.insert(btOutDevice.profiles.begin(), standardPcmAudioProfiles.begin(),
641*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
642*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btOutDevice);
643*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[btOutDevice.id] = standardPcmAudioProfiles;
644*4d7e907cSAndroid Build Coastguard Worker
645*4d7e907cSAndroid Build Coastguard Worker AudioPort btOutHeadphone =
646*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "BT A2DP Headphones", 0, false,
647*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_HEADPHONE, 0,
648*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_BT_A2DP));
649*4d7e907cSAndroid Build Coastguard Worker btOutHeadphone.profiles.insert(btOutHeadphone.profiles.begin(),
650*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
651*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
652*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btOutHeadphone);
653*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[btOutHeadphone.id] = standardPcmAudioProfiles;
654*4d7e907cSAndroid Build Coastguard Worker
655*4d7e907cSAndroid Build Coastguard Worker AudioPort btOutSpeaker =
656*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "BT A2DP Speaker", 0, false,
657*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_SPEAKER, 0,
658*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_BT_A2DP));
659*4d7e907cSAndroid Build Coastguard Worker btOutSpeaker.profiles.insert(btOutSpeaker.profiles.begin(),
660*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.begin(),
661*4d7e907cSAndroid Build Coastguard Worker standardPcmAudioProfiles.end());
662*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btOutSpeaker);
663*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[btOutSpeaker.id] = standardPcmAudioProfiles;
664*4d7e907cSAndroid Build Coastguard Worker
665*4d7e907cSAndroid Build Coastguard Worker AudioPort btOutHearingAid =
666*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "BT Hearing Aid Out", 0, false,
667*4d7e907cSAndroid Build Coastguard Worker createDeviceExt(AudioDeviceType::OUT_HEARING_AID, 0,
668*4d7e907cSAndroid Build Coastguard Worker AudioDeviceDescription::CONNECTION_WIRELESS));
669*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btOutHearingAid);
670*4d7e907cSAndroid Build Coastguard Worker c.connectedProfiles[btOutHearingAid.id] = hearingAidAudioProfiles;
671*4d7e907cSAndroid Build Coastguard Worker
672*4d7e907cSAndroid Build Coastguard Worker // Mix ports
673*4d7e907cSAndroid Build Coastguard Worker AudioPort btOutMix =
674*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "a2dp output", 0, false, createPortMixExt(1, 1));
675*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btOutMix);
676*4d7e907cSAndroid Build Coastguard Worker
677*4d7e907cSAndroid Build Coastguard Worker AudioPort btHearingOutMix =
678*4d7e907cSAndroid Build Coastguard Worker createPort(c.nextPortId++, "hearing aid output", 0, false, createPortMixExt(1, 1));
679*4d7e907cSAndroid Build Coastguard Worker btHearingOutMix.profiles = hearingAidAudioProfiles;
680*4d7e907cSAndroid Build Coastguard Worker c.ports.push_back(btHearingOutMix);
681*4d7e907cSAndroid Build Coastguard Worker
682*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({btOutMix}, btOutDevice));
683*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({btOutMix}, btOutHeadphone));
684*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({btOutMix}, btOutSpeaker));
685*4d7e907cSAndroid Build Coastguard Worker c.routes.push_back(createRoute({btHearingOutMix}, btOutHearingAid));
686*4d7e907cSAndroid Build Coastguard Worker
687*4d7e907cSAndroid Build Coastguard Worker return c;
688*4d7e907cSAndroid Build Coastguard Worker }();
689*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<Configuration>(configuration);
690*4d7e907cSAndroid Build Coastguard Worker }
691*4d7e907cSAndroid Build Coastguard Worker
getConfiguration(Module::Type moduleType)692*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<Module::Configuration> getConfiguration(Module::Type moduleType) {
693*4d7e907cSAndroid Build Coastguard Worker switch (moduleType) {
694*4d7e907cSAndroid Build Coastguard Worker case Module::Type::DEFAULT:
695*4d7e907cSAndroid Build Coastguard Worker return getPrimaryConfiguration();
696*4d7e907cSAndroid Build Coastguard Worker case Module::Type::R_SUBMIX:
697*4d7e907cSAndroid Build Coastguard Worker return getRSubmixConfiguration();
698*4d7e907cSAndroid Build Coastguard Worker case Module::Type::STUB:
699*4d7e907cSAndroid Build Coastguard Worker return getStubConfiguration();
700*4d7e907cSAndroid Build Coastguard Worker case Module::Type::USB:
701*4d7e907cSAndroid Build Coastguard Worker return getUsbConfiguration();
702*4d7e907cSAndroid Build Coastguard Worker case Module::Type::BLUETOOTH:
703*4d7e907cSAndroid Build Coastguard Worker return getBluetoothConfiguration();
704*4d7e907cSAndroid Build Coastguard Worker }
705*4d7e907cSAndroid Build Coastguard Worker }
706*4d7e907cSAndroid Build Coastguard Worker
707*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::audio::core::internal
708