xref: /aosp_15_r20/frameworks/av/services/audiopolicy/tests/AudioPolicyManagerTestClient.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <map>
18*ec779b8eSAndroid Build Coastguard Worker #include <set>
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <media/TypeConverter.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include "AudioPolicyTestClient.h"
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyManagerTestClient : public AudioPolicyTestClient {
30*ec779b8eSAndroid Build Coastguard Worker public:
31*ec779b8eSAndroid Build Coastguard Worker     // AudioPolicyClientInterface implementation
loadHwModule(const char * name)32*ec779b8eSAndroid Build Coastguard Worker     audio_module_handle_t loadHwModule(const char* name) override {
33*ec779b8eSAndroid Build Coastguard Worker         if (!mAllowedModuleNames.empty() && !mAllowedModuleNames.count(name)) {
34*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODULE_HANDLE_NONE;
35*ec779b8eSAndroid Build Coastguard Worker         }
36*ec779b8eSAndroid Build Coastguard Worker         return mNextModuleHandle++;
37*ec779b8eSAndroid Build Coastguard Worker     }
38*ec779b8eSAndroid Build Coastguard Worker 
openOutput(audio_module_handle_t module,audio_io_handle_t * output,audio_config_t * halConfig,audio_config_base_t * mixerConfig,const sp<DeviceDescriptorBase> &,uint32_t *,audio_output_flags_t * flags,audio_attributes_t)39*ec779b8eSAndroid Build Coastguard Worker     status_t openOutput(audio_module_handle_t module,
40*ec779b8eSAndroid Build Coastguard Worker                         audio_io_handle_t *output,
41*ec779b8eSAndroid Build Coastguard Worker                         audio_config_t *halConfig,
42*ec779b8eSAndroid Build Coastguard Worker                         audio_config_base_t *mixerConfig,
43*ec779b8eSAndroid Build Coastguard Worker                         const sp<DeviceDescriptorBase>& /*device*/,
44*ec779b8eSAndroid Build Coastguard Worker                         uint32_t * /*latencyMs*/,
45*ec779b8eSAndroid Build Coastguard Worker                         audio_output_flags_t *flags,
46*ec779b8eSAndroid Build Coastguard Worker                         audio_attributes_t /*attributes*/) override {
47*ec779b8eSAndroid Build Coastguard Worker         if (module >= mNextModuleHandle) {
48*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
49*ec779b8eSAndroid Build Coastguard Worker                   __func__, module, mNextModuleHandle);
50*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
51*ec779b8eSAndroid Build Coastguard Worker         }
52*ec779b8eSAndroid Build Coastguard Worker         *output = mNextIoHandle++;
53*ec779b8eSAndroid Build Coastguard Worker         mOpenedOutputs[*output] = *flags;
54*ec779b8eSAndroid Build Coastguard Worker         ALOGD("%s: opened output %d: HAL(%s %s %d) Mixer(%s %s %d) %s", __func__, *output,
55*ec779b8eSAndroid Build Coastguard Worker               audio_channel_out_mask_to_string(halConfig->channel_mask),
56*ec779b8eSAndroid Build Coastguard Worker               audio_format_to_string(halConfig->format), halConfig->sample_rate,
57*ec779b8eSAndroid Build Coastguard Worker               audio_channel_out_mask_to_string(mixerConfig->channel_mask),
58*ec779b8eSAndroid Build Coastguard Worker               audio_format_to_string(mixerConfig->format), mixerConfig->sample_rate,
59*ec779b8eSAndroid Build Coastguard Worker               android::toString(*flags).c_str());
60*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
61*ec779b8eSAndroid Build Coastguard Worker     }
62*ec779b8eSAndroid Build Coastguard Worker 
openDuplicateOutput(audio_io_handle_t,audio_io_handle_t)63*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t openDuplicateOutput(audio_io_handle_t /*output1*/,
64*ec779b8eSAndroid Build Coastguard Worker                                           audio_io_handle_t /*output2*/) override {
65*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t id = mNextIoHandle++;
66*ec779b8eSAndroid Build Coastguard Worker         return id;
67*ec779b8eSAndroid Build Coastguard Worker     }
68*ec779b8eSAndroid Build Coastguard Worker 
closeOutput(audio_io_handle_t output)69*ec779b8eSAndroid Build Coastguard Worker     status_t closeOutput(audio_io_handle_t output) override {
70*ec779b8eSAndroid Build Coastguard Worker         if (auto iter = mOpenedOutputs.find(output); iter != mOpenedOutputs.end()) {
71*ec779b8eSAndroid Build Coastguard Worker             mOpenedOutputs.erase(iter);
72*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
73*ec779b8eSAndroid Build Coastguard Worker         } else {
74*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Unknown output %d", __func__, output);
75*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
76*ec779b8eSAndroid Build Coastguard Worker         }
77*ec779b8eSAndroid Build Coastguard Worker     }
78*ec779b8eSAndroid Build Coastguard Worker 
openInput(audio_module_handle_t module,audio_io_handle_t * input,audio_config_t *,audio_devices_t *,const String8 &,audio_source_t,audio_input_flags_t)79*ec779b8eSAndroid Build Coastguard Worker     status_t openInput(audio_module_handle_t module,
80*ec779b8eSAndroid Build Coastguard Worker                        audio_io_handle_t *input,
81*ec779b8eSAndroid Build Coastguard Worker                        audio_config_t * /*config*/,
82*ec779b8eSAndroid Build Coastguard Worker                        audio_devices_t * /*device*/,
83*ec779b8eSAndroid Build Coastguard Worker                        const String8 & /*address*/,
84*ec779b8eSAndroid Build Coastguard Worker                        audio_source_t /*source*/,
85*ec779b8eSAndroid Build Coastguard Worker                        audio_input_flags_t /*flags*/) override {
86*ec779b8eSAndroid Build Coastguard Worker         if (module >= mNextModuleHandle) {
87*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
88*ec779b8eSAndroid Build Coastguard Worker                   __func__, module, mNextModuleHandle);
89*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
90*ec779b8eSAndroid Build Coastguard Worker         }
91*ec779b8eSAndroid Build Coastguard Worker         *input = mNextIoHandle++;
92*ec779b8eSAndroid Build Coastguard Worker         mOpenedInputs.insert(*input);
93*ec779b8eSAndroid Build Coastguard Worker         ALOGD("%s: opened input %d", __func__, *input);
94*ec779b8eSAndroid Build Coastguard Worker         mOpenInputCallsCount++;
95*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
96*ec779b8eSAndroid Build Coastguard Worker     }
97*ec779b8eSAndroid Build Coastguard Worker 
closeInput(audio_io_handle_t input)98*ec779b8eSAndroid Build Coastguard Worker     status_t closeInput(audio_io_handle_t input) override {
99*ec779b8eSAndroid Build Coastguard Worker         if (mOpenedInputs.erase(input) != 1) {
100*ec779b8eSAndroid Build Coastguard Worker             if (input >= mNextIoHandle) {
101*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: I/O handle %d has not been allocated yet (next is %d)",
102*ec779b8eSAndroid Build Coastguard Worker                       __func__, input, mNextIoHandle);
103*ec779b8eSAndroid Build Coastguard Worker             } else {
104*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: Attempt to close input %d twice", __func__, input);
105*ec779b8eSAndroid Build Coastguard Worker             }
106*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
107*ec779b8eSAndroid Build Coastguard Worker         }
108*ec779b8eSAndroid Build Coastguard Worker         ALOGD("%s: closed input %d", __func__, input);
109*ec779b8eSAndroid Build Coastguard Worker         mCloseInputCallsCount++;
110*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
111*ec779b8eSAndroid Build Coastguard Worker     }
112*ec779b8eSAndroid Build Coastguard Worker 
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle,int)113*ec779b8eSAndroid Build Coastguard Worker     status_t createAudioPatch(const struct audio_patch *patch,
114*ec779b8eSAndroid Build Coastguard Worker                               audio_patch_handle_t *handle,
115*ec779b8eSAndroid Build Coastguard Worker                               int /*delayMs*/) override {
116*ec779b8eSAndroid Build Coastguard Worker         auto iter = mActivePatches.find(*handle);
117*ec779b8eSAndroid Build Coastguard Worker         if (iter != mActivePatches.end()) {
118*ec779b8eSAndroid Build Coastguard Worker             mActivePatches.erase(*handle);
119*ec779b8eSAndroid Build Coastguard Worker         }
120*ec779b8eSAndroid Build Coastguard Worker         *handle = mNextPatchHandle++;
121*ec779b8eSAndroid Build Coastguard Worker         mActivePatches.insert(std::make_pair(*handle, *patch));
122*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
123*ec779b8eSAndroid Build Coastguard Worker     }
124*ec779b8eSAndroid Build Coastguard Worker 
releaseAudioPatch(audio_patch_handle_t handle,int)125*ec779b8eSAndroid Build Coastguard Worker     status_t releaseAudioPatch(audio_patch_handle_t handle,
126*ec779b8eSAndroid Build Coastguard Worker                                int /*delayMs*/) override {
127*ec779b8eSAndroid Build Coastguard Worker         if (mActivePatches.erase(handle) != 1) {
128*ec779b8eSAndroid Build Coastguard Worker             if (handle >= mNextPatchHandle) {
129*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: Patch handle %d has not been allocated yet (next is %d)",
130*ec779b8eSAndroid Build Coastguard Worker                       __func__, handle, mNextPatchHandle);
131*ec779b8eSAndroid Build Coastguard Worker             } else {
132*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: Attempt to release patch %d twice", __func__, handle);
133*ec779b8eSAndroid Build Coastguard Worker             }
134*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
135*ec779b8eSAndroid Build Coastguard Worker         }
136*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
137*ec779b8eSAndroid Build Coastguard Worker     }
138*ec779b8eSAndroid Build Coastguard Worker 
onAudioPortListUpdate()139*ec779b8eSAndroid Build Coastguard Worker     void onAudioPortListUpdate() override {
140*ec779b8eSAndroid Build Coastguard Worker         ++mAudioPortListUpdateCount;
141*ec779b8eSAndroid Build Coastguard Worker     }
142*ec779b8eSAndroid Build Coastguard Worker 
setDeviceConnectedState(const struct audio_port_v7 * port,media::DeviceConnectedState state)143*ec779b8eSAndroid Build Coastguard Worker     status_t setDeviceConnectedState(const struct audio_port_v7 *port,
144*ec779b8eSAndroid Build Coastguard Worker                                      media::DeviceConnectedState state) override {
145*ec779b8eSAndroid Build Coastguard Worker         if (state == media::DeviceConnectedState::CONNECTED) {
146*ec779b8eSAndroid Build Coastguard Worker             mConnectedDevicePorts.push_back(*port);
147*ec779b8eSAndroid Build Coastguard Worker         } else if (state == media::DeviceConnectedState::DISCONNECTED){
148*ec779b8eSAndroid Build Coastguard Worker             mDisconnectedDevicePorts.push_back(*port);
149*ec779b8eSAndroid Build Coastguard Worker         }
150*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
151*ec779b8eSAndroid Build Coastguard Worker     }
152*ec779b8eSAndroid Build Coastguard Worker 
153*ec779b8eSAndroid Build Coastguard Worker     // Helper methods for tests
getActivePatchesCount()154*ec779b8eSAndroid Build Coastguard Worker     size_t getActivePatchesCount() const { return mActivePatches.size(); }
155*ec779b8eSAndroid Build Coastguard Worker 
getLastAddedPatch()156*ec779b8eSAndroid Build Coastguard Worker     const struct audio_patch *getLastAddedPatch() const {
157*ec779b8eSAndroid Build Coastguard Worker         if (mActivePatches.empty()) {
158*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
159*ec779b8eSAndroid Build Coastguard Worker         }
160*ec779b8eSAndroid Build Coastguard Worker         auto it = --mActivePatches.end();
161*ec779b8eSAndroid Build Coastguard Worker         return &it->second;
162*ec779b8eSAndroid Build Coastguard Worker     };
163*ec779b8eSAndroid Build Coastguard Worker 
getOpenedInputsCount()164*ec779b8eSAndroid Build Coastguard Worker     size_t getOpenedInputsCount() const { return mOpenedInputs.size(); }
165*ec779b8eSAndroid Build Coastguard Worker 
peekNextModuleHandle()166*ec779b8eSAndroid Build Coastguard Worker     audio_module_handle_t peekNextModuleHandle() const { return mNextModuleHandle; }
167*ec779b8eSAndroid Build Coastguard Worker 
168*ec779b8eSAndroid Build Coastguard Worker     void swapAllowedModuleNames(std::set<std::string>&& names = {}) {
169*ec779b8eSAndroid Build Coastguard Worker         mAllowedModuleNames.swap(names);
170*ec779b8eSAndroid Build Coastguard Worker     }
171*ec779b8eSAndroid Build Coastguard Worker 
getAudioPortListUpdateCount()172*ec779b8eSAndroid Build Coastguard Worker     size_t getAudioPortListUpdateCount() const { return mAudioPortListUpdateCount; }
173*ec779b8eSAndroid Build Coastguard Worker 
onRoutingUpdated()174*ec779b8eSAndroid Build Coastguard Worker     void onRoutingUpdated() override {
175*ec779b8eSAndroid Build Coastguard Worker         mRoutingUpdatedUpdateCount++;
176*ec779b8eSAndroid Build Coastguard Worker     }
177*ec779b8eSAndroid Build Coastguard Worker 
resetRoutingUpdatedCounter()178*ec779b8eSAndroid Build Coastguard Worker     void resetRoutingUpdatedCounter() {
179*ec779b8eSAndroid Build Coastguard Worker         mRoutingUpdatedUpdateCount = 0;
180*ec779b8eSAndroid Build Coastguard Worker     }
181*ec779b8eSAndroid Build Coastguard Worker 
getRoutingUpdatedCounter()182*ec779b8eSAndroid Build Coastguard Worker     size_t getRoutingUpdatedCounter() const {
183*ec779b8eSAndroid Build Coastguard Worker         return mRoutingUpdatedUpdateCount;
184*ec779b8eSAndroid Build Coastguard Worker     }
185*ec779b8eSAndroid Build Coastguard Worker 
onVolumeRangeInitRequest()186*ec779b8eSAndroid Build Coastguard Worker     void onVolumeRangeInitRequest() override {
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker     }
189*ec779b8eSAndroid Build Coastguard Worker 
updateSecondaryOutputs(const TrackSecondaryOutputsMap & trackSecondaryOutputs __unused)190*ec779b8eSAndroid Build Coastguard Worker     status_t updateSecondaryOutputs(
191*ec779b8eSAndroid Build Coastguard Worker             const TrackSecondaryOutputsMap& trackSecondaryOutputs __unused) override {
192*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
193*ec779b8eSAndroid Build Coastguard Worker     }
194*ec779b8eSAndroid Build Coastguard Worker 
getConnectedDevicePortCount()195*ec779b8eSAndroid Build Coastguard Worker     size_t getConnectedDevicePortCount() const {
196*ec779b8eSAndroid Build Coastguard Worker         return mConnectedDevicePorts.size();
197*ec779b8eSAndroid Build Coastguard Worker     }
198*ec779b8eSAndroid Build Coastguard Worker 
getLastConnectedDevicePort()199*ec779b8eSAndroid Build Coastguard Worker     const struct audio_port_v7 *getLastConnectedDevicePort() const {
200*ec779b8eSAndroid Build Coastguard Worker         if (mConnectedDevicePorts.empty()) {
201*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
202*ec779b8eSAndroid Build Coastguard Worker         }
203*ec779b8eSAndroid Build Coastguard Worker         auto it = --mConnectedDevicePorts.end();
204*ec779b8eSAndroid Build Coastguard Worker         return &(*it);
205*ec779b8eSAndroid Build Coastguard Worker     }
206*ec779b8eSAndroid Build Coastguard Worker 
getDisconnectedDevicePortCount()207*ec779b8eSAndroid Build Coastguard Worker     size_t getDisconnectedDevicePortCount() const {
208*ec779b8eSAndroid Build Coastguard Worker         return mDisconnectedDevicePorts.size();
209*ec779b8eSAndroid Build Coastguard Worker     }
210*ec779b8eSAndroid Build Coastguard Worker 
getLastDisconnectedDevicePort()211*ec779b8eSAndroid Build Coastguard Worker     const struct audio_port_v7 *getLastDisconnectedDevicePort() const {
212*ec779b8eSAndroid Build Coastguard Worker         if (mDisconnectedDevicePorts.empty()) {
213*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
214*ec779b8eSAndroid Build Coastguard Worker         }
215*ec779b8eSAndroid Build Coastguard Worker         auto it = --mDisconnectedDevicePorts.end();
216*ec779b8eSAndroid Build Coastguard Worker         return &(*it);
217*ec779b8eSAndroid Build Coastguard Worker     }
218*ec779b8eSAndroid Build Coastguard Worker 
getParameters(audio_io_handle_t,const String8 &)219*ec779b8eSAndroid Build Coastguard Worker     String8 getParameters(audio_io_handle_t /* ioHandle */, const String8&  /* keys*/ ) override {
220*ec779b8eSAndroid Build Coastguard Worker         AudioParameter mAudioParameters;
221*ec779b8eSAndroid Build Coastguard Worker         std::string formats;
222*ec779b8eSAndroid Build Coastguard Worker         for (const auto& f : mSupportedFormats) {
223*ec779b8eSAndroid Build Coastguard Worker             if (!formats.empty()) formats += AUDIO_PARAMETER_VALUE_LIST_SEPARATOR;
224*ec779b8eSAndroid Build Coastguard Worker             formats += audio_format_to_string(f);
225*ec779b8eSAndroid Build Coastguard Worker         }
226*ec779b8eSAndroid Build Coastguard Worker         mAudioParameters.add(
227*ec779b8eSAndroid Build Coastguard Worker                 String8(AudioParameter::keyStreamSupportedFormats),
228*ec779b8eSAndroid Build Coastguard Worker                 String8(formats.c_str()));
229*ec779b8eSAndroid Build Coastguard Worker         mAudioParameters.addInt(String8(AudioParameter::keyStreamSupportedSamplingRates), 48000);
230*ec779b8eSAndroid Build Coastguard Worker         std::string channelMasks;
231*ec779b8eSAndroid Build Coastguard Worker         for (const auto& cm : mSupportedChannelMasks) {
232*ec779b8eSAndroid Build Coastguard Worker             if (!audio_channel_mask_is_valid(cm)) {
233*ec779b8eSAndroid Build Coastguard Worker                 continue;
234*ec779b8eSAndroid Build Coastguard Worker             }
235*ec779b8eSAndroid Build Coastguard Worker             if (!channelMasks.empty()) channelMasks += AUDIO_PARAMETER_VALUE_LIST_SEPARATOR;
236*ec779b8eSAndroid Build Coastguard Worker             channelMasks += audio_channel_mask_to_string(cm);
237*ec779b8eSAndroid Build Coastguard Worker         }
238*ec779b8eSAndroid Build Coastguard Worker         mAudioParameters.add(
239*ec779b8eSAndroid Build Coastguard Worker                 String8(AudioParameter::keyStreamSupportedChannels), String8(channelMasks.c_str()));
240*ec779b8eSAndroid Build Coastguard Worker         return mAudioParameters.toString();
241*ec779b8eSAndroid Build Coastguard Worker     }
242*ec779b8eSAndroid Build Coastguard Worker 
getAudioMixPort(const struct audio_port_v7 * devicePort __unused,struct audio_port_v7 * mixPort)243*ec779b8eSAndroid Build Coastguard Worker     status_t getAudioMixPort(const struct audio_port_v7 *devicePort __unused,
244*ec779b8eSAndroid Build Coastguard Worker                              struct audio_port_v7 *mixPort) override {
245*ec779b8eSAndroid Build Coastguard Worker         mixPort->num_audio_profiles = 0;
246*ec779b8eSAndroid Build Coastguard Worker         for (auto format : mSupportedFormats) {
247*ec779b8eSAndroid Build Coastguard Worker             const int i = mixPort->num_audio_profiles;
248*ec779b8eSAndroid Build Coastguard Worker             mixPort->audio_profiles[i].format = format;
249*ec779b8eSAndroid Build Coastguard Worker             mixPort->audio_profiles[i].num_sample_rates = 1;
250*ec779b8eSAndroid Build Coastguard Worker             mixPort->audio_profiles[i].sample_rates[0] = 48000;
251*ec779b8eSAndroid Build Coastguard Worker             mixPort->audio_profiles[i].num_channel_masks = 0;
252*ec779b8eSAndroid Build Coastguard Worker             for (const auto& cm : mSupportedChannelMasks) {
253*ec779b8eSAndroid Build Coastguard Worker                 if (audio_channel_mask_is_valid(cm)) {
254*ec779b8eSAndroid Build Coastguard Worker                     mixPort->audio_profiles[i].channel_masks[
255*ec779b8eSAndroid Build Coastguard Worker                             mixPort->audio_profiles[i].num_channel_masks++] = cm;
256*ec779b8eSAndroid Build Coastguard Worker                 }
257*ec779b8eSAndroid Build Coastguard Worker             }
258*ec779b8eSAndroid Build Coastguard Worker             mixPort->num_audio_profiles++;
259*ec779b8eSAndroid Build Coastguard Worker         }
260*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
261*ec779b8eSAndroid Build Coastguard Worker     }
262*ec779b8eSAndroid Build Coastguard Worker 
setTracksInternalMute(const std::vector<media::TrackInternalMuteInfo> & tracksInternalMute)263*ec779b8eSAndroid Build Coastguard Worker     status_t setTracksInternalMute(
264*ec779b8eSAndroid Build Coastguard Worker             const std::vector<media::TrackInternalMuteInfo>& tracksInternalMute) override {
265*ec779b8eSAndroid Build Coastguard Worker         for (const auto& trackInternalMute : tracksInternalMute) {
266*ec779b8eSAndroid Build Coastguard Worker             mTracksInternalMute[(audio_port_handle_t)trackInternalMute.portId] =
267*ec779b8eSAndroid Build Coastguard Worker                     trackInternalMute.muted;
268*ec779b8eSAndroid Build Coastguard Worker         }
269*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
270*ec779b8eSAndroid Build Coastguard Worker     }
271*ec779b8eSAndroid Build Coastguard Worker 
addSupportedFormat(audio_format_t format)272*ec779b8eSAndroid Build Coastguard Worker     void addSupportedFormat(audio_format_t format) {
273*ec779b8eSAndroid Build Coastguard Worker         mSupportedFormats.insert(format);
274*ec779b8eSAndroid Build Coastguard Worker     }
275*ec779b8eSAndroid Build Coastguard Worker 
addSupportedChannelMask(audio_channel_mask_t channelMask)276*ec779b8eSAndroid Build Coastguard Worker     void addSupportedChannelMask(audio_channel_mask_t channelMask) {
277*ec779b8eSAndroid Build Coastguard Worker         mSupportedChannelMasks.insert(channelMask);
278*ec779b8eSAndroid Build Coastguard Worker     }
279*ec779b8eSAndroid Build Coastguard Worker 
getTrackInternalMute(audio_port_handle_t portId)280*ec779b8eSAndroid Build Coastguard Worker     bool getTrackInternalMute(audio_port_handle_t portId) {
281*ec779b8eSAndroid Build Coastguard Worker         auto it = mTracksInternalMute.find(portId);
282*ec779b8eSAndroid Build Coastguard Worker         return it == mTracksInternalMute.end() ? false : it->second;
283*ec779b8eSAndroid Build Coastguard Worker     }
resetInputApiCallsCounters()284*ec779b8eSAndroid Build Coastguard Worker     void resetInputApiCallsCounters() {
285*ec779b8eSAndroid Build Coastguard Worker         mOpenInputCallsCount = 0;
286*ec779b8eSAndroid Build Coastguard Worker         mCloseInputCallsCount = 0;
287*ec779b8eSAndroid Build Coastguard Worker     }
288*ec779b8eSAndroid Build Coastguard Worker 
getCloseInputCallsCount()289*ec779b8eSAndroid Build Coastguard Worker     size_t getCloseInputCallsCount() const {
290*ec779b8eSAndroid Build Coastguard Worker         return mCloseInputCallsCount;
291*ec779b8eSAndroid Build Coastguard Worker     }
292*ec779b8eSAndroid Build Coastguard Worker 
getOpenInputCallsCount()293*ec779b8eSAndroid Build Coastguard Worker     size_t getOpenInputCallsCount() const {
294*ec779b8eSAndroid Build Coastguard Worker         return mOpenInputCallsCount;
295*ec779b8eSAndroid Build Coastguard Worker     }
296*ec779b8eSAndroid Build Coastguard Worker 
getOpenOutputFlags(audio_io_handle_t output)297*ec779b8eSAndroid Build Coastguard Worker     std::optional<audio_output_flags_t> getOpenOutputFlags(audio_io_handle_t output) const {
298*ec779b8eSAndroid Build Coastguard Worker         if (auto iter = mOpenedOutputs.find(output); iter != mOpenedOutputs.end()) {
299*ec779b8eSAndroid Build Coastguard Worker             return iter->second;
300*ec779b8eSAndroid Build Coastguard Worker         }
301*ec779b8eSAndroid Build Coastguard Worker         return std::nullopt;
302*ec779b8eSAndroid Build Coastguard Worker     }
303*ec779b8eSAndroid Build Coastguard Worker 
304*ec779b8eSAndroid Build Coastguard Worker private:
305*ec779b8eSAndroid Build Coastguard Worker     audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1;
306*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1;
307*ec779b8eSAndroid Build Coastguard Worker     audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1;
308*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_patch_handle_t, struct audio_patch> mActivePatches;
309*ec779b8eSAndroid Build Coastguard Worker     std::set<std::string> mAllowedModuleNames;
310*ec779b8eSAndroid Build Coastguard Worker     size_t mAudioPortListUpdateCount = 0;
311*ec779b8eSAndroid Build Coastguard Worker     size_t mRoutingUpdatedUpdateCount = 0;
312*ec779b8eSAndroid Build Coastguard Worker     std::vector<struct audio_port_v7> mConnectedDevicePorts;
313*ec779b8eSAndroid Build Coastguard Worker     std::vector<struct audio_port_v7> mDisconnectedDevicePorts;
314*ec779b8eSAndroid Build Coastguard Worker     std::set<audio_format_t> mSupportedFormats;
315*ec779b8eSAndroid Build Coastguard Worker     std::set<audio_channel_mask_t> mSupportedChannelMasks;
316*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_port_handle_t, bool> mTracksInternalMute;
317*ec779b8eSAndroid Build Coastguard Worker     std::set<audio_io_handle_t> mOpenedInputs;
318*ec779b8eSAndroid Build Coastguard Worker     size_t mOpenInputCallsCount = 0;
319*ec779b8eSAndroid Build Coastguard Worker     size_t mCloseInputCallsCount = 0;
320*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_io_handle_t, audio_output_flags_t> mOpenedOutputs;
321*ec779b8eSAndroid Build Coastguard Worker };
322*ec779b8eSAndroid Build Coastguard Worker 
323*ec779b8eSAndroid Build Coastguard Worker } // namespace android
324