xref: /aosp_15_r20/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2009 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 #pragma once
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <atomic>
20*ec779b8eSAndroid Build Coastguard Worker #include <functional>
21*ec779b8eSAndroid Build Coastguard Worker #include <memory>
22*ec779b8eSAndroid Build Coastguard Worker #include <unordered_set>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <cutils/config_utils.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <cutils/misc.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/Timers.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <utils/SortedVector.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioParameter.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioPolicy.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioProfile.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <media/PatchBuilder.h>
36*ec779b8eSAndroid Build Coastguard Worker #include "AudioPolicyInterface.h"
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker #include <android/media/DeviceConnectedState.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <android/media/audio/common/AudioPort.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <AudioPolicyManagerObserver.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <AudioPolicyConfig.h>
42*ec779b8eSAndroid Build Coastguard Worker #include <PolicyAudioPort.h>
43*ec779b8eSAndroid Build Coastguard Worker #include <AudioPatch.h>
44*ec779b8eSAndroid Build Coastguard Worker #include <DeviceDescriptor.h>
45*ec779b8eSAndroid Build Coastguard Worker #include <IOProfile.h>
46*ec779b8eSAndroid Build Coastguard Worker #include <HwModule.h>
47*ec779b8eSAndroid Build Coastguard Worker #include <AudioInputDescriptor.h>
48*ec779b8eSAndroid Build Coastguard Worker #include <AudioOutputDescriptor.h>
49*ec779b8eSAndroid Build Coastguard Worker #include <AudioPolicyMix.h>
50*ec779b8eSAndroid Build Coastguard Worker #include <EffectDescriptor.h>
51*ec779b8eSAndroid Build Coastguard Worker #include <PreferredMixerAttributesInfo.h>
52*ec779b8eSAndroid Build Coastguard Worker #include <SoundTriggerSession.h>
53*ec779b8eSAndroid Build Coastguard Worker #include "EngineLibrary.h"
54*ec779b8eSAndroid Build Coastguard Worker #include "TypeConverter.h"
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker namespace android {
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState;
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker // Attenuation applied to STRATEGY_SONIFICATION streams when a headset is connected: 6dB
63*ec779b8eSAndroid Build Coastguard Worker #define SONIFICATION_HEADSET_VOLUME_FACTOR_DB (-6)
64*ec779b8eSAndroid Build Coastguard Worker // Min volume for STRATEGY_SONIFICATION streams when limited by music volume: -36dB
65*ec779b8eSAndroid Build Coastguard Worker #define SONIFICATION_HEADSET_VOLUME_MIN_DB  (-36)
66*ec779b8eSAndroid Build Coastguard Worker // Max volume difference on A2DP between playing media and STRATEGY_SONIFICATION streams: 12dB
67*ec779b8eSAndroid Build Coastguard Worker #define SONIFICATION_A2DP_MAX_MEDIA_DIFF_DB (12)
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker // Time in milliseconds during which we consider that music is still active after a music
70*ec779b8eSAndroid Build Coastguard Worker // track was stopped - see computeVolume()
71*ec779b8eSAndroid Build Coastguard Worker #define SONIFICATION_HEADSET_MUSIC_DELAY  5000
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker // Time in milliseconds during witch some streams are muted while the audio path
74*ec779b8eSAndroid Build Coastguard Worker // is switched
75*ec779b8eSAndroid Build Coastguard Worker #define MUTE_TIME_MS 2000
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker // multiplication factor applied to output latency when calculating a safe mute delay when
78*ec779b8eSAndroid Build Coastguard Worker // invalidating tracks
79*ec779b8eSAndroid Build Coastguard Worker #define LATENCY_MUTE_FACTOR 4
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker #define NUM_TEST_OUTPUTS 5
82*ec779b8eSAndroid Build Coastguard Worker 
83*ec779b8eSAndroid Build Coastguard Worker #define NUM_VOL_CURVE_KNEES 2
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker // Default minimum length allowed for offloading a compressed track
86*ec779b8eSAndroid Build Coastguard Worker // Can be overridden by the audio.offload.min.duration.secs property
87*ec779b8eSAndroid Build Coastguard Worker #define OFFLOAD_DEFAULT_MIN_DURATION_SECS 60
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
90*ec779b8eSAndroid Build Coastguard Worker // AudioPolicyManager implements audio policy manager behavior common to all platforms.
91*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
92*ec779b8eSAndroid Build Coastguard Worker 
93*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyManager : public AudioPolicyInterface, public AudioPolicyManagerObserver
94*ec779b8eSAndroid Build Coastguard Worker {
95*ec779b8eSAndroid Build Coastguard Worker 
96*ec779b8eSAndroid Build Coastguard Worker public:
97*ec779b8eSAndroid Build Coastguard Worker         AudioPolicyManager(const sp<const AudioPolicyConfig>& config,
98*ec779b8eSAndroid Build Coastguard Worker                            EngineInstance&& engine,
99*ec779b8eSAndroid Build Coastguard Worker                            AudioPolicyClientInterface *clientInterface);
100*ec779b8eSAndroid Build Coastguard Worker         virtual ~AudioPolicyManager();
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker         // AudioPolicyInterface
103*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setDeviceConnectionState(audio_policy_dev_state_t state,
104*ec779b8eSAndroid Build Coastguard Worker                 const android::media::audio::common::AudioPort& port, audio_format_t encodedFormat);
105*ec779b8eSAndroid Build Coastguard Worker         virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
106*ec779b8eSAndroid Build Coastguard Worker                                                                   const char *device_address);
107*ec779b8eSAndroid Build Coastguard Worker         virtual status_t handleDeviceConfigChange(audio_devices_t device,
108*ec779b8eSAndroid Build Coastguard Worker                                                   const char *device_address,
109*ec779b8eSAndroid Build Coastguard Worker                                                   const char *device_name,
110*ec779b8eSAndroid Build Coastguard Worker                                                   audio_format_t encodedFormat);
111*ec779b8eSAndroid Build Coastguard Worker         virtual void setPhoneState(audio_mode_t state);
112*ec779b8eSAndroid Build Coastguard Worker         virtual void setForceUse(audio_policy_force_use_t usage,
113*ec779b8eSAndroid Build Coastguard Worker                                  audio_policy_forced_cfg_t config);
114*ec779b8eSAndroid Build Coastguard Worker         virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker         virtual void setSystemProperty(const char* property, const char* value);
117*ec779b8eSAndroid Build Coastguard Worker         virtual status_t initCheck();
118*ec779b8eSAndroid Build Coastguard Worker         virtual audio_io_handle_t getOutput(audio_stream_type_t stream);
119*ec779b8eSAndroid Build Coastguard Worker         status_t getOutputForAttr(const audio_attributes_t *attr,
120*ec779b8eSAndroid Build Coastguard Worker                                   audio_io_handle_t *output,
121*ec779b8eSAndroid Build Coastguard Worker                                   audio_session_t session,
122*ec779b8eSAndroid Build Coastguard Worker                                   audio_stream_type_t *stream,
123*ec779b8eSAndroid Build Coastguard Worker                                   const AttributionSourceState& attributionSource,
124*ec779b8eSAndroid Build Coastguard Worker                                   audio_config_t *config,
125*ec779b8eSAndroid Build Coastguard Worker                                   audio_output_flags_t *flags,
126*ec779b8eSAndroid Build Coastguard Worker                                   DeviceIdVector *selectedDeviceIds,
127*ec779b8eSAndroid Build Coastguard Worker                                   audio_port_handle_t *portId,
128*ec779b8eSAndroid Build Coastguard Worker                                   std::vector<audio_io_handle_t> *secondaryOutputs,
129*ec779b8eSAndroid Build Coastguard Worker                                   output_type_t *outputType,
130*ec779b8eSAndroid Build Coastguard Worker                                   bool *isSpatialized,
131*ec779b8eSAndroid Build Coastguard Worker                                   bool *isBitPerfect,
132*ec779b8eSAndroid Build Coastguard Worker                                   float *volume,
133*ec779b8eSAndroid Build Coastguard Worker                                   bool *muted) override;
134*ec779b8eSAndroid Build Coastguard Worker         virtual status_t startOutput(audio_port_handle_t portId);
135*ec779b8eSAndroid Build Coastguard Worker         virtual status_t stopOutput(audio_port_handle_t portId);
136*ec779b8eSAndroid Build Coastguard Worker         virtual bool releaseOutput(audio_port_handle_t portId);
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker         base::expected<media::GetInputForAttrResponse, std::variant<binder::Status,
139*ec779b8eSAndroid Build Coastguard Worker             media::audio::common::AudioConfigBase>>
140*ec779b8eSAndroid Build Coastguard Worker                          getInputForAttr(audio_attributes_t attributes,
141*ec779b8eSAndroid Build Coastguard Worker                                          audio_io_handle_t requestedInput,
142*ec779b8eSAndroid Build Coastguard Worker                                          audio_port_handle_t requestedDeviceId,
143*ec779b8eSAndroid Build Coastguard Worker                                          audio_config_base_t config,
144*ec779b8eSAndroid Build Coastguard Worker                                          audio_input_flags_t flags,
145*ec779b8eSAndroid Build Coastguard Worker                                          audio_unique_id_t riid,
146*ec779b8eSAndroid Build Coastguard Worker                                          audio_session_t session,
147*ec779b8eSAndroid Build Coastguard Worker                                          const AttributionSourceState& attributionSource) override;
148*ec779b8eSAndroid Build Coastguard Worker 
149*ec779b8eSAndroid Build Coastguard Worker         // indicates to the audio policy manager that the input starts being used.
150*ec779b8eSAndroid Build Coastguard Worker         virtual status_t startInput(audio_port_handle_t portId);
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker         // indicates to the audio policy manager that the input stops being used.
153*ec779b8eSAndroid Build Coastguard Worker         virtual status_t stopInput(audio_port_handle_t portId);
154*ec779b8eSAndroid Build Coastguard Worker         virtual void releaseInput(audio_port_handle_t portId);
155*ec779b8eSAndroid Build Coastguard Worker         virtual void checkCloseInputs();
156*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setDeviceAbsoluteVolumeEnabled(audio_devices_t deviceType,
157*ec779b8eSAndroid Build Coastguard Worker                                                         const char *address,
158*ec779b8eSAndroid Build Coastguard Worker                                                         bool enabled,
159*ec779b8eSAndroid Build Coastguard Worker                                                         audio_stream_type_t streamToDriveAbs);
160*ec779b8eSAndroid Build Coastguard Worker         /**
161*ec779b8eSAndroid Build Coastguard Worker          * @brief initStreamVolume: even if the engine volume files provides min and max, keep this
162*ec779b8eSAndroid Build Coastguard Worker          * api for compatibility reason.
163*ec779b8eSAndroid Build Coastguard Worker          * AudioServer will get the min and max and may overwrite them if:
164*ec779b8eSAndroid Build Coastguard Worker          *      -using property (highest priority)
165*ec779b8eSAndroid Build Coastguard Worker          *      -not defined (-1 by convention), case when still using apm volume tables XML files
166*ec779b8eSAndroid Build Coastguard Worker          * @param stream to be considered
167*ec779b8eSAndroid Build Coastguard Worker          * @param indexMin to set
168*ec779b8eSAndroid Build Coastguard Worker          * @param indexMax to set
169*ec779b8eSAndroid Build Coastguard Worker          */
170*ec779b8eSAndroid Build Coastguard Worker         virtual void initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax);
171*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
172*ec779b8eSAndroid Build Coastguard Worker                                               int index,
173*ec779b8eSAndroid Build Coastguard Worker                                               bool muted,
174*ec779b8eSAndroid Build Coastguard Worker                                               audio_devices_t device);
175*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
176*ec779b8eSAndroid Build Coastguard Worker                                               int *index,
177*ec779b8eSAndroid Build Coastguard Worker                                               audio_devices_t device);
178*ec779b8eSAndroid Build Coastguard Worker 
179*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr,
180*ec779b8eSAndroid Build Coastguard Worker                                                      int index,
181*ec779b8eSAndroid Build Coastguard Worker                                                      bool muted,
182*ec779b8eSAndroid Build Coastguard Worker                                                      audio_devices_t device);
183*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr,
184*ec779b8eSAndroid Build Coastguard Worker                                                      int &index,
185*ec779b8eSAndroid Build Coastguard Worker                                                      audio_devices_t device);
186*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index);
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index);
189*ec779b8eSAndroid Build Coastguard Worker 
190*ec779b8eSAndroid Build Coastguard Worker         status_t setVolumeCurveIndex(int index,
191*ec779b8eSAndroid Build Coastguard Worker                                      bool muted,
192*ec779b8eSAndroid Build Coastguard Worker                                      audio_devices_t device,
193*ec779b8eSAndroid Build Coastguard Worker                                      IVolumeCurves &volumeCurves);
194*ec779b8eSAndroid Build Coastguard Worker 
195*ec779b8eSAndroid Build Coastguard Worker         status_t getVolumeIndex(const IVolumeCurves &curves, int &index,
196*ec779b8eSAndroid Build Coastguard Worker                                 const DeviceTypeSet& deviceTypes) const;
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker         // return the strategy corresponding to a given stream type
getStrategyForStream(audio_stream_type_t stream)199*ec779b8eSAndroid Build Coastguard Worker         virtual product_strategy_t getStrategyForStream(audio_stream_type_t stream)
200*ec779b8eSAndroid Build Coastguard Worker         {
201*ec779b8eSAndroid Build Coastguard Worker             return streamToStrategy(stream);
202*ec779b8eSAndroid Build Coastguard Worker         }
streamToStrategy(audio_stream_type_t stream)203*ec779b8eSAndroid Build Coastguard Worker         product_strategy_t streamToStrategy(audio_stream_type_t stream) const
204*ec779b8eSAndroid Build Coastguard Worker         {
205*ec779b8eSAndroid Build Coastguard Worker             auto attributes = mEngine->getAttributesForStreamType(stream);
206*ec779b8eSAndroid Build Coastguard Worker             return mEngine->getProductStrategyForAttributes(attributes);
207*ec779b8eSAndroid Build Coastguard Worker         }
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker         /**
210*ec779b8eSAndroid Build Coastguard Worker          * Returns a vector of devices associated with attributes.
211*ec779b8eSAndroid Build Coastguard Worker          *
212*ec779b8eSAndroid Build Coastguard Worker          * An AudioTrack opened with specified attributes should play on the returned devices.
213*ec779b8eSAndroid Build Coastguard Worker          * If forVolume is set to true, the caller is AudioService, determining the proper
214*ec779b8eSAndroid Build Coastguard Worker          * device volume to adjust.
215*ec779b8eSAndroid Build Coastguard Worker          *
216*ec779b8eSAndroid Build Coastguard Worker          * Devices are determined in the following precedence:
217*ec779b8eSAndroid Build Coastguard Worker          * 1) Devices associated with a dynamic policy matching the attributes.  This is often
218*ec779b8eSAndroid Build Coastguard Worker          *    a remote submix from MIX_ROUTE_FLAG_LOOP_BACK.  Secondary mixes from a
219*ec779b8eSAndroid Build Coastguard Worker          *    dynamic policy are not included.
220*ec779b8eSAndroid Build Coastguard Worker          *
221*ec779b8eSAndroid Build Coastguard Worker          * If no such dynamic policy then
222*ec779b8eSAndroid Build Coastguard Worker          * 2) Devices containing an active client using setPreferredDevice
223*ec779b8eSAndroid Build Coastguard Worker          *    with same strategy as the attributes.
224*ec779b8eSAndroid Build Coastguard Worker          *    (from the default Engine::getOutputDevicesForAttributes() implementation).
225*ec779b8eSAndroid Build Coastguard Worker          *
226*ec779b8eSAndroid Build Coastguard Worker          * If no corresponding active client with setPreferredDevice then
227*ec779b8eSAndroid Build Coastguard Worker          * 3) Devices associated with the strategy determined by the attributes
228*ec779b8eSAndroid Build Coastguard Worker          *    (from the default Engine::getOutputDevicesForAttributes() implementation).
229*ec779b8eSAndroid Build Coastguard Worker          *
230*ec779b8eSAndroid Build Coastguard Worker          * @param attributes to be considered
231*ec779b8eSAndroid Build Coastguard Worker          * @param devices    an AudioDeviceTypeAddrVector container passed in that
232*ec779b8eSAndroid Build Coastguard Worker          *                   will be filled on success.
233*ec779b8eSAndroid Build Coastguard Worker          * @param forVolume  true if the devices are to be associated with current device volume.
234*ec779b8eSAndroid Build Coastguard Worker          * @return           NO_ERROR on success.
235*ec779b8eSAndroid Build Coastguard Worker          */
236*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getDevicesForAttributes(
237*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t &attributes,
238*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceTypeAddrVector *devices,
239*ec779b8eSAndroid Build Coastguard Worker                 bool forVolume);
240*ec779b8eSAndroid Build Coastguard Worker 
241*ec779b8eSAndroid Build Coastguard Worker         virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc = NULL);
242*ec779b8eSAndroid Build Coastguard Worker         virtual status_t registerEffect(const effect_descriptor_t *desc,
243*ec779b8eSAndroid Build Coastguard Worker                                         audio_io_handle_t io,
244*ec779b8eSAndroid Build Coastguard Worker                                         product_strategy_t strategy,
245*ec779b8eSAndroid Build Coastguard Worker                                         int session,
246*ec779b8eSAndroid Build Coastguard Worker                                         int id);
247*ec779b8eSAndroid Build Coastguard Worker         virtual status_t unregisterEffect(int id);
248*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setEffectEnabled(int id, bool enabled);
249*ec779b8eSAndroid Build Coastguard Worker         status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override;
250*ec779b8eSAndroid Build Coastguard Worker 
251*ec779b8eSAndroid Build Coastguard Worker         virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
252*ec779b8eSAndroid Build Coastguard Worker         // return whether a stream is playing remotely, override to change the definition of
253*ec779b8eSAndroid Build Coastguard Worker         //   local/remote playback, used for instance by notification manager to not make
254*ec779b8eSAndroid Build Coastguard Worker         //   media players lose audio focus when not playing locally
255*ec779b8eSAndroid Build Coastguard Worker         //   For the base implementation, "remotely" means playing during screen mirroring which
256*ec779b8eSAndroid Build Coastguard Worker         //   uses an output for playback with a non-empty, non "0" address.
257*ec779b8eSAndroid Build Coastguard Worker         virtual bool isStreamActiveRemotely(audio_stream_type_t stream,
258*ec779b8eSAndroid Build Coastguard Worker                                             uint32_t inPastMs = 0) const;
259*ec779b8eSAndroid Build Coastguard Worker 
260*ec779b8eSAndroid Build Coastguard Worker         virtual bool isSourceActive(audio_source_t source) const;
261*ec779b8eSAndroid Build Coastguard Worker 
262*ec779b8eSAndroid Build Coastguard Worker         // helpers for dump(int fd)
263*ec779b8eSAndroid Build Coastguard Worker         void dumpManualSurroundFormats(String8 *dst) const;
264*ec779b8eSAndroid Build Coastguard Worker         void dump(String8 *dst) const;
265*ec779b8eSAndroid Build Coastguard Worker 
266*ec779b8eSAndroid Build Coastguard Worker         status_t dump(int fd) override;
267*ec779b8eSAndroid Build Coastguard Worker 
268*ec779b8eSAndroid Build Coastguard Worker         status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) override;
269*ec779b8eSAndroid Build Coastguard Worker         virtual audio_offload_mode_t getOffloadSupport(const audio_offload_info_t& offloadInfo);
270*ec779b8eSAndroid Build Coastguard Worker 
271*ec779b8eSAndroid Build Coastguard Worker         virtual bool isDirectOutputSupported(const audio_config_base_t& config,
272*ec779b8eSAndroid Build Coastguard Worker                                              const audio_attributes_t& attributes);
273*ec779b8eSAndroid Build Coastguard Worker 
274*ec779b8eSAndroid Build Coastguard Worker         virtual status_t listAudioPorts(audio_port_role_t role,
275*ec779b8eSAndroid Build Coastguard Worker                                         audio_port_type_t type,
276*ec779b8eSAndroid Build Coastguard Worker                                         unsigned int *num_ports,
277*ec779b8eSAndroid Build Coastguard Worker                                         struct audio_port_v7 *ports,
278*ec779b8eSAndroid Build Coastguard Worker                                         unsigned int *generation);
279*ec779b8eSAndroid Build Coastguard Worker                 status_t listDeclaredDevicePorts(media::AudioPortRole role,
280*ec779b8eSAndroid Build Coastguard Worker                                                  std::vector<media::AudioPortFw>* result) override;
281*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getAudioPort(struct audio_port_v7 *port);
282*ec779b8eSAndroid Build Coastguard Worker         virtual status_t createAudioPatch(const struct audio_patch *patch,
283*ec779b8eSAndroid Build Coastguard Worker                                            audio_patch_handle_t *handle,
284*ec779b8eSAndroid Build Coastguard Worker                                            uid_t uid);
285*ec779b8eSAndroid Build Coastguard Worker         virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
286*ec779b8eSAndroid Build Coastguard Worker                                               uid_t uid);
287*ec779b8eSAndroid Build Coastguard Worker         virtual status_t listAudioPatches(unsigned int *num_patches,
288*ec779b8eSAndroid Build Coastguard Worker                                           struct audio_patch *patches,
289*ec779b8eSAndroid Build Coastguard Worker                                           unsigned int *generation);
290*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setAudioPortConfig(const struct audio_port_config *config);
291*ec779b8eSAndroid Build Coastguard Worker 
292*ec779b8eSAndroid Build Coastguard Worker         virtual void releaseResourcesForUid(uid_t uid);
293*ec779b8eSAndroid Build Coastguard Worker 
294*ec779b8eSAndroid Build Coastguard Worker         virtual status_t acquireSoundTriggerSession(audio_session_t *session,
295*ec779b8eSAndroid Build Coastguard Worker                                                audio_io_handle_t *ioHandle,
296*ec779b8eSAndroid Build Coastguard Worker                                                audio_devices_t *device);
297*ec779b8eSAndroid Build Coastguard Worker 
releaseSoundTriggerSession(audio_session_t session)298*ec779b8eSAndroid Build Coastguard Worker         virtual status_t releaseSoundTriggerSession(audio_session_t session)
299*ec779b8eSAndroid Build Coastguard Worker         {
300*ec779b8eSAndroid Build Coastguard Worker             return mSoundTriggerSessions.releaseSession(session);
301*ec779b8eSAndroid Build Coastguard Worker         }
302*ec779b8eSAndroid Build Coastguard Worker 
303*ec779b8eSAndroid Build Coastguard Worker         virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes);
304*ec779b8eSAndroid Build Coastguard Worker         virtual status_t unregisterPolicyMixes(Vector<AudioMix> mixes);
305*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getRegisteredPolicyMixes(std::vector<AudioMix>& mixes) override;
306*ec779b8eSAndroid Build Coastguard Worker         virtual status_t updatePolicyMix(
307*ec779b8eSAndroid Build Coastguard Worker                 const AudioMix& mix,
308*ec779b8eSAndroid Build Coastguard Worker                 const std::vector<AudioMixMatchCriterion>& updatedCriteria) override;
309*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setUidDeviceAffinities(uid_t uid,
310*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddrVector& devices);
311*ec779b8eSAndroid Build Coastguard Worker         virtual status_t removeUidDeviceAffinities(uid_t uid);
312*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setUserIdDeviceAffinities(int userId,
313*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddrVector& devices);
314*ec779b8eSAndroid Build Coastguard Worker         virtual status_t removeUserIdDeviceAffinities(int userId);
315*ec779b8eSAndroid Build Coastguard Worker 
316*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setDevicesRoleForStrategy(product_strategy_t strategy,
317*ec779b8eSAndroid Build Coastguard Worker                                                    device_role_t role,
318*ec779b8eSAndroid Build Coastguard Worker                                                    const AudioDeviceTypeAddrVector &devices);
319*ec779b8eSAndroid Build Coastguard Worker 
320*ec779b8eSAndroid Build Coastguard Worker         virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy,
321*ec779b8eSAndroid Build Coastguard Worker                                                       device_role_t role,
322*ec779b8eSAndroid Build Coastguard Worker                                                       const AudioDeviceTypeAddrVector &devices);
323*ec779b8eSAndroid Build Coastguard Worker 
324*ec779b8eSAndroid Build Coastguard Worker         virtual status_t clearDevicesRoleForStrategy(product_strategy_t strategy,
325*ec779b8eSAndroid Build Coastguard Worker                                                      device_role_t role);
326*ec779b8eSAndroid Build Coastguard Worker 
327*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getDevicesForRoleAndStrategy(product_strategy_t strategy,
328*ec779b8eSAndroid Build Coastguard Worker                                                       device_role_t role,
329*ec779b8eSAndroid Build Coastguard Worker                                                       AudioDeviceTypeAddrVector &devices);
330*ec779b8eSAndroid Build Coastguard Worker 
331*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setDevicesRoleForCapturePreset(audio_source_t audioSource,
332*ec779b8eSAndroid Build Coastguard Worker                                                         device_role_t role,
333*ec779b8eSAndroid Build Coastguard Worker                                                         const AudioDeviceTypeAddrVector &devices);
334*ec779b8eSAndroid Build Coastguard Worker 
335*ec779b8eSAndroid Build Coastguard Worker         virtual status_t addDevicesRoleForCapturePreset(audio_source_t audioSource,
336*ec779b8eSAndroid Build Coastguard Worker                                                         device_role_t role,
337*ec779b8eSAndroid Build Coastguard Worker                                                         const AudioDeviceTypeAddrVector &devices);
338*ec779b8eSAndroid Build Coastguard Worker 
339*ec779b8eSAndroid Build Coastguard Worker         virtual status_t removeDevicesRoleForCapturePreset(
340*ec779b8eSAndroid Build Coastguard Worker                 audio_source_t audioSource, device_role_t role,
341*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddrVector& devices);
342*ec779b8eSAndroid Build Coastguard Worker 
343*ec779b8eSAndroid Build Coastguard Worker         virtual status_t clearDevicesRoleForCapturePreset(audio_source_t audioSource,
344*ec779b8eSAndroid Build Coastguard Worker                                                           device_role_t role);
345*ec779b8eSAndroid Build Coastguard Worker 
346*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getDevicesForRoleAndCapturePreset(audio_source_t audioSource,
347*ec779b8eSAndroid Build Coastguard Worker                                                            device_role_t role,
348*ec779b8eSAndroid Build Coastguard Worker                                                            AudioDeviceTypeAddrVector &devices);
349*ec779b8eSAndroid Build Coastguard Worker 
350*ec779b8eSAndroid Build Coastguard Worker         virtual status_t startAudioSource(const struct audio_port_config *source,
351*ec779b8eSAndroid Build Coastguard Worker                                           const audio_attributes_t *attributes,
352*ec779b8eSAndroid Build Coastguard Worker                                           audio_port_handle_t *portId,
353*ec779b8eSAndroid Build Coastguard Worker                                           uid_t uid);
354*ec779b8eSAndroid Build Coastguard Worker         virtual status_t stopAudioSource(audio_port_handle_t portId);
355*ec779b8eSAndroid Build Coastguard Worker 
356*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setMasterMono(bool mono);
357*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getMasterMono(bool *mono);
358*ec779b8eSAndroid Build Coastguard Worker         virtual float    getStreamVolumeDB(
359*ec779b8eSAndroid Build Coastguard Worker                     audio_stream_type_t stream, int index, audio_devices_t device);
360*ec779b8eSAndroid Build Coastguard Worker 
361*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
362*ec779b8eSAndroid Build Coastguard Worker                                             audio_format_t *surroundFormats,
363*ec779b8eSAndroid Build Coastguard Worker                                             bool *surroundFormatsEnabled);
364*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getReportedSurroundFormats(unsigned int *numSurroundFormats,
365*ec779b8eSAndroid Build Coastguard Worker                                                     audio_format_t *surroundFormats);
366*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
367*ec779b8eSAndroid Build Coastguard Worker 
368*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getHwOffloadFormatsSupportedForBluetoothMedia(
369*ec779b8eSAndroid Build Coastguard Worker                     audio_devices_t device, std::vector<audio_format_t> *formats);
370*ec779b8eSAndroid Build Coastguard Worker 
371*ec779b8eSAndroid Build Coastguard Worker         virtual void setAppState(audio_port_handle_t portId, app_state_t state);
372*ec779b8eSAndroid Build Coastguard Worker 
373*ec779b8eSAndroid Build Coastguard Worker         virtual bool isHapticPlaybackSupported();
374*ec779b8eSAndroid Build Coastguard Worker 
375*ec779b8eSAndroid Build Coastguard Worker         virtual bool isUltrasoundSupported();
376*ec779b8eSAndroid Build Coastguard Worker 
377*ec779b8eSAndroid Build Coastguard Worker         bool isHotwordStreamSupported(bool lookbackAudio) override;
378*ec779b8eSAndroid Build Coastguard Worker 
listAudioProductStrategies(AudioProductStrategyVector & strategies)379*ec779b8eSAndroid Build Coastguard Worker         virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies)
380*ec779b8eSAndroid Build Coastguard Worker         {
381*ec779b8eSAndroid Build Coastguard Worker             return mEngine->listAudioProductStrategies(strategies);
382*ec779b8eSAndroid Build Coastguard Worker         }
383*ec779b8eSAndroid Build Coastguard Worker 
getProductStrategyFromAudioAttributes(const audio_attributes_t & aa,product_strategy_t & productStrategy,bool fallbackOnDefault)384*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getProductStrategyFromAudioAttributes(
385*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t &aa, product_strategy_t &productStrategy,
386*ec779b8eSAndroid Build Coastguard Worker                 bool fallbackOnDefault)
387*ec779b8eSAndroid Build Coastguard Worker         {
388*ec779b8eSAndroid Build Coastguard Worker             productStrategy = mEngine->getProductStrategyForAttributes(aa, fallbackOnDefault);
389*ec779b8eSAndroid Build Coastguard Worker             return (fallbackOnDefault && productStrategy == PRODUCT_STRATEGY_NONE) ?
390*ec779b8eSAndroid Build Coastguard Worker                     BAD_VALUE : NO_ERROR;
391*ec779b8eSAndroid Build Coastguard Worker         }
392*ec779b8eSAndroid Build Coastguard Worker 
listAudioVolumeGroups(AudioVolumeGroupVector & groups)393*ec779b8eSAndroid Build Coastguard Worker         virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
394*ec779b8eSAndroid Build Coastguard Worker         {
395*ec779b8eSAndroid Build Coastguard Worker             return mEngine->listAudioVolumeGroups(groups);
396*ec779b8eSAndroid Build Coastguard Worker         }
397*ec779b8eSAndroid Build Coastguard Worker 
getVolumeGroupFromAudioAttributes(const audio_attributes_t & aa,volume_group_t & volumeGroup,bool fallbackOnDefault)398*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getVolumeGroupFromAudioAttributes(
399*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t &aa, volume_group_t &volumeGroup, bool fallbackOnDefault)
400*ec779b8eSAndroid Build Coastguard Worker         {
401*ec779b8eSAndroid Build Coastguard Worker             volumeGroup = mEngine->getVolumeGroupForAttributes(aa, fallbackOnDefault);
402*ec779b8eSAndroid Build Coastguard Worker             return (fallbackOnDefault && volumeGroup == VOLUME_GROUP_NONE) ?
403*ec779b8eSAndroid Build Coastguard Worker                     BAD_VALUE : NO_ERROR;
404*ec779b8eSAndroid Build Coastguard Worker         }
405*ec779b8eSAndroid Build Coastguard Worker 
canBeSpatialized(const audio_attributes_t * attr,const audio_config_t * config,const AudioDeviceTypeAddrVector & devices)406*ec779b8eSAndroid Build Coastguard Worker         virtual bool canBeSpatialized(const audio_attributes_t *attr,
407*ec779b8eSAndroid Build Coastguard Worker                                       const audio_config_t *config,
408*ec779b8eSAndroid Build Coastguard Worker                                       const AudioDeviceTypeAddrVector &devices) const {
409*ec779b8eSAndroid Build Coastguard Worker             return canBeSpatializedInt(attr, config, devices);
410*ec779b8eSAndroid Build Coastguard Worker         }
411*ec779b8eSAndroid Build Coastguard Worker 
412*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getSpatializerOutput(const audio_config_base_t *config,
413*ec779b8eSAndroid Build Coastguard Worker                                                 const audio_attributes_t *attr,
414*ec779b8eSAndroid Build Coastguard Worker                                                 audio_io_handle_t *output);
415*ec779b8eSAndroid Build Coastguard Worker 
416*ec779b8eSAndroid Build Coastguard Worker         virtual status_t releaseSpatializerOutput(audio_io_handle_t output);
417*ec779b8eSAndroid Build Coastguard Worker 
418*ec779b8eSAndroid Build Coastguard Worker         virtual audio_direct_mode_t getDirectPlaybackSupport(const audio_attributes_t *attr,
419*ec779b8eSAndroid Build Coastguard Worker                                                              const audio_config_t *config);
420*ec779b8eSAndroid Build Coastguard Worker 
421*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getDirectProfilesForAttributes(const audio_attributes_t* attr,
422*ec779b8eSAndroid Build Coastguard Worker                                                          AudioProfileVector& audioProfiles);
423*ec779b8eSAndroid Build Coastguard Worker 
424*ec779b8eSAndroid Build Coastguard Worker         status_t getSupportedMixerAttributes(
425*ec779b8eSAndroid Build Coastguard Worker                 audio_port_handle_t portId,
426*ec779b8eSAndroid Build Coastguard Worker                 std::vector<audio_mixer_attributes_t>& mixerAttrs) override;
427*ec779b8eSAndroid Build Coastguard Worker         status_t setPreferredMixerAttributes(
428*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t* attr,
429*ec779b8eSAndroid Build Coastguard Worker                 audio_port_handle_t portId,
430*ec779b8eSAndroid Build Coastguard Worker                 uid_t uid,
431*ec779b8eSAndroid Build Coastguard Worker                 const audio_mixer_attributes_t* mixerAttributes) override;
432*ec779b8eSAndroid Build Coastguard Worker         status_t getPreferredMixerAttributes(const audio_attributes_t* attr,
433*ec779b8eSAndroid Build Coastguard Worker                                              audio_port_handle_t portId,
434*ec779b8eSAndroid Build Coastguard Worker                                              audio_mixer_attributes_t* mixerAttributes) override;
435*ec779b8eSAndroid Build Coastguard Worker         status_t clearPreferredMixerAttributes(const audio_attributes_t* attr,
436*ec779b8eSAndroid Build Coastguard Worker                                                audio_port_handle_t portId,
437*ec779b8eSAndroid Build Coastguard Worker                                                uid_t uid) override;
438*ec779b8eSAndroid Build Coastguard Worker 
439*ec779b8eSAndroid Build Coastguard Worker         bool isCallScreenModeSupported() override;
440*ec779b8eSAndroid Build Coastguard Worker 
441*ec779b8eSAndroid Build Coastguard Worker         void onNewAudioModulesAvailable() override;
442*ec779b8eSAndroid Build Coastguard Worker 
443*ec779b8eSAndroid Build Coastguard Worker         status_t getMmapPolicyInfos(
444*ec779b8eSAndroid Build Coastguard Worker                 media::audio::common::AudioMMapPolicyType policyType,
445*ec779b8eSAndroid Build Coastguard Worker                 std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) override;
446*ec779b8eSAndroid Build Coastguard Worker         status_t getMmapPolicyForDevice(
447*ec779b8eSAndroid Build Coastguard Worker                 media::audio::common::AudioMMapPolicyType policyType,
448*ec779b8eSAndroid Build Coastguard Worker                 media::audio::common::AudioMMapPolicyInfo *policyInfo) override;
449*ec779b8eSAndroid Build Coastguard Worker 
450*ec779b8eSAndroid Build Coastguard Worker         status_t initialize();
451*ec779b8eSAndroid Build Coastguard Worker 
452*ec779b8eSAndroid Build Coastguard Worker protected:
getConfig()453*ec779b8eSAndroid Build Coastguard Worker         const AudioPolicyConfig& getConfig() const { return *(mConfig.get()); }
454*ec779b8eSAndroid Build Coastguard Worker 
455*ec779b8eSAndroid Build Coastguard Worker         // From AudioPolicyManagerObserver
getAudioPatches()456*ec779b8eSAndroid Build Coastguard Worker         virtual const AudioPatchCollection &getAudioPatches() const
457*ec779b8eSAndroid Build Coastguard Worker         {
458*ec779b8eSAndroid Build Coastguard Worker             return mAudioPatches;
459*ec779b8eSAndroid Build Coastguard Worker         }
getSoundTriggerSessionCollection()460*ec779b8eSAndroid Build Coastguard Worker         virtual const SoundTriggerSessionCollection &getSoundTriggerSessionCollection() const
461*ec779b8eSAndroid Build Coastguard Worker         {
462*ec779b8eSAndroid Build Coastguard Worker             return mSoundTriggerSessions;
463*ec779b8eSAndroid Build Coastguard Worker         }
getAudioPolicyMixCollection()464*ec779b8eSAndroid Build Coastguard Worker         virtual const AudioPolicyMixCollection &getAudioPolicyMixCollection() const
465*ec779b8eSAndroid Build Coastguard Worker         {
466*ec779b8eSAndroid Build Coastguard Worker             return mPolicyMixes;
467*ec779b8eSAndroid Build Coastguard Worker         }
getOutputs()468*ec779b8eSAndroid Build Coastguard Worker         virtual const SwAudioOutputCollection &getOutputs() const
469*ec779b8eSAndroid Build Coastguard Worker         {
470*ec779b8eSAndroid Build Coastguard Worker             return mOutputs;
471*ec779b8eSAndroid Build Coastguard Worker         }
getInputs()472*ec779b8eSAndroid Build Coastguard Worker         virtual const AudioInputCollection &getInputs() const
473*ec779b8eSAndroid Build Coastguard Worker         {
474*ec779b8eSAndroid Build Coastguard Worker             return mInputs;
475*ec779b8eSAndroid Build Coastguard Worker         }
getAvailableOutputDevices()476*ec779b8eSAndroid Build Coastguard Worker         virtual const DeviceVector getAvailableOutputDevices() const
477*ec779b8eSAndroid Build Coastguard Worker         {
478*ec779b8eSAndroid Build Coastguard Worker             return mAvailableOutputDevices.filterForEngine();
479*ec779b8eSAndroid Build Coastguard Worker         }
getAvailableInputDevices()480*ec779b8eSAndroid Build Coastguard Worker         virtual const DeviceVector getAvailableInputDevices() const
481*ec779b8eSAndroid Build Coastguard Worker         {
482*ec779b8eSAndroid Build Coastguard Worker             // legacy and non-legacy remote-submix are managed by the engine, do not filter
483*ec779b8eSAndroid Build Coastguard Worker             return mAvailableInputDevices;
484*ec779b8eSAndroid Build Coastguard Worker         }
getDefaultOutputDevice()485*ec779b8eSAndroid Build Coastguard Worker         virtual const sp<DeviceDescriptor> &getDefaultOutputDevice() const
486*ec779b8eSAndroid Build Coastguard Worker         {
487*ec779b8eSAndroid Build Coastguard Worker             return mConfig->getDefaultOutputDevice();
488*ec779b8eSAndroid Build Coastguard Worker         }
489*ec779b8eSAndroid Build Coastguard Worker 
getVolumeGroups()490*ec779b8eSAndroid Build Coastguard Worker         std::vector<volume_group_t> getVolumeGroups() const
491*ec779b8eSAndroid Build Coastguard Worker         {
492*ec779b8eSAndroid Build Coastguard Worker             return mEngine->getVolumeGroups();
493*ec779b8eSAndroid Build Coastguard Worker         }
494*ec779b8eSAndroid Build Coastguard Worker 
toVolumeSource(volume_group_t volumeGroup)495*ec779b8eSAndroid Build Coastguard Worker         VolumeSource toVolumeSource(volume_group_t volumeGroup) const
496*ec779b8eSAndroid Build Coastguard Worker         {
497*ec779b8eSAndroid Build Coastguard Worker             return static_cast<VolumeSource>(volumeGroup);
498*ec779b8eSAndroid Build Coastguard Worker         }
499*ec779b8eSAndroid Build Coastguard Worker         /**
500*ec779b8eSAndroid Build Coastguard Worker          * @brief toVolumeSource converts an audio attributes into a volume source
501*ec779b8eSAndroid Build Coastguard Worker          * (either a legacy stream or a volume group). If fallback on default is allowed, and if
502*ec779b8eSAndroid Build Coastguard Worker          * the audio attributes do not follow any specific product strategy's rule, it will be
503*ec779b8eSAndroid Build Coastguard Worker          * associated to default volume source, e.g. music. Thus, any of call of volume API
504*ec779b8eSAndroid Build Coastguard Worker          * using this translation function may affect the default volume source.
505*ec779b8eSAndroid Build Coastguard Worker          * If fallback is not allowed and no matching rule is identified for the given attributes,
506*ec779b8eSAndroid Build Coastguard Worker          * the volume source will be undefined, thus, no volume will be altered/modified.
507*ec779b8eSAndroid Build Coastguard Worker          * @param attributes to be considered
508*ec779b8eSAndroid Build Coastguard Worker          * @param fallbackOnDefault
509*ec779b8eSAndroid Build Coastguard Worker          * @return volume source associated with given attributes, otherwise either music if
510*ec779b8eSAndroid Build Coastguard Worker          * fallbackOnDefault is set or none.
511*ec779b8eSAndroid Build Coastguard Worker          */
512*ec779b8eSAndroid Build Coastguard Worker         VolumeSource toVolumeSource(
513*ec779b8eSAndroid Build Coastguard Worker             const audio_attributes_t &attributes, bool fallbackOnDefault = true) const
514*ec779b8eSAndroid Build Coastguard Worker         {
515*ec779b8eSAndroid Build Coastguard Worker             return toVolumeSource(mEngine->getVolumeGroupForAttributes(
516*ec779b8eSAndroid Build Coastguard Worker                 attributes, fallbackOnDefault));
517*ec779b8eSAndroid Build Coastguard Worker         }
518*ec779b8eSAndroid Build Coastguard Worker         VolumeSource toVolumeSource(
519*ec779b8eSAndroid Build Coastguard Worker             audio_stream_type_t stream, bool fallbackOnDefault = true) const
520*ec779b8eSAndroid Build Coastguard Worker         {
521*ec779b8eSAndroid Build Coastguard Worker             return toVolumeSource(mEngine->getVolumeGroupForStreamType(
522*ec779b8eSAndroid Build Coastguard Worker                 stream, fallbackOnDefault));
523*ec779b8eSAndroid Build Coastguard Worker         }
getVolumeCurves(VolumeSource volumeSource)524*ec779b8eSAndroid Build Coastguard Worker         IVolumeCurves &getVolumeCurves(VolumeSource volumeSource)
525*ec779b8eSAndroid Build Coastguard Worker         {
526*ec779b8eSAndroid Build Coastguard Worker           auto *curves = mEngine->getVolumeCurvesForVolumeGroup(
527*ec779b8eSAndroid Build Coastguard Worker               static_cast<volume_group_t>(volumeSource));
528*ec779b8eSAndroid Build Coastguard Worker           ALOG_ASSERT(curves != nullptr, "No curves for volume source %d", volumeSource);
529*ec779b8eSAndroid Build Coastguard Worker           return *curves;
530*ec779b8eSAndroid Build Coastguard Worker         }
getVolumeCurves(const audio_attributes_t & attr)531*ec779b8eSAndroid Build Coastguard Worker         IVolumeCurves &getVolumeCurves(const audio_attributes_t &attr)
532*ec779b8eSAndroid Build Coastguard Worker         {
533*ec779b8eSAndroid Build Coastguard Worker             auto *curves = mEngine->getVolumeCurvesForAttributes(attr);
534*ec779b8eSAndroid Build Coastguard Worker             ALOG_ASSERT(curves != nullptr, "No curves for attributes %s", toString(attr).c_str());
535*ec779b8eSAndroid Build Coastguard Worker             return *curves;
536*ec779b8eSAndroid Build Coastguard Worker         }
getVolumeCurves(audio_stream_type_t stream)537*ec779b8eSAndroid Build Coastguard Worker         IVolumeCurves &getVolumeCurves(audio_stream_type_t stream)
538*ec779b8eSAndroid Build Coastguard Worker         {
539*ec779b8eSAndroid Build Coastguard Worker             auto *curves = mEngine->getVolumeCurvesForStreamType(stream);
540*ec779b8eSAndroid Build Coastguard Worker             ALOG_ASSERT(curves != nullptr, "No curves for stream %s", toString(stream).c_str());
541*ec779b8eSAndroid Build Coastguard Worker             return *curves;
542*ec779b8eSAndroid Build Coastguard Worker         }
543*ec779b8eSAndroid Build Coastguard Worker 
544*ec779b8eSAndroid Build Coastguard Worker         void addOutput(audio_io_handle_t output, const sp<SwAudioOutputDescriptor>& outputDesc);
545*ec779b8eSAndroid Build Coastguard Worker         void removeOutput(audio_io_handle_t output);
546*ec779b8eSAndroid Build Coastguard Worker         void addInput(audio_io_handle_t input, const sp<AudioInputDescriptor>& inputDesc);
547*ec779b8eSAndroid Build Coastguard Worker         bool checkCloseInput(const sp<AudioInputDescriptor>& input);
548*ec779b8eSAndroid Build Coastguard Worker 
549*ec779b8eSAndroid Build Coastguard Worker         /**
550*ec779b8eSAndroid Build Coastguard Worker          * @brief setOutputDevices change the route of the specified output.
551*ec779b8eSAndroid Build Coastguard Worker          * @param caller of the method
552*ec779b8eSAndroid Build Coastguard Worker          * @param outputDesc to be considered
553*ec779b8eSAndroid Build Coastguard Worker          * @param device to be considered to route the output
554*ec779b8eSAndroid Build Coastguard Worker          * @param force if true, force the routing even if no change.
555*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs if specified, delay to apply for mute/volume op when changing device
556*ec779b8eSAndroid Build Coastguard Worker          * @param patchHandle if specified, the patch handle this output is connected through.
557*ec779b8eSAndroid Build Coastguard Worker          * @param requiresMuteCheck if specified, for e.g. when another output is on a shared device
558*ec779b8eSAndroid Build Coastguard Worker          *        and currently active, allow to have proper drain and avoid pops
559*ec779b8eSAndroid Build Coastguard Worker          * @param requiresVolumeCheck true if called requires to reapply volume if the routing did
560*ec779b8eSAndroid Build Coastguard Worker          * not change (but the output is still routed).
561*ec779b8eSAndroid Build Coastguard Worker          * @param skipMuteDelay if true will skip mute delay when installing audio patch
562*ec779b8eSAndroid Build Coastguard Worker          * @return the number of ms we have slept to allow new routing to take effect in certain
563*ec779b8eSAndroid Build Coastguard Worker          *        cases.
564*ec779b8eSAndroid Build Coastguard Worker          */
565*ec779b8eSAndroid Build Coastguard Worker         uint32_t setOutputDevices(const char *caller,
566*ec779b8eSAndroid Build Coastguard Worker                                   const sp<SwAudioOutputDescriptor>& outputDesc,
567*ec779b8eSAndroid Build Coastguard Worker                                   const DeviceVector &device,
568*ec779b8eSAndroid Build Coastguard Worker                                   bool force = false,
569*ec779b8eSAndroid Build Coastguard Worker                                   int delayMs = 0,
570*ec779b8eSAndroid Build Coastguard Worker                                   audio_patch_handle_t *patchHandle = NULL,
571*ec779b8eSAndroid Build Coastguard Worker                                   bool requiresMuteCheck = true,
572*ec779b8eSAndroid Build Coastguard Worker                                   bool requiresVolumeCheck = false,
573*ec779b8eSAndroid Build Coastguard Worker                                   bool skipMuteDelay = false);
574*ec779b8eSAndroid Build Coastguard Worker         status_t resetOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
575*ec779b8eSAndroid Build Coastguard Worker                                    int delayMs = 0,
576*ec779b8eSAndroid Build Coastguard Worker                                    audio_patch_handle_t *patchHandle = NULL);
577*ec779b8eSAndroid Build Coastguard Worker         status_t setInputDevice(audio_io_handle_t input,
578*ec779b8eSAndroid Build Coastguard Worker                                 const sp<DeviceDescriptor> &device,
579*ec779b8eSAndroid Build Coastguard Worker                                 bool force = false,
580*ec779b8eSAndroid Build Coastguard Worker                                 audio_patch_handle_t *patchHandle = NULL);
581*ec779b8eSAndroid Build Coastguard Worker         status_t resetInputDevice(audio_io_handle_t input,
582*ec779b8eSAndroid Build Coastguard Worker                                   audio_patch_handle_t *patchHandle = NULL);
583*ec779b8eSAndroid Build Coastguard Worker 
584*ec779b8eSAndroid Build Coastguard Worker         /**
585*ec779b8eSAndroid Build Coastguard Worker          * Compute volume in DB that should be applied for a volume source and device types for a
586*ec779b8eSAndroid Build Coastguard Worker          * particular volume index.
587*ec779b8eSAndroid Build Coastguard Worker          *
588*ec779b8eSAndroid Build Coastguard Worker          * <p><b>Note:</b>Internally the compute method recursively calls itself to accurately
589*ec779b8eSAndroid Build Coastguard Worker          * determine the volume given the currently active sources and devices. Some of the
590*ec779b8eSAndroid Build Coastguard Worker          * interaction that require recursive computation are:
591*ec779b8eSAndroid Build Coastguard Worker          * <ul>
592*ec779b8eSAndroid Build Coastguard Worker          * <li>Match accessibility volume if ringtone volume is much louder</li>
593*ec779b8eSAndroid Build Coastguard Worker          * <li>If voice call is active cap other volumes (except ringtone and accessibility)</li>
594*ec779b8eSAndroid Build Coastguard Worker          * <li>Attenuate notification if headset is connected to prevent burst in user's ear</li>
595*ec779b8eSAndroid Build Coastguard Worker          * <li>Attenuate ringtone if headset is connected and music is not playing and speaker is
596*ec779b8eSAndroid Build Coastguard Worker          *      part of the devices to prevent burst in user's ear</li>
597*ec779b8eSAndroid Build Coastguard Worker          * <li>Limit music volume if headset is connected and notification is also active</li>
598*ec779b8eSAndroid Build Coastguard Worker          * </ul>
599*ec779b8eSAndroid Build Coastguard Worker          *
600*ec779b8eSAndroid Build Coastguard Worker          * @param curves volume curves to use for calculating volume value given the index
601*ec779b8eSAndroid Build Coastguard Worker          * @param volumeSource source (use case) of the volume
602*ec779b8eSAndroid Build Coastguard Worker          * @param index index to match in the volume curves for the calculation
603*ec779b8eSAndroid Build Coastguard Worker          * @param deviceTypes devices that should be considered in the volume curves for the
604*ec779b8eSAndroid Build Coastguard Worker          *        calculation
605*ec779b8eSAndroid Build Coastguard Worker          * @param adjustAttenuation boolean indicating whether we should adjust the value to
606*ec779b8eSAndroid Build Coastguard Worker          *        avoid double attenuation when controlling an avrcp device
607*ec779b8eSAndroid Build Coastguard Worker          * @param computeInternalInteraction boolean indicating whether recursive volume computation
608*ec779b8eSAndroid Build Coastguard Worker          *        should continue within the volume computation. Defaults to {@code true} so the
609*ec779b8eSAndroid Build Coastguard Worker          *        volume interactions can be computed. Calls within the method should always set the
610*ec779b8eSAndroid Build Coastguard Worker          *        the value to {@code false} to prevent infinite recursion.
611*ec779b8eSAndroid Build Coastguard Worker          * @return computed volume in DB
612*ec779b8eSAndroid Build Coastguard Worker          */
613*ec779b8eSAndroid Build Coastguard Worker         virtual float computeVolume(IVolumeCurves &curves, VolumeSource volumeSource,
614*ec779b8eSAndroid Build Coastguard Worker                                int index, const DeviceTypeSet& deviceTypes,
615*ec779b8eSAndroid Build Coastguard Worker                                bool adjustAttenuation = true,
616*ec779b8eSAndroid Build Coastguard Worker                                bool computeInternalInteraction = true);
617*ec779b8eSAndroid Build Coastguard Worker 
618*ec779b8eSAndroid Build Coastguard Worker         // rescale volume index from srcStream within range of dstStream
619*ec779b8eSAndroid Build Coastguard Worker         int rescaleVolumeIndex(int srcIndex,
620*ec779b8eSAndroid Build Coastguard Worker                                VolumeSource fromVolumeSource,
621*ec779b8eSAndroid Build Coastguard Worker                                VolumeSource toVolumeSource);
622*ec779b8eSAndroid Build Coastguard Worker         // check that volume change is permitted, compute and send new volume to audio hardware
623*ec779b8eSAndroid Build Coastguard Worker         virtual status_t checkAndSetVolume(IVolumeCurves &curves,
624*ec779b8eSAndroid Build Coastguard Worker                                            VolumeSource volumeSource, int index,
625*ec779b8eSAndroid Build Coastguard Worker                                            const sp<AudioOutputDescriptor>& outputDesc,
626*ec779b8eSAndroid Build Coastguard Worker                                            DeviceTypeSet deviceTypes,
627*ec779b8eSAndroid Build Coastguard Worker                                            int delayMs = 0, bool force = false);
628*ec779b8eSAndroid Build Coastguard Worker 
629*ec779b8eSAndroid Build Coastguard Worker         void setVoiceVolume(int index, IVolumeCurves &curves, bool isVoiceVolSrc, int delayMs);
630*ec779b8eSAndroid Build Coastguard Worker 
631*ec779b8eSAndroid Build Coastguard Worker         // returns true if the supplied set of volume source and devices are consistent with
632*ec779b8eSAndroid Build Coastguard Worker         // call volume rules:
633*ec779b8eSAndroid Build Coastguard Worker         // if Bluetooth SCO and voice call use different volume curves:
634*ec779b8eSAndroid Build Coastguard Worker         // - do not apply voice call volume if Bluetooth SCO is used for call
635*ec779b8eSAndroid Build Coastguard Worker         // - do not apply Bluetooth SCO volume if SCO or Hearing Aid is not used for call.
636*ec779b8eSAndroid Build Coastguard Worker         // Also updates the booleans isVoiceVolSrc and isBtScoVolSrc according to the
637*ec779b8eSAndroid Build Coastguard Worker         // volume source supplied.
638*ec779b8eSAndroid Build Coastguard Worker         bool isVolumeConsistentForCalls(VolumeSource volumeSource,
639*ec779b8eSAndroid Build Coastguard Worker                                        const DeviceTypeSet& deviceTypes,
640*ec779b8eSAndroid Build Coastguard Worker                                        bool& isVoiceVolSrc,
641*ec779b8eSAndroid Build Coastguard Worker                                        bool& isBtScoVolSrc,
642*ec779b8eSAndroid Build Coastguard Worker                                        const char* caller);
643*ec779b8eSAndroid Build Coastguard Worker         // apply all stream volumes to the specified output and device
644*ec779b8eSAndroid Build Coastguard Worker         void applyStreamVolumes(const sp<AudioOutputDescriptor>& outputDesc,
645*ec779b8eSAndroid Build Coastguard Worker                                 const DeviceTypeSet& deviceTypes,
646*ec779b8eSAndroid Build Coastguard Worker                                 int delayMs = 0, bool force = false);
647*ec779b8eSAndroid Build Coastguard Worker 
648*ec779b8eSAndroid Build Coastguard Worker         /**
649*ec779b8eSAndroid Build Coastguard Worker          * @brief setStrategyMute Mute or unmute all active clients on the considered output
650*ec779b8eSAndroid Build Coastguard Worker          * following the given strategy.
651*ec779b8eSAndroid Build Coastguard Worker          * @param strategy to be considered
652*ec779b8eSAndroid Build Coastguard Worker          * @param on true for mute, false for unmute
653*ec779b8eSAndroid Build Coastguard Worker          * @param outputDesc to be considered
654*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs
655*ec779b8eSAndroid Build Coastguard Worker          * @param device
656*ec779b8eSAndroid Build Coastguard Worker          */
657*ec779b8eSAndroid Build Coastguard Worker         void setStrategyMute(product_strategy_t strategy,
658*ec779b8eSAndroid Build Coastguard Worker                              bool on,
659*ec779b8eSAndroid Build Coastguard Worker                              const sp<AudioOutputDescriptor>& outputDesc,
660*ec779b8eSAndroid Build Coastguard Worker                              int delayMs = 0,
661*ec779b8eSAndroid Build Coastguard Worker                              DeviceTypeSet deviceTypes = DeviceTypeSet());
662*ec779b8eSAndroid Build Coastguard Worker 
663*ec779b8eSAndroid Build Coastguard Worker         /**
664*ec779b8eSAndroid Build Coastguard Worker          * @brief setVolumeSourceMutedInternally Mute or unmute the volume source on the specified
665*ec779b8eSAndroid Build Coastguard Worker          * output
666*ec779b8eSAndroid Build Coastguard Worker          * @param volumeSource to be muted/unmute (may host legacy streams or by extension set of
667*ec779b8eSAndroid Build Coastguard Worker          * audio attributes)
668*ec779b8eSAndroid Build Coastguard Worker          * @param on true to mute, false to umute
669*ec779b8eSAndroid Build Coastguard Worker          * @param outputDesc on which the client following the volume group shall be muted/umuted
670*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs
671*ec779b8eSAndroid Build Coastguard Worker          * @param device
672*ec779b8eSAndroid Build Coastguard Worker          */
673*ec779b8eSAndroid Build Coastguard Worker         void setVolumeSourceMutedInternally(VolumeSource volumeSource,
674*ec779b8eSAndroid Build Coastguard Worker                                             bool on,
675*ec779b8eSAndroid Build Coastguard Worker                                             const sp<AudioOutputDescriptor>& outputDesc,
676*ec779b8eSAndroid Build Coastguard Worker                                             int delayMs = 0,
677*ec779b8eSAndroid Build Coastguard Worker                                             DeviceTypeSet deviceTypes = DeviceTypeSet());
678*ec779b8eSAndroid Build Coastguard Worker 
679*ec779b8eSAndroid Build Coastguard Worker         audio_mode_t getPhoneState();
680*ec779b8eSAndroid Build Coastguard Worker 
681*ec779b8eSAndroid Build Coastguard Worker         // true if device is in a telephony or VoIP call
682*ec779b8eSAndroid Build Coastguard Worker         virtual bool isInCall() const;
683*ec779b8eSAndroid Build Coastguard Worker         // true if given state represents a device in a telephony or VoIP call
684*ec779b8eSAndroid Build Coastguard Worker         virtual bool isStateInCall(int state) const;
685*ec779b8eSAndroid Build Coastguard Worker         // true if playback to call TX or capture from call RX is possible
686*ec779b8eSAndroid Build Coastguard Worker         bool isCallAudioAccessible() const;
687*ec779b8eSAndroid Build Coastguard Worker         // true if device is in a telephony or VoIP call or call screening is active
688*ec779b8eSAndroid Build Coastguard Worker         bool isInCallOrScreening() const;
689*ec779b8eSAndroid Build Coastguard Worker 
690*ec779b8eSAndroid Build Coastguard Worker         // when a device is connected, checks if an open output can be routed
691*ec779b8eSAndroid Build Coastguard Worker         // to this device. If none is open, tries to open one of the available outputs.
692*ec779b8eSAndroid Build Coastguard Worker         // Returns an output suitable to this device or 0.
693*ec779b8eSAndroid Build Coastguard Worker         // when a device is disconnected, checks if an output is not used any more and
694*ec779b8eSAndroid Build Coastguard Worker         // returns its handle if any.
695*ec779b8eSAndroid Build Coastguard Worker         // transfers the audio tracks and effects from one output thread to another accordingly.
696*ec779b8eSAndroid Build Coastguard Worker         status_t checkOutputsForDevice(const sp<DeviceDescriptor>& device,
697*ec779b8eSAndroid Build Coastguard Worker                                        audio_policy_dev_state_t state,
698*ec779b8eSAndroid Build Coastguard Worker                                        SortedVector<audio_io_handle_t>& outputs);
699*ec779b8eSAndroid Build Coastguard Worker 
700*ec779b8eSAndroid Build Coastguard Worker         status_t checkInputsForDevice(const sp<DeviceDescriptor>& device,
701*ec779b8eSAndroid Build Coastguard Worker                                       audio_policy_dev_state_t state);
702*ec779b8eSAndroid Build Coastguard Worker 
703*ec779b8eSAndroid Build Coastguard Worker         // close an output and its companion duplicating output.
704*ec779b8eSAndroid Build Coastguard Worker         void closeOutput(audio_io_handle_t output);
705*ec779b8eSAndroid Build Coastguard Worker 
706*ec779b8eSAndroid Build Coastguard Worker         // close an input.
707*ec779b8eSAndroid Build Coastguard Worker         void closeInput(audio_io_handle_t input);
708*ec779b8eSAndroid Build Coastguard Worker 
709*ec779b8eSAndroid Build Coastguard Worker         // runs all the checks required for accommodating changes in devices and outputs
710*ec779b8eSAndroid Build Coastguard Worker         // if 'onOutputsChecked' callback is provided, it is executed after the outputs
711*ec779b8eSAndroid Build Coastguard Worker         // check via 'checkOutputForAllStrategies'. If the callback returns 'true',
712*ec779b8eSAndroid Build Coastguard Worker         // A2DP suspend status is rechecked.
713*ec779b8eSAndroid Build Coastguard Worker         void checkForDeviceAndOutputChanges(std::function<bool()> onOutputsChecked = nullptr);
714*ec779b8eSAndroid Build Coastguard Worker 
715*ec779b8eSAndroid Build Coastguard Worker         /**
716*ec779b8eSAndroid Build Coastguard Worker          * @brief updates routing for all outputs (including call if call in progress).
717*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs delay for unmuting if required
718*ec779b8eSAndroid Build Coastguard Worker          * @param skipDelays if true all the delays will be skip while updating routing
719*ec779b8eSAndroid Build Coastguard Worker          */
720*ec779b8eSAndroid Build Coastguard Worker         void updateCallAndOutputRouting(bool forceVolumeReeval = true, uint32_t delayMs = 0,
721*ec779b8eSAndroid Build Coastguard Worker                 bool skipDelays = false);
722*ec779b8eSAndroid Build Coastguard Worker 
723*ec779b8eSAndroid Build Coastguard Worker         void connectTelephonyRxAudioSource(uint32_t delayMs);
724*ec779b8eSAndroid Build Coastguard Worker 
725*ec779b8eSAndroid Build Coastguard Worker         void disconnectTelephonyAudioSource(sp<SourceClientDescriptor> &clientDesc);
726*ec779b8eSAndroid Build Coastguard Worker 
727*ec779b8eSAndroid Build Coastguard Worker         void connectTelephonyTxAudioSource(const sp<DeviceDescriptor> &srcdevice,
728*ec779b8eSAndroid Build Coastguard Worker                                            const sp<DeviceDescriptor> &sinkDevice,
729*ec779b8eSAndroid Build Coastguard Worker                                            uint32_t delayMs);
730*ec779b8eSAndroid Build Coastguard Worker 
isTelephonyRxOrTx(const sp<SwAudioOutputDescriptor> & desc)731*ec779b8eSAndroid Build Coastguard Worker         bool isTelephonyRxOrTx(const sp<SwAudioOutputDescriptor>& desc) const {
732*ec779b8eSAndroid Build Coastguard Worker             return (mCallRxSourceClient != nullptr && mCallRxSourceClient->belongsToOutput(desc))
733*ec779b8eSAndroid Build Coastguard Worker                     || (mCallTxSourceClient != nullptr
734*ec779b8eSAndroid Build Coastguard Worker                     &&  mCallTxSourceClient->belongsToOutput(desc));
735*ec779b8eSAndroid Build Coastguard Worker         }
736*ec779b8eSAndroid Build Coastguard Worker 
737*ec779b8eSAndroid Build Coastguard Worker         /**
738*ec779b8eSAndroid Build Coastguard Worker          * @brief updates routing for all inputs.
739*ec779b8eSAndroid Build Coastguard Worker          */
740*ec779b8eSAndroid Build Coastguard Worker         void updateInputRouting();
741*ec779b8eSAndroid Build Coastguard Worker 
742*ec779b8eSAndroid Build Coastguard Worker         /**
743*ec779b8eSAndroid Build Coastguard Worker          * @brief checkOutputForAttributes checks and if necessary changes outputs used for the
744*ec779b8eSAndroid Build Coastguard Worker          * given audio attributes.
745*ec779b8eSAndroid Build Coastguard Worker          * must be called every time a condition that affects the output choice for a given
746*ec779b8eSAndroid Build Coastguard Worker          * attributes changes: connected device, phone state, force use...
747*ec779b8eSAndroid Build Coastguard Worker          * Must be called before updateDevicesAndOutputs()
748*ec779b8eSAndroid Build Coastguard Worker          * @param attr to be considered
749*ec779b8eSAndroid Build Coastguard Worker          */
750*ec779b8eSAndroid Build Coastguard Worker         void checkOutputForAttributes(const audio_attributes_t &attr);
751*ec779b8eSAndroid Build Coastguard Worker 
752*ec779b8eSAndroid Build Coastguard Worker         /**
753*ec779b8eSAndroid Build Coastguard Worker          * @brief checkAudioSourceForAttributes checks if any AudioSource following the same routing
754*ec779b8eSAndroid Build Coastguard Worker          * as the given audio attributes is not routed and try to connect it.
755*ec779b8eSAndroid Build Coastguard Worker          * It must be called once checkOutputForAttributes has been called for orphans AudioSource,
756*ec779b8eSAndroid Build Coastguard Worker          * aka AudioSource not attached to any Audio Output (e.g. AudioSource connected to direct
757*ec779b8eSAndroid Build Coastguard Worker          * Output which has been disconnected (and output closed) due to sink device unavailable).
758*ec779b8eSAndroid Build Coastguard Worker          * @param attr to be considered
759*ec779b8eSAndroid Build Coastguard Worker          */
760*ec779b8eSAndroid Build Coastguard Worker         void checkAudioSourceForAttributes(const audio_attributes_t &attr);
761*ec779b8eSAndroid Build Coastguard Worker 
762*ec779b8eSAndroid Build Coastguard Worker         bool followsSameRouting(const audio_attributes_t &lAttr,
763*ec779b8eSAndroid Build Coastguard Worker                                 const audio_attributes_t &rAttr) const;
764*ec779b8eSAndroid Build Coastguard Worker 
765*ec779b8eSAndroid Build Coastguard Worker         /**
766*ec779b8eSAndroid Build Coastguard Worker          * @brief checkOutputForAllStrategies Same as @see checkOutputForAttributes()
767*ec779b8eSAndroid Build Coastguard Worker          *      but for a all product strategies in order of priority
768*ec779b8eSAndroid Build Coastguard Worker          */
769*ec779b8eSAndroid Build Coastguard Worker         void checkOutputForAllStrategies();
770*ec779b8eSAndroid Build Coastguard Worker 
771*ec779b8eSAndroid Build Coastguard Worker         // Same as checkOutputForStrategy but for secondary outputs. Make sure if a secondary
772*ec779b8eSAndroid Build Coastguard Worker         // output condition changes, the track is properly rerouted
773*ec779b8eSAndroid Build Coastguard Worker         void checkSecondaryOutputs();
774*ec779b8eSAndroid Build Coastguard Worker 
775*ec779b8eSAndroid Build Coastguard Worker         // manages A2DP output suspend/restore according to phone state and BT SCO usage
776*ec779b8eSAndroid Build Coastguard Worker         void checkA2dpSuspend();
777*ec779b8eSAndroid Build Coastguard Worker 
778*ec779b8eSAndroid Build Coastguard Worker         // selects the most appropriate device on output for current state
779*ec779b8eSAndroid Build Coastguard Worker         // must be called every time a condition that affects the device choice for a given output is
780*ec779b8eSAndroid Build Coastguard Worker         // changed: connected device, phone state, force use, output start, output stop..
781*ec779b8eSAndroid Build Coastguard Worker         // see getDeviceForStrategy() for the use of fromCache parameter
782*ec779b8eSAndroid Build Coastguard Worker         DeviceVector getNewOutputDevices(const sp<SwAudioOutputDescriptor>& outputDesc,
783*ec779b8eSAndroid Build Coastguard Worker                                          bool fromCache);
784*ec779b8eSAndroid Build Coastguard Worker 
785*ec779b8eSAndroid Build Coastguard Worker         /**
786*ec779b8eSAndroid Build Coastguard Worker          * @brief updateDevicesAndOutputs: updates cache of devices of the engine
787*ec779b8eSAndroid Build Coastguard Worker          * must be called every time a condition that affects the device choice is changed:
788*ec779b8eSAndroid Build Coastguard Worker          * connected device, phone state, force use...
789*ec779b8eSAndroid Build Coastguard Worker          * cached values are used by getOutputDevicesForStream()/getDevicesForAttributes if
790*ec779b8eSAndroid Build Coastguard Worker          * parameter fromCache is true.
791*ec779b8eSAndroid Build Coastguard Worker          * Must be called after checkOutputForAllStrategies()
792*ec779b8eSAndroid Build Coastguard Worker          */
793*ec779b8eSAndroid Build Coastguard Worker         void updateDevicesAndOutputs();
794*ec779b8eSAndroid Build Coastguard Worker 
795*ec779b8eSAndroid Build Coastguard Worker         // selects the most appropriate device on input for current state
796*ec779b8eSAndroid Build Coastguard Worker         sp<DeviceDescriptor> getNewInputDevice(const sp<AudioInputDescriptor>& inputDesc);
797*ec779b8eSAndroid Build Coastguard Worker 
getMaxEffectsCpuLoad()798*ec779b8eSAndroid Build Coastguard Worker         virtual uint32_t getMaxEffectsCpuLoad()
799*ec779b8eSAndroid Build Coastguard Worker         {
800*ec779b8eSAndroid Build Coastguard Worker             return mEffects.getMaxEffectsCpuLoad();
801*ec779b8eSAndroid Build Coastguard Worker         }
802*ec779b8eSAndroid Build Coastguard Worker 
getMaxEffectsMemory()803*ec779b8eSAndroid Build Coastguard Worker         virtual uint32_t getMaxEffectsMemory()
804*ec779b8eSAndroid Build Coastguard Worker         {
805*ec779b8eSAndroid Build Coastguard Worker             return mEffects.getMaxEffectsMemory();
806*ec779b8eSAndroid Build Coastguard Worker         }
807*ec779b8eSAndroid Build Coastguard Worker 
808*ec779b8eSAndroid Build Coastguard Worker         SortedVector<audio_io_handle_t> getOutputsForDevices(
809*ec779b8eSAndroid Build Coastguard Worker                 const DeviceVector &devices, const SwAudioOutputCollection& openOutputs);
810*ec779b8eSAndroid Build Coastguard Worker 
811*ec779b8eSAndroid Build Coastguard Worker         /**
812*ec779b8eSAndroid Build Coastguard Worker          * @brief checkDeviceMuteStrategies mute/unmute strategies
813*ec779b8eSAndroid Build Coastguard Worker          *      using an incompatible device combination.
814*ec779b8eSAndroid Build Coastguard Worker          *      if muting, wait for the audio in pcm buffer to be drained before proceeding
815*ec779b8eSAndroid Build Coastguard Worker          *      if unmuting, unmute only after the specified delay
816*ec779b8eSAndroid Build Coastguard Worker          * @param outputDesc
817*ec779b8eSAndroid Build Coastguard Worker          * @param prevDevice
818*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs
819*ec779b8eSAndroid Build Coastguard Worker          * @return the number of ms waited
820*ec779b8eSAndroid Build Coastguard Worker          */
821*ec779b8eSAndroid Build Coastguard Worker         virtual uint32_t checkDeviceMuteStrategies(const sp<AudioOutputDescriptor>& outputDesc,
822*ec779b8eSAndroid Build Coastguard Worker                                                    const DeviceVector &prevDevices,
823*ec779b8eSAndroid Build Coastguard Worker                                                    uint32_t delayMs);
824*ec779b8eSAndroid Build Coastguard Worker 
825*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t selectOutput(const SortedVector<audio_io_handle_t>& outputs,
826*ec779b8eSAndroid Build Coastguard Worker                                        audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
827*ec779b8eSAndroid Build Coastguard Worker                                        audio_format_t format = AUDIO_FORMAT_INVALID,
828*ec779b8eSAndroid Build Coastguard Worker                                        audio_channel_mask_t channelMask = AUDIO_CHANNEL_NONE,
829*ec779b8eSAndroid Build Coastguard Worker                                        uint32_t samplingRate = 0,
830*ec779b8eSAndroid Build Coastguard Worker                                        audio_session_t sessionId = AUDIO_SESSION_NONE);
831*ec779b8eSAndroid Build Coastguard Worker         // samplingRate, format, channelMask are in/out and so may be modified
832*ec779b8eSAndroid Build Coastguard Worker         sp<IOProfile> getInputProfile(const sp<DeviceDescriptor> & device,
833*ec779b8eSAndroid Build Coastguard Worker                                       uint32_t& samplingRate,
834*ec779b8eSAndroid Build Coastguard Worker                                       audio_format_t& format,
835*ec779b8eSAndroid Build Coastguard Worker                                       audio_channel_mask_t& channelMask,
836*ec779b8eSAndroid Build Coastguard Worker                                       audio_input_flags_t flags);
837*ec779b8eSAndroid Build Coastguard Worker         /**
838*ec779b8eSAndroid Build Coastguard Worker          * @brief getProfileForOutput
839*ec779b8eSAndroid Build Coastguard Worker          * @param devices vector of descriptors, may be empty if ignoring the device is required
840*ec779b8eSAndroid Build Coastguard Worker          * @param samplingRate
841*ec779b8eSAndroid Build Coastguard Worker          * @param format
842*ec779b8eSAndroid Build Coastguard Worker          * @param channelMask
843*ec779b8eSAndroid Build Coastguard Worker          * @param flags
844*ec779b8eSAndroid Build Coastguard Worker          * @param directOnly
845*ec779b8eSAndroid Build Coastguard Worker          * @return IOProfile to be used if found, nullptr otherwise
846*ec779b8eSAndroid Build Coastguard Worker          */
847*ec779b8eSAndroid Build Coastguard Worker         sp<IOProfile> getProfileForOutput(const DeviceVector &devices,
848*ec779b8eSAndroid Build Coastguard Worker                                           uint32_t samplingRate,
849*ec779b8eSAndroid Build Coastguard Worker                                           audio_format_t format,
850*ec779b8eSAndroid Build Coastguard Worker                                           audio_channel_mask_t channelMask,
851*ec779b8eSAndroid Build Coastguard Worker                                           audio_output_flags_t flags,
852*ec779b8eSAndroid Build Coastguard Worker                                           bool directOnly);
853*ec779b8eSAndroid Build Coastguard Worker         /**
854*ec779b8eSAndroid Build Coastguard Worker         * Same as getProfileForOutput, but it looks for an MSD profile
855*ec779b8eSAndroid Build Coastguard Worker         */
856*ec779b8eSAndroid Build Coastguard Worker         sp<IOProfile> getMsdProfileForOutput(const DeviceVector &devices,
857*ec779b8eSAndroid Build Coastguard Worker                                            uint32_t samplingRate,
858*ec779b8eSAndroid Build Coastguard Worker                                            audio_format_t format,
859*ec779b8eSAndroid Build Coastguard Worker                                            audio_channel_mask_t channelMask,
860*ec779b8eSAndroid Build Coastguard Worker                                            audio_output_flags_t flags,
861*ec779b8eSAndroid Build Coastguard Worker                                            bool directOnly);
862*ec779b8eSAndroid Build Coastguard Worker 
863*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t selectOutputForMusicEffects();
864*ec779b8eSAndroid Build Coastguard Worker 
addAudioPatch(audio_patch_handle_t handle,const sp<AudioPatch> & patch)865*ec779b8eSAndroid Build Coastguard Worker         virtual status_t addAudioPatch(audio_patch_handle_t handle, const sp<AudioPatch>& patch)
866*ec779b8eSAndroid Build Coastguard Worker         {
867*ec779b8eSAndroid Build Coastguard Worker             return mAudioPatches.addAudioPatch(handle, patch);
868*ec779b8eSAndroid Build Coastguard Worker         }
removeAudioPatch(audio_patch_handle_t handle)869*ec779b8eSAndroid Build Coastguard Worker         virtual status_t removeAudioPatch(audio_patch_handle_t handle)
870*ec779b8eSAndroid Build Coastguard Worker         {
871*ec779b8eSAndroid Build Coastguard Worker             return mAudioPatches.removeAudioPatch(handle);
872*ec779b8eSAndroid Build Coastguard Worker         }
873*ec779b8eSAndroid Build Coastguard Worker 
isPrimaryModule(const sp<HwModule> & module)874*ec779b8eSAndroid Build Coastguard Worker         bool isPrimaryModule(const sp<HwModule> &module) const
875*ec779b8eSAndroid Build Coastguard Worker         {
876*ec779b8eSAndroid Build Coastguard Worker             if (module == nullptr || mPrimaryModuleHandle == AUDIO_MODULE_HANDLE_NONE) {
877*ec779b8eSAndroid Build Coastguard Worker                 return false;
878*ec779b8eSAndroid Build Coastguard Worker             }
879*ec779b8eSAndroid Build Coastguard Worker             return module->getHandle() == mPrimaryModuleHandle;
880*ec779b8eSAndroid Build Coastguard Worker         }
availablePrimaryOutputDevices()881*ec779b8eSAndroid Build Coastguard Worker         DeviceVector availablePrimaryOutputDevices() const
882*ec779b8eSAndroid Build Coastguard Worker         {
883*ec779b8eSAndroid Build Coastguard Worker             if (!hasPrimaryOutput()) {
884*ec779b8eSAndroid Build Coastguard Worker                 return DeviceVector();
885*ec779b8eSAndroid Build Coastguard Worker             }
886*ec779b8eSAndroid Build Coastguard Worker             return mAvailableOutputDevices.filter(mPrimaryOutput->supportedDevices());
887*ec779b8eSAndroid Build Coastguard Worker         }
availablePrimaryModuleInputDevices()888*ec779b8eSAndroid Build Coastguard Worker         DeviceVector availablePrimaryModuleInputDevices() const
889*ec779b8eSAndroid Build Coastguard Worker         {
890*ec779b8eSAndroid Build Coastguard Worker             if (!hasPrimaryOutput()) {
891*ec779b8eSAndroid Build Coastguard Worker                 return DeviceVector();
892*ec779b8eSAndroid Build Coastguard Worker             }
893*ec779b8eSAndroid Build Coastguard Worker             return mAvailableInputDevices.getDevicesFromHwModule(
894*ec779b8eSAndroid Build Coastguard Worker                     mPrimaryOutput->getModuleHandle());
895*ec779b8eSAndroid Build Coastguard Worker         }
896*ec779b8eSAndroid Build Coastguard Worker 
getFirstDeviceAddress(const DeviceVector & devices)897*ec779b8eSAndroid Build Coastguard Worker         String8 getFirstDeviceAddress(const DeviceVector &devices) const
898*ec779b8eSAndroid Build Coastguard Worker         {
899*ec779b8eSAndroid Build Coastguard Worker             return (devices.size() > 0) ?
900*ec779b8eSAndroid Build Coastguard Worker                     String8(devices.itemAt(0)->address().c_str()) : String8("");
901*ec779b8eSAndroid Build Coastguard Worker         }
902*ec779b8eSAndroid Build Coastguard Worker 
903*ec779b8eSAndroid Build Coastguard Worker         status_t updateCallRouting(
904*ec779b8eSAndroid Build Coastguard Worker                 bool fromCache, uint32_t delayMs = 0, uint32_t *waitMs = nullptr);
905*ec779b8eSAndroid Build Coastguard Worker         status_t updateCallRoutingInternal(
906*ec779b8eSAndroid Build Coastguard Worker                 const DeviceVector &rxDevices, uint32_t delayMs, uint32_t *waitMs);
907*ec779b8eSAndroid Build Coastguard Worker         sp<AudioPatch> createTelephonyPatch(bool isRx, const sp<DeviceDescriptor> &device,
908*ec779b8eSAndroid Build Coastguard Worker                                             uint32_t delayMs);
909*ec779b8eSAndroid Build Coastguard Worker         /**
910*ec779b8eSAndroid Build Coastguard Worker          * @brief selectBestRxSinkDevicesForCall: if the primary module host both Telephony Rx/Tx
911*ec779b8eSAndroid Build Coastguard Worker          * devices, and it declares also supporting a HW bridge between the Telephony Rx and the
912*ec779b8eSAndroid Build Coastguard Worker          * given sink device for Voice Call audio attributes, select this device in prio.
913*ec779b8eSAndroid Build Coastguard Worker          * Otherwise, getNewOutputDevices() is called on the primary output to select sink device.
914*ec779b8eSAndroid Build Coastguard Worker          * @param fromCache true to prevent engine reconsidering all product strategies and retrieve
915*ec779b8eSAndroid Build Coastguard Worker          * from engine cache.
916*ec779b8eSAndroid Build Coastguard Worker          * @return vector of devices, empty if none is found.
917*ec779b8eSAndroid Build Coastguard Worker          */
918*ec779b8eSAndroid Build Coastguard Worker         DeviceVector selectBestRxSinkDevicesForCall(bool fromCache);
919*ec779b8eSAndroid Build Coastguard Worker         bool isDeviceOfModule(const sp<DeviceDescriptor>& devDesc, const char *moduleId) const;
920*ec779b8eSAndroid Build Coastguard Worker 
921*ec779b8eSAndroid Build Coastguard Worker         status_t startSource(const sp<SwAudioOutputDescriptor>& outputDesc,
922*ec779b8eSAndroid Build Coastguard Worker                              const sp<TrackClientDescriptor>& client,
923*ec779b8eSAndroid Build Coastguard Worker                              uint32_t *delayMs);
924*ec779b8eSAndroid Build Coastguard Worker         status_t stopSource(const sp<SwAudioOutputDescriptor>& outputDesc,
925*ec779b8eSAndroid Build Coastguard Worker                             const sp<TrackClientDescriptor>& client);
926*ec779b8eSAndroid Build Coastguard Worker 
927*ec779b8eSAndroid Build Coastguard Worker         void clearAudioPatches(uid_t uid);
928*ec779b8eSAndroid Build Coastguard Worker         void clearSessionRoutes(uid_t uid);
929*ec779b8eSAndroid Build Coastguard Worker 
930*ec779b8eSAndroid Build Coastguard Worker         /**
931*ec779b8eSAndroid Build Coastguard Worker          * @brief checkStrategyRoute: when an output is beeing rerouted, reconsider each output
932*ec779b8eSAndroid Build Coastguard Worker          * that may host a strategy playing on the considered output.
933*ec779b8eSAndroid Build Coastguard Worker          * @param ps product strategy that initiated the rerouting
934*ec779b8eSAndroid Build Coastguard Worker          * @param ouptutToSkip output that initiated the rerouting
935*ec779b8eSAndroid Build Coastguard Worker          */
936*ec779b8eSAndroid Build Coastguard Worker         void checkStrategyRoute(product_strategy_t ps, audio_io_handle_t ouptutToSkip);
937*ec779b8eSAndroid Build Coastguard Worker 
hasPrimaryOutput()938*ec779b8eSAndroid Build Coastguard Worker         status_t hasPrimaryOutput() const { return mPrimaryOutput != 0; }
939*ec779b8eSAndroid Build Coastguard Worker 
940*ec779b8eSAndroid Build Coastguard Worker         status_t connectAudioSource(const sp<SourceClientDescriptor>& sourceDesc,
941*ec779b8eSAndroid Build Coastguard Worker                                     uint32_t delayMs);
942*ec779b8eSAndroid Build Coastguard Worker         status_t disconnectAudioSource(const sp<SourceClientDescriptor>& sourceDesc);
943*ec779b8eSAndroid Build Coastguard Worker 
944*ec779b8eSAndroid Build Coastguard Worker         status_t connectAudioSourceToSink(const sp<SourceClientDescriptor>& sourceDesc,
945*ec779b8eSAndroid Build Coastguard Worker                                           const sp<DeviceDescriptor> &sinkDevice,
946*ec779b8eSAndroid Build Coastguard Worker                                           const struct audio_patch *patch,
947*ec779b8eSAndroid Build Coastguard Worker                                           audio_patch_handle_t &handle,
948*ec779b8eSAndroid Build Coastguard Worker                                           uid_t uid, uint32_t delayMs);
949*ec779b8eSAndroid Build Coastguard Worker 
950*ec779b8eSAndroid Build Coastguard Worker         sp<SourceClientDescriptor> getSourceForAttributesOnOutput(audio_io_handle_t output,
951*ec779b8eSAndroid Build Coastguard Worker                                                                   const audio_attributes_t &attr);
952*ec779b8eSAndroid Build Coastguard Worker         void clearAudioSourcesForOutput(audio_io_handle_t output);
953*ec779b8eSAndroid Build Coastguard Worker 
954*ec779b8eSAndroid Build Coastguard Worker         void cleanUpForDevice(const sp<DeviceDescriptor>& deviceDesc);
955*ec779b8eSAndroid Build Coastguard Worker 
956*ec779b8eSAndroid Build Coastguard Worker         void clearAudioSources(uid_t uid);
957*ec779b8eSAndroid Build Coastguard Worker 
958*ec779b8eSAndroid Build Coastguard Worker         static bool streamsMatchForvolume(audio_stream_type_t stream1,
959*ec779b8eSAndroid Build Coastguard Worker                                           audio_stream_type_t stream2);
960*ec779b8eSAndroid Build Coastguard Worker 
961*ec779b8eSAndroid Build Coastguard Worker         void closeActiveClients(const sp<AudioInputDescriptor>& input);
962*ec779b8eSAndroid Build Coastguard Worker         void closeClient(audio_port_handle_t portId);
963*ec779b8eSAndroid Build Coastguard Worker 
964*ec779b8eSAndroid Build Coastguard Worker         /**
965*ec779b8eSAndroid Build Coastguard Worker          * @brief isAnyDeviceTypeActive: returns true if at least one active client is routed to
966*ec779b8eSAndroid Build Coastguard Worker          * one of the specified devices
967*ec779b8eSAndroid Build Coastguard Worker          * @param deviceTypes list of devices to consider
968*ec779b8eSAndroid Build Coastguard Worker          */
969*ec779b8eSAndroid Build Coastguard Worker         bool isAnyDeviceTypeActive(const DeviceTypeSet& deviceTypes) const;
970*ec779b8eSAndroid Build Coastguard Worker         /**
971*ec779b8eSAndroid Build Coastguard Worker          * @brief isLeUnicastActive: returns true if a call is active or at least one active client
972*ec779b8eSAndroid Build Coastguard Worker          * is routed to a LE unicast device
973*ec779b8eSAndroid Build Coastguard Worker          */
974*ec779b8eSAndroid Build Coastguard Worker         bool isLeUnicastActive() const;
975*ec779b8eSAndroid Build Coastguard Worker 
976*ec779b8eSAndroid Build Coastguard Worker         void checkLeBroadcastRoutes(bool wasUnicastActive,
977*ec779b8eSAndroid Build Coastguard Worker                 sp<SwAudioOutputDescriptor> ignoredOutput, uint32_t delayMs);
978*ec779b8eSAndroid Build Coastguard Worker 
979*ec779b8eSAndroid Build Coastguard Worker         status_t startAudioSourceInternal(const struct audio_port_config *source,
980*ec779b8eSAndroid Build Coastguard Worker                                           const audio_attributes_t *attributes,
981*ec779b8eSAndroid Build Coastguard Worker                                           audio_port_handle_t *portId,
982*ec779b8eSAndroid Build Coastguard Worker                                           uid_t uid,
983*ec779b8eSAndroid Build Coastguard Worker                                           bool internal,
984*ec779b8eSAndroid Build Coastguard Worker                                           bool isCallRx,
985*ec779b8eSAndroid Build Coastguard Worker                                           uint32_t delayMs);
986*ec779b8eSAndroid Build Coastguard Worker         const uid_t mUidCached;                         // AID_AUDIOSERVER
987*ec779b8eSAndroid Build Coastguard Worker         sp<const AudioPolicyConfig> mConfig;
988*ec779b8eSAndroid Build Coastguard Worker         EngineInstance mEngine;                         // Audio Policy Engine instance
989*ec779b8eSAndroid Build Coastguard Worker         AudioPolicyClientInterface *mpClientInterface;  // audio policy client interface
990*ec779b8eSAndroid Build Coastguard Worker         sp<SwAudioOutputDescriptor> mPrimaryOutput;     // primary output descriptor
991*ec779b8eSAndroid Build Coastguard Worker         // mPrimaryModuleHandle is cached mPrimaryOutput->getModuleHandle();
992*ec779b8eSAndroid Build Coastguard Worker         audio_module_handle_t mPrimaryModuleHandle = AUDIO_MODULE_HANDLE_NONE;
993*ec779b8eSAndroid Build Coastguard Worker         // list of descriptors for outputs currently opened
994*ec779b8eSAndroid Build Coastguard Worker 
995*ec779b8eSAndroid Build Coastguard Worker         sp<SwAudioOutputDescriptor> mSpatializerOutput;
996*ec779b8eSAndroid Build Coastguard Worker 
997*ec779b8eSAndroid Build Coastguard Worker         SwAudioOutputCollection mOutputs;
998*ec779b8eSAndroid Build Coastguard Worker         // copy of mOutputs before setDeviceConnectionState() opens new outputs
999*ec779b8eSAndroid Build Coastguard Worker         // reset to mOutputs when updateDevicesAndOutputs() is called.
1000*ec779b8eSAndroid Build Coastguard Worker         SwAudioOutputCollection mPreviousOutputs;
1001*ec779b8eSAndroid Build Coastguard Worker         AudioInputCollection mInputs;     // list of input descriptors
1002*ec779b8eSAndroid Build Coastguard Worker 
1003*ec779b8eSAndroid Build Coastguard Worker         DeviceVector  mAvailableOutputDevices; // all available output devices
1004*ec779b8eSAndroid Build Coastguard Worker         DeviceVector  mAvailableInputDevices;  // all available input devices
1005*ec779b8eSAndroid Build Coastguard Worker 
1006*ec779b8eSAndroid Build Coastguard Worker         bool    mLimitRingtoneVolume;        // limit ringtone volume to music volume if headset connected
1007*ec779b8eSAndroid Build Coastguard Worker 
1008*ec779b8eSAndroid Build Coastguard Worker         float   mLastVoiceVolume;            // last voice volume value sent to audio HAL
1009*ec779b8eSAndroid Build Coastguard Worker         bool    mA2dpSuspended;  // true if A2DP output is suspended
1010*ec779b8eSAndroid Build Coastguard Worker 
1011*ec779b8eSAndroid Build Coastguard Worker         EffectDescriptorCollection mEffects;  // list of registered audio effects
1012*ec779b8eSAndroid Build Coastguard Worker         HwModuleCollection mHwModules; // contains modules that have been loaded successfully
1013*ec779b8eSAndroid Build Coastguard Worker 
1014*ec779b8eSAndroid Build Coastguard Worker         std::atomic<uint32_t> mAudioPortGeneration;
1015*ec779b8eSAndroid Build Coastguard Worker 
1016*ec779b8eSAndroid Build Coastguard Worker         AudioPatchCollection mAudioPatches;
1017*ec779b8eSAndroid Build Coastguard Worker 
1018*ec779b8eSAndroid Build Coastguard Worker         SoundTriggerSessionCollection mSoundTriggerSessions;
1019*ec779b8eSAndroid Build Coastguard Worker 
1020*ec779b8eSAndroid Build Coastguard Worker         HwAudioOutputCollection mHwOutputs;
1021*ec779b8eSAndroid Build Coastguard Worker         SourceClientCollection mAudioSources;
1022*ec779b8eSAndroid Build Coastguard Worker 
1023*ec779b8eSAndroid Build Coastguard Worker         // for supporting "beacon" streams, i.e. streams that only play on speaker, and never
1024*ec779b8eSAndroid Build Coastguard Worker         // when something other than STREAM_TTS (a.k.a. "Transmitted Through Speaker") is playing
1025*ec779b8eSAndroid Build Coastguard Worker         enum {
1026*ec779b8eSAndroid Build Coastguard Worker             STARTING_OUTPUT,
1027*ec779b8eSAndroid Build Coastguard Worker             STARTING_BEACON,
1028*ec779b8eSAndroid Build Coastguard Worker             STOPPING_OUTPUT,
1029*ec779b8eSAndroid Build Coastguard Worker             STOPPING_BEACON
1030*ec779b8eSAndroid Build Coastguard Worker         };
1031*ec779b8eSAndroid Build Coastguard Worker         uint32_t mBeaconMuteRefCount;   // ref count for stream that would mute beacon
1032*ec779b8eSAndroid Build Coastguard Worker         uint32_t mBeaconPlayingRefCount;// ref count for the playing beacon streams
1033*ec779b8eSAndroid Build Coastguard Worker         bool mBeaconMuted;              // has STREAM_TTS been muted
1034*ec779b8eSAndroid Build Coastguard Worker         // true if a dedicated output for TTS stream or Ultrasound is available
1035*ec779b8eSAndroid Build Coastguard Worker         bool mTtsOutputAvailable;
1036*ec779b8eSAndroid Build Coastguard Worker 
1037*ec779b8eSAndroid Build Coastguard Worker         bool mMasterMono;               // true if we wish to force all outputs to mono
1038*ec779b8eSAndroid Build Coastguard Worker         AudioPolicyMixCollection mPolicyMixes; // list of registered mixes
1039*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t mMusicEffectOutput;     // output selected for music effects
1040*ec779b8eSAndroid Build Coastguard Worker 
1041*ec779b8eSAndroid Build Coastguard Worker         uint32_t nextAudioPortGeneration();
1042*ec779b8eSAndroid Build Coastguard Worker 
1043*ec779b8eSAndroid Build Coastguard Worker         // Surround formats that are enabled manually. Taken into account when
1044*ec779b8eSAndroid Build Coastguard Worker         // "encoded surround" is forced into "manual" mode.
1045*ec779b8eSAndroid Build Coastguard Worker         std::unordered_set<audio_format_t> mManualSurroundFormats;
1046*ec779b8eSAndroid Build Coastguard Worker 
1047*ec779b8eSAndroid Build Coastguard Worker         std::unordered_map<uid_t, audio_flags_mask_t> mAllowedCapturePolicies;
1048*ec779b8eSAndroid Build Coastguard Worker 
1049*ec779b8eSAndroid Build Coastguard Worker         // The map of device descriptor and formats reported by the device.
1050*ec779b8eSAndroid Build Coastguard Worker         std::map<wp<DeviceDescriptor>, FormatVector> mReportedFormatsMap;
1051*ec779b8eSAndroid Build Coastguard Worker 
1052*ec779b8eSAndroid Build Coastguard Worker         // Cached product strategy ID corresponding to legacy strategy STRATEGY_PHONE
1053*ec779b8eSAndroid Build Coastguard Worker         product_strategy_t mCommunnicationStrategy;
1054*ec779b8eSAndroid Build Coastguard Worker 
1055*ec779b8eSAndroid Build Coastguard Worker         // The port handle of the hardware audio source created internally for the Call RX audio
1056*ec779b8eSAndroid Build Coastguard Worker         // end point.
1057*ec779b8eSAndroid Build Coastguard Worker         sp<SourceClientDescriptor> mCallRxSourceClient;
1058*ec779b8eSAndroid Build Coastguard Worker         sp<SourceClientDescriptor> mCallTxSourceClient;
1059*ec779b8eSAndroid Build Coastguard Worker 
1060*ec779b8eSAndroid Build Coastguard Worker         std::map<audio_port_handle_t,
1061*ec779b8eSAndroid Build Coastguard Worker                  std::map<product_strategy_t,
1062*ec779b8eSAndroid Build Coastguard Worker                           sp<PreferredMixerAttributesInfo>>> mPreferredMixerAttrInfos;
1063*ec779b8eSAndroid Build Coastguard Worker 
1064*ec779b8eSAndroid Build Coastguard Worker         // Support for Multi-Stream Decoder (MSD) module
1065*ec779b8eSAndroid Build Coastguard Worker         sp<DeviceDescriptor> getMsdAudioInDevice() const;
1066*ec779b8eSAndroid Build Coastguard Worker         DeviceVector getMsdAudioOutDevices() const;
1067*ec779b8eSAndroid Build Coastguard Worker         const AudioPatchCollection getMsdOutputPatches() const;
1068*ec779b8eSAndroid Build Coastguard Worker         status_t getMsdProfiles(bool hwAvSync,
1069*ec779b8eSAndroid Build Coastguard Worker                 const InputProfileCollection &inputProfiles,
1070*ec779b8eSAndroid Build Coastguard Worker                 const OutputProfileCollection &outputProfiles,
1071*ec779b8eSAndroid Build Coastguard Worker                 const sp<DeviceDescriptor> &sourceDevice,
1072*ec779b8eSAndroid Build Coastguard Worker                 const sp<DeviceDescriptor> &sinkDevice,
1073*ec779b8eSAndroid Build Coastguard Worker                 AudioProfileVector &sourceProfiles,
1074*ec779b8eSAndroid Build Coastguard Worker                 AudioProfileVector &sinkProfiles) const;
1075*ec779b8eSAndroid Build Coastguard Worker         status_t getBestMsdConfig(bool hwAvSync,
1076*ec779b8eSAndroid Build Coastguard Worker                 const AudioProfileVector &sourceProfiles,
1077*ec779b8eSAndroid Build Coastguard Worker                 const AudioProfileVector &sinkProfiles,
1078*ec779b8eSAndroid Build Coastguard Worker                 audio_port_config *sourceConfig,
1079*ec779b8eSAndroid Build Coastguard Worker                 audio_port_config *sinkConfig) const;
1080*ec779b8eSAndroid Build Coastguard Worker         PatchBuilder buildMsdPatch(bool msdIsSource, const sp<DeviceDescriptor> &device) const;
1081*ec779b8eSAndroid Build Coastguard Worker         status_t setMsdOutputPatches(const DeviceVector *outputDevices = nullptr);
1082*ec779b8eSAndroid Build Coastguard Worker         void releaseMsdOutputPatches(const DeviceVector& devices);
1083*ec779b8eSAndroid Build Coastguard Worker         bool msdHasPatchesToAllDevices(const AudioDeviceTypeAddrVector& devices);
1084*ec779b8eSAndroid Build Coastguard Worker 
1085*ec779b8eSAndroid Build Coastguard Worker         // Overload of setDeviceConnectionState()
1086*ec779b8eSAndroid Build Coastguard Worker         status_t setDeviceConnectionState(audio_devices_t deviceType,
1087*ec779b8eSAndroid Build Coastguard Worker                                           audio_policy_dev_state_t state,
1088*ec779b8eSAndroid Build Coastguard Worker                                           const char* device_address, const char* device_name,
1089*ec779b8eSAndroid Build Coastguard Worker                                           audio_format_t encodedFormat);
1090*ec779b8eSAndroid Build Coastguard Worker 
1091*ec779b8eSAndroid Build Coastguard Worker         // Called by setDeviceConnectionState()
1092*ec779b8eSAndroid Build Coastguard Worker         status_t deviceToAudioPort(audio_devices_t deviceType, const char* device_address,
1093*ec779b8eSAndroid Build Coastguard Worker                                    const char* device_name, media::AudioPortFw* aidPort);
1094*ec779b8eSAndroid Build Coastguard Worker         bool isMsdPatch(const audio_patch_handle_t &handle) const;
1095*ec779b8eSAndroid Build Coastguard Worker 
1096*ec779b8eSAndroid Build Coastguard Worker private:
1097*ec779b8eSAndroid Build Coastguard Worker 
1098*ec779b8eSAndroid Build Coastguard Worker         void onNewAudioModulesAvailableInt(DeviceVector *newDevices);
1099*ec779b8eSAndroid Build Coastguard Worker 
1100*ec779b8eSAndroid Build Coastguard Worker         // Add or remove AC3 DTS encodings based on user preferences.
1101*ec779b8eSAndroid Build Coastguard Worker         void modifySurroundFormats(const sp<DeviceDescriptor>& devDesc, FormatVector *formatsPtr);
1102*ec779b8eSAndroid Build Coastguard Worker         void modifySurroundChannelMasks(ChannelMaskSet *channelMasksPtr);
1103*ec779b8eSAndroid Build Coastguard Worker 
1104*ec779b8eSAndroid Build Coastguard Worker         // If any, resolve any "dynamic" fields of the Audio Profiles collection of and IOProfile
1105*ec779b8eSAndroid Build Coastguard Worker         void updateAudioProfiles(const sp<DeviceDescriptor>& devDesc, audio_io_handle_t ioHandle,
1106*ec779b8eSAndroid Build Coastguard Worker                 const sp<IOProfile> &profiles);
1107*ec779b8eSAndroid Build Coastguard Worker 
1108*ec779b8eSAndroid Build Coastguard Worker         // Notify the policy client to prepare for disconnecting external device.
1109*ec779b8eSAndroid Build Coastguard Worker         void prepareToDisconnectExternalDevice(const sp<DeviceDescriptor> &device);
1110*ec779b8eSAndroid Build Coastguard Worker 
1111*ec779b8eSAndroid Build Coastguard Worker         // Notify the policy client of any change of device state with AUDIO_IO_HANDLE_NONE,
1112*ec779b8eSAndroid Build Coastguard Worker         // so that the client interprets it as global to audio hardware interfaces.
1113*ec779b8eSAndroid Build Coastguard Worker         // It can give a chance to HAL implementer to retrieve dynamic capabilities associated
1114*ec779b8eSAndroid Build Coastguard Worker         // to this device for example.
1115*ec779b8eSAndroid Build Coastguard Worker         // TODO avoid opening stream to retrieve capabilities of a profile.
1116*ec779b8eSAndroid Build Coastguard Worker         status_t broadcastDeviceConnectionState(const sp<DeviceDescriptor> &device,
1117*ec779b8eSAndroid Build Coastguard Worker                                                 media::DeviceConnectedState state);
1118*ec779b8eSAndroid Build Coastguard Worker 
1119*ec779b8eSAndroid Build Coastguard Worker         // updates device caching and output for streams that can influence the
1120*ec779b8eSAndroid Build Coastguard Worker         //    routing of notifications
1121*ec779b8eSAndroid Build Coastguard Worker         void handleNotificationRoutingForStream(audio_stream_type_t stream);
curAudioPortGeneration()1122*ec779b8eSAndroid Build Coastguard Worker         uint32_t curAudioPortGeneration() const { return mAudioPortGeneration; }
1123*ec779b8eSAndroid Build Coastguard Worker         // internal method, get audio_attributes_t from either a source audio_attributes_t
1124*ec779b8eSAndroid Build Coastguard Worker         // or audio_stream_type_t, respectively.
1125*ec779b8eSAndroid Build Coastguard Worker         status_t getAudioAttributes(audio_attributes_t *dstAttr,
1126*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t *srcAttr,
1127*ec779b8eSAndroid Build Coastguard Worker                 audio_stream_type_t srcStream);
1128*ec779b8eSAndroid Build Coastguard Worker         // internal method, called by getOutputForAttr() and connectAudioSource.
1129*ec779b8eSAndroid Build Coastguard Worker         status_t getOutputForAttrInt(audio_attributes_t *resultAttr,
1130*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t *output,
1131*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t session,
1132*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t *attr,
1133*ec779b8eSAndroid Build Coastguard Worker                 audio_stream_type_t *stream,
1134*ec779b8eSAndroid Build Coastguard Worker                 uid_t uid,
1135*ec779b8eSAndroid Build Coastguard Worker                 audio_config_t *config,
1136*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t *flags,
1137*ec779b8eSAndroid Build Coastguard Worker                 DeviceIdVector *selectedDeviceIds,
1138*ec779b8eSAndroid Build Coastguard Worker                 bool *isRequestedDeviceForExclusiveUse,
1139*ec779b8eSAndroid Build Coastguard Worker                 std::vector<sp<AudioPolicyMix>> *secondaryMixes,
1140*ec779b8eSAndroid Build Coastguard Worker                 output_type_t *outputType,
1141*ec779b8eSAndroid Build Coastguard Worker                 bool *isSpatialized,
1142*ec779b8eSAndroid Build Coastguard Worker                 bool *isBitPerfect);
1143*ec779b8eSAndroid Build Coastguard Worker         // internal method to return the output handle for the given device and format
1144*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t getOutputForDevices(
1145*ec779b8eSAndroid Build Coastguard Worker                 const DeviceVector &devices,
1146*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t session,
1147*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t *attr,
1148*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_t *config,
1149*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t *flags,
1150*ec779b8eSAndroid Build Coastguard Worker                 bool *isSpatialized,
1151*ec779b8eSAndroid Build Coastguard Worker                 sp<PreferredMixerAttributesInfo> prefMixerAttrInfo = nullptr,
1152*ec779b8eSAndroid Build Coastguard Worker                 bool forceMutingHaptic = false);
1153*ec779b8eSAndroid Build Coastguard Worker 
1154*ec779b8eSAndroid Build Coastguard Worker         // Internal method checking if a direct output can be opened matching the requested
1155*ec779b8eSAndroid Build Coastguard Worker         // attributes, flags, config and devices.
1156*ec779b8eSAndroid Build Coastguard Worker         // If NAME_NOT_FOUND is returned, an attempt can be made to open a mixed output.
1157*ec779b8eSAndroid Build Coastguard Worker         status_t openDirectOutput(
1158*ec779b8eSAndroid Build Coastguard Worker                 audio_stream_type_t stream,
1159*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t session,
1160*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_t *config,
1161*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t flags,
1162*ec779b8eSAndroid Build Coastguard Worker                 const DeviceVector &devices,
1163*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t *output,
1164*ec779b8eSAndroid Build Coastguard Worker                 audio_attributes_t attributes);
1165*ec779b8eSAndroid Build Coastguard Worker 
1166*ec779b8eSAndroid Build Coastguard Worker         /**
1167*ec779b8eSAndroid Build Coastguard Worker          * @brief Queries if some kind of spatialization will be performed if the audio playback
1168*ec779b8eSAndroid Build Coastguard Worker          * context described by the provided arguments is present.
1169*ec779b8eSAndroid Build Coastguard Worker          * The context is made of:
1170*ec779b8eSAndroid Build Coastguard Worker          * - The audio attributes describing the playback use case.
1171*ec779b8eSAndroid Build Coastguard Worker          * - The audio configuration describing the audio format, channels, sampling rate ...
1172*ec779b8eSAndroid Build Coastguard Worker          * - The devices describing the sink audio device selected for playback.
1173*ec779b8eSAndroid Build Coastguard Worker          * All arguments are optional and only the specified arguments are used to match against
1174*ec779b8eSAndroid Build Coastguard Worker          * supported criteria. For instance, supplying no argument will tell if spatialization is
1175*ec779b8eSAndroid Build Coastguard Worker          * supported or not in general.
1176*ec779b8eSAndroid Build Coastguard Worker          * @param attr audio attributes describing the playback use case
1177*ec779b8eSAndroid Build Coastguard Worker          * @param config audio configuration describing the audio format, channels, sample rate...
1178*ec779b8eSAndroid Build Coastguard Worker          * @param devices the sink audio device selected for playback
1179*ec779b8eSAndroid Build Coastguard Worker          * @return true if spatialization is possible for this context, false otherwise.
1180*ec779b8eSAndroid Build Coastguard Worker          */
1181*ec779b8eSAndroid Build Coastguard Worker         virtual bool canBeSpatializedInt(const audio_attributes_t *attr,
1182*ec779b8eSAndroid Build Coastguard Worker                                       const audio_config_t *config,
1183*ec779b8eSAndroid Build Coastguard Worker                                       const AudioDeviceTypeAddrVector &devices) const;
1184*ec779b8eSAndroid Build Coastguard Worker 
1185*ec779b8eSAndroid Build Coastguard Worker 
1186*ec779b8eSAndroid Build Coastguard Worker         /**
1187*ec779b8eSAndroid Build Coastguard Worker          * @brief Gets an IOProfile for a spatializer output with the best match with
1188*ec779b8eSAndroid Build Coastguard Worker          * provided arguments.
1189*ec779b8eSAndroid Build Coastguard Worker          * The caller can have the devices criteria ignored by passing and empty vector, and
1190*ec779b8eSAndroid Build Coastguard Worker          * getSpatializerOutputProfile() will ignore the devices when looking for a match.
1191*ec779b8eSAndroid Build Coastguard Worker          * Otherwise an output profile supporting a spatializer effect that can be routed
1192*ec779b8eSAndroid Build Coastguard Worker          * to the specified devices must exist.
1193*ec779b8eSAndroid Build Coastguard Worker          * @param config audio configuration describing the audio format, channels, sample rate...
1194*ec779b8eSAndroid Build Coastguard Worker          * @param devices the sink audio device selected for playback
1195*ec779b8eSAndroid Build Coastguard Worker          * @return an IOProfile that canbe used to open a spatializer output.
1196*ec779b8eSAndroid Build Coastguard Worker          */
1197*ec779b8eSAndroid Build Coastguard Worker         sp<IOProfile> getSpatializerOutputProfile(const audio_config_t *config,
1198*ec779b8eSAndroid Build Coastguard Worker                                                   const AudioDeviceTypeAddrVector &devices) const;
1199*ec779b8eSAndroid Build Coastguard Worker 
1200*ec779b8eSAndroid Build Coastguard Worker         void checkVirtualizerClientRoutes();
1201*ec779b8eSAndroid Build Coastguard Worker 
1202*ec779b8eSAndroid Build Coastguard Worker         /**
1203*ec779b8eSAndroid Build Coastguard Worker          * @brief Returns true if at least one device can only be reached via the output passed
1204*ec779b8eSAndroid Build Coastguard Worker          * as argument. Always returns false for duplicated outputs.
1205*ec779b8eSAndroid Build Coastguard Worker          * This can be used to decide if an output can be closed without forbidding
1206*ec779b8eSAndroid Build Coastguard Worker          * playback to any given device.
1207*ec779b8eSAndroid Build Coastguard Worker          * @param outputDesc the output to consider
1208*ec779b8eSAndroid Build Coastguard Worker          * @return true if at least one device can only be reached via the output.
1209*ec779b8eSAndroid Build Coastguard Worker          */
1210*ec779b8eSAndroid Build Coastguard Worker         bool isOutputOnlyAvailableRouteToSomeDevice(const sp<SwAudioOutputDescriptor>& outputDesc);
1211*ec779b8eSAndroid Build Coastguard Worker 
1212*ec779b8eSAndroid Build Coastguard Worker         /**
1213*ec779b8eSAndroid Build Coastguard Worker          * @brief getInputForDevice selects an input handle for a given input device and
1214*ec779b8eSAndroid Build Coastguard Worker          * requester context
1215*ec779b8eSAndroid Build Coastguard Worker          * @param device to be used by requester, selected by policy mix rules or engine
1216*ec779b8eSAndroid Build Coastguard Worker          * @param session requester session id
1217*ec779b8eSAndroid Build Coastguard Worker          * @param uid requester uid
1218*ec779b8eSAndroid Build Coastguard Worker          * @param attributes requester audio attributes (e.g. input source and tags matter)
1219*ec779b8eSAndroid Build Coastguard Worker          * @param config requested audio configuration (e.g. sample rate, format, channel mask),
1220*ec779b8eSAndroid Build Coastguard Worker          *               will be updated if current configuration doesn't support but another
1221*ec779b8eSAndroid Build Coastguard Worker          *               one does
1222*ec779b8eSAndroid Build Coastguard Worker          * @param flags requester input flags
1223*ec779b8eSAndroid Build Coastguard Worker          * @param policyMix may be null, policy rules to be followed by the requester
1224*ec779b8eSAndroid Build Coastguard Worker          * @return input io handle aka unique input identifier selected for this device.
1225*ec779b8eSAndroid Build Coastguard Worker          */
1226*ec779b8eSAndroid Build Coastguard Worker         audio_io_handle_t getInputForDevice(const sp<DeviceDescriptor> &device,
1227*ec779b8eSAndroid Build Coastguard Worker                 audio_session_t session,
1228*ec779b8eSAndroid Build Coastguard Worker                 const audio_attributes_t &attributes,
1229*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_base_t &config,
1230*ec779b8eSAndroid Build Coastguard Worker                 audio_input_flags_t flags,
1231*ec779b8eSAndroid Build Coastguard Worker                 const sp<AudioPolicyMix> &policyMix);
1232*ec779b8eSAndroid Build Coastguard Worker 
1233*ec779b8eSAndroid Build Coastguard Worker         // event is one of STARTING_OUTPUT, STARTING_BEACON, STOPPING_OUTPUT, STOPPING_BEACON
1234*ec779b8eSAndroid Build Coastguard Worker         // returns 0 if no mute/unmute event happened, the largest latency of the device where
1235*ec779b8eSAndroid Build Coastguard Worker         //   the mute/unmute happened
1236*ec779b8eSAndroid Build Coastguard Worker         uint32_t handleEventForBeacon(int event);
1237*ec779b8eSAndroid Build Coastguard Worker         uint32_t setBeaconMute(bool mute);
1238*ec779b8eSAndroid Build Coastguard Worker         bool     isValidAttributes(const audio_attributes_t *paa);
1239*ec779b8eSAndroid Build Coastguard Worker 
1240*ec779b8eSAndroid Build Coastguard Worker         // Called by setDeviceConnectionState().
1241*ec779b8eSAndroid Build Coastguard Worker         status_t setDeviceConnectionStateInt(audio_policy_dev_state_t state,
1242*ec779b8eSAndroid Build Coastguard Worker                                              const android::media::audio::common::AudioPort& port,
1243*ec779b8eSAndroid Build Coastguard Worker                                              audio_format_t encodedFormat);
1244*ec779b8eSAndroid Build Coastguard Worker         status_t setDeviceConnectionStateInt(audio_devices_t deviceType,
1245*ec779b8eSAndroid Build Coastguard Worker                                              audio_policy_dev_state_t state,
1246*ec779b8eSAndroid Build Coastguard Worker                                              const char *device_address,
1247*ec779b8eSAndroid Build Coastguard Worker                                              const char *device_name,
1248*ec779b8eSAndroid Build Coastguard Worker                                              audio_format_t encodedFormat);
1249*ec779b8eSAndroid Build Coastguard Worker         status_t setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device,
1250*ec779b8eSAndroid Build Coastguard Worker                                              audio_policy_dev_state_t state);
1251*ec779b8eSAndroid Build Coastguard Worker 
1252*ec779b8eSAndroid Build Coastguard Worker         void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
1253*ec779b8eSAndroid Build Coastguard Worker                                       audio_policy_dev_state_t state);
1254*ec779b8eSAndroid Build Coastguard Worker 
updateMono(audio_io_handle_t output)1255*ec779b8eSAndroid Build Coastguard Worker         void updateMono(audio_io_handle_t output) {
1256*ec779b8eSAndroid Build Coastguard Worker             AudioParameter param;
1257*ec779b8eSAndroid Build Coastguard Worker             param.addInt(String8(AudioParameter::keyMonoOutput), (int)mMasterMono);
1258*ec779b8eSAndroid Build Coastguard Worker             mpClientInterface->setParameters(output, param.toString());
1259*ec779b8eSAndroid Build Coastguard Worker         }
1260*ec779b8eSAndroid Build Coastguard Worker 
1261*ec779b8eSAndroid Build Coastguard Worker         /**
1262*ec779b8eSAndroid Build Coastguard Worker          * @brief createAudioPatchInternal internal function to manage audio patch creation
1263*ec779b8eSAndroid Build Coastguard Worker          * @param[in] patch structure containing sink and source ports configuration
1264*ec779b8eSAndroid Build Coastguard Worker          * @param[out] handle patch handle to be provided if patch installed correctly
1265*ec779b8eSAndroid Build Coastguard Worker          * @param[in] uid of the client
1266*ec779b8eSAndroid Build Coastguard Worker          * @param[in] delayMs if required
1267*ec779b8eSAndroid Build Coastguard Worker          * @param[in] sourceDesc source client to be configured when creating the patch, i.e.
1268*ec779b8eSAndroid Build Coastguard Worker          *            assigning an Output (HW or SW) used for volume control.
1269*ec779b8eSAndroid Build Coastguard Worker          * @return NO_ERROR if patch installed correctly, error code otherwise.
1270*ec779b8eSAndroid Build Coastguard Worker          */
1271*ec779b8eSAndroid Build Coastguard Worker         status_t createAudioPatchInternal(const struct audio_patch *patch,
1272*ec779b8eSAndroid Build Coastguard Worker                                           audio_patch_handle_t *handle,
1273*ec779b8eSAndroid Build Coastguard Worker                                           uid_t uid, uint32_t delayMs,
1274*ec779b8eSAndroid Build Coastguard Worker                                           const sp<SourceClientDescriptor>& sourceDesc);
1275*ec779b8eSAndroid Build Coastguard Worker         /**
1276*ec779b8eSAndroid Build Coastguard Worker          * @brief releaseAudioPatchInternal internal function to remove an audio patch
1277*ec779b8eSAndroid Build Coastguard Worker          * @param[in] handle of the patch to be removed
1278*ec779b8eSAndroid Build Coastguard Worker          * @param[in] delayMs if required
1279*ec779b8eSAndroid Build Coastguard Worker          * @param[in] sourceDesc [optional] in case of external source, source client to be
1280*ec779b8eSAndroid Build Coastguard Worker          * unrouted from the patch, i.e. assigning an Output (HW or SW)
1281*ec779b8eSAndroid Build Coastguard Worker          * @return NO_ERROR if patch removed correctly, error code otherwise.
1282*ec779b8eSAndroid Build Coastguard Worker          */
1283*ec779b8eSAndroid Build Coastguard Worker         status_t releaseAudioPatchInternal(audio_patch_handle_t handle,
1284*ec779b8eSAndroid Build Coastguard Worker                                            uint32_t delayMs = 0,
1285*ec779b8eSAndroid Build Coastguard Worker                                            const sp<SourceClientDescriptor>& sourceDesc = nullptr);
1286*ec779b8eSAndroid Build Coastguard Worker 
1287*ec779b8eSAndroid Build Coastguard Worker         status_t installPatch(const char *caller,
1288*ec779b8eSAndroid Build Coastguard Worker                 audio_patch_handle_t *patchHandle,
1289*ec779b8eSAndroid Build Coastguard Worker                 AudioIODescriptorInterface *ioDescriptor,
1290*ec779b8eSAndroid Build Coastguard Worker                 const struct audio_patch *patch,
1291*ec779b8eSAndroid Build Coastguard Worker                 int delayMs);
1292*ec779b8eSAndroid Build Coastguard Worker         status_t installPatch(const char *caller,
1293*ec779b8eSAndroid Build Coastguard Worker                 ssize_t index,
1294*ec779b8eSAndroid Build Coastguard Worker                 audio_patch_handle_t *patchHandle,
1295*ec779b8eSAndroid Build Coastguard Worker                 const struct audio_patch *patch,
1296*ec779b8eSAndroid Build Coastguard Worker                 int delayMs,
1297*ec779b8eSAndroid Build Coastguard Worker                 uid_t uid,
1298*ec779b8eSAndroid Build Coastguard Worker                 sp<AudioPatch> *patchDescPtr);
1299*ec779b8eSAndroid Build Coastguard Worker 
1300*ec779b8eSAndroid Build Coastguard Worker         bool areAllDevicesSupported(
1301*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddrVector& devices,
1302*ec779b8eSAndroid Build Coastguard Worker                 std::function<bool(audio_devices_t)> predicate,
1303*ec779b8eSAndroid Build Coastguard Worker                 const char* context,
1304*ec779b8eSAndroid Build Coastguard Worker                 bool matchAddress = true);
1305*ec779b8eSAndroid Build Coastguard Worker 
1306*ec779b8eSAndroid Build Coastguard Worker         /**
1307*ec779b8eSAndroid Build Coastguard Worker          * @brief changeOutputDevicesMuteState mute/unmute devices using checkDeviceMuteStrategies
1308*ec779b8eSAndroid Build Coastguard Worker          * @param devices devices to mute/unmute
1309*ec779b8eSAndroid Build Coastguard Worker          */
1310*ec779b8eSAndroid Build Coastguard Worker         void changeOutputDevicesMuteState(const AudioDeviceTypeAddrVector& devices);
1311*ec779b8eSAndroid Build Coastguard Worker 
1312*ec779b8eSAndroid Build Coastguard Worker         /**
1313*ec779b8eSAndroid Build Coastguard Worker          * @brief Returns a vector of software output descriptor that support the queried devices
1314*ec779b8eSAndroid Build Coastguard Worker          * @param devices devices to query
1315*ec779b8eSAndroid Build Coastguard Worker          * @param openOutputs open outputs where the devices are supported as determined by
1316*ec779b8eSAndroid Build Coastguard Worker          *      SwAudioOutputDescriptor::supportsAtLeastOne
1317*ec779b8eSAndroid Build Coastguard Worker          */
1318*ec779b8eSAndroid Build Coastguard Worker         std::vector<sp<SwAudioOutputDescriptor>> getSoftwareOutputsForDevices(
1319*ec779b8eSAndroid Build Coastguard Worker                 const AudioDeviceTypeAddrVector& devices) const;
1320*ec779b8eSAndroid Build Coastguard Worker 
1321*ec779b8eSAndroid Build Coastguard Worker         bool isScoRequestedForComm() const;
1322*ec779b8eSAndroid Build Coastguard Worker 
1323*ec779b8eSAndroid Build Coastguard Worker         bool isHearingAidUsedForComm() const;
1324*ec779b8eSAndroid Build Coastguard Worker 
1325*ec779b8eSAndroid Build Coastguard Worker         bool areAllActiveTracksRerouted(const sp<SwAudioOutputDescriptor>& output);
1326*ec779b8eSAndroid Build Coastguard Worker 
1327*ec779b8eSAndroid Build Coastguard Worker         /**
1328*ec779b8eSAndroid Build Coastguard Worker          * @brief Opens an output stream from the supplied IOProfile and route it to the
1329*ec779b8eSAndroid Build Coastguard Worker          * supplied audio devices. If a mixer config is specified, it is forwarded to audio
1330*ec779b8eSAndroid Build Coastguard Worker          * flinger. If not, a default config is derived from the output stream config.
1331*ec779b8eSAndroid Build Coastguard Worker          * Also opens a duplicating output if needed and queries the audio HAL for supported
1332*ec779b8eSAndroid Build Coastguard Worker          * audio profiles if the IOProfile is dynamic.
1333*ec779b8eSAndroid Build Coastguard Worker          * @param[in] profile IOProfile to use as template
1334*ec779b8eSAndroid Build Coastguard Worker          * @param[in] devices initial route to apply to this output stream
1335*ec779b8eSAndroid Build Coastguard Worker          * @param[in] mixerConfig if not null, use this to configure the mixer
1336*ec779b8eSAndroid Build Coastguard Worker          * @param[in] halConfig if not null, use this to configure the HAL
1337*ec779b8eSAndroid Build Coastguard Worker          * @param[in] flags the flags to be used to open the output
1338*ec779b8eSAndroid Build Coastguard Worker          * @return an output descriptor for the newly opened stream or null in case of error.
1339*ec779b8eSAndroid Build Coastguard Worker          */
1340*ec779b8eSAndroid Build Coastguard Worker         sp<SwAudioOutputDescriptor> openOutputWithProfileAndDevice(
1341*ec779b8eSAndroid Build Coastguard Worker                 const sp<IOProfile>& profile, const DeviceVector& devices,
1342*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_base_t *mixerConfig = nullptr,
1343*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_t *halConfig = nullptr,
1344*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE);
1345*ec779b8eSAndroid Build Coastguard Worker 
1346*ec779b8eSAndroid Build Coastguard Worker         bool isOffloadPossible(const audio_offload_info_t& offloadInfo,
1347*ec779b8eSAndroid Build Coastguard Worker                                bool durationIgnored = false);
1348*ec779b8eSAndroid Build Coastguard Worker 
1349*ec779b8eSAndroid Build Coastguard Worker         // adds the profiles from the outputProfile to the passed audioProfilesVector
1350*ec779b8eSAndroid Build Coastguard Worker         // without duplicating them if already present
1351*ec779b8eSAndroid Build Coastguard Worker         void addPortProfilesToVector(sp<IOProfile> outputProfile,
1352*ec779b8eSAndroid Build Coastguard Worker                                     AudioProfileVector& audioProfilesVector);
1353*ec779b8eSAndroid Build Coastguard Worker 
1354*ec779b8eSAndroid Build Coastguard Worker         // Searches for a compatible profile with the sample rate, audio format and channel mask
1355*ec779b8eSAndroid Build Coastguard Worker         // in the list of passed HwModule(s).
1356*ec779b8eSAndroid Build Coastguard Worker         // returns a compatible profile if found, nullptr otherwise
1357*ec779b8eSAndroid Build Coastguard Worker         sp<IOProfile> searchCompatibleProfileHwModules (
1358*ec779b8eSAndroid Build Coastguard Worker                                             const HwModuleCollection& hwModules,
1359*ec779b8eSAndroid Build Coastguard Worker                                             const DeviceVector& devices,
1360*ec779b8eSAndroid Build Coastguard Worker                                             uint32_t samplingRate,
1361*ec779b8eSAndroid Build Coastguard Worker                                             audio_format_t format,
1362*ec779b8eSAndroid Build Coastguard Worker                                             audio_channel_mask_t channelMask,
1363*ec779b8eSAndroid Build Coastguard Worker                                             audio_output_flags_t flags,
1364*ec779b8eSAndroid Build Coastguard Worker                                             bool directOnly);
1365*ec779b8eSAndroid Build Coastguard Worker 
1366*ec779b8eSAndroid Build Coastguard Worker         // Filters only the relevant flags for getProfileForOutput
1367*ec779b8eSAndroid Build Coastguard Worker         audio_output_flags_t getRelevantFlags (audio_output_flags_t flags, bool directOnly);
1368*ec779b8eSAndroid Build Coastguard Worker 
1369*ec779b8eSAndroid Build Coastguard Worker         status_t getDevicesForAttributes(const audio_attributes_t &attr,
1370*ec779b8eSAndroid Build Coastguard Worker                                          DeviceVector &devices,
1371*ec779b8eSAndroid Build Coastguard Worker                                          bool forVolume);
1372*ec779b8eSAndroid Build Coastguard Worker 
1373*ec779b8eSAndroid Build Coastguard Worker         // A helper method used by getDevicesForAttributes to retrieve input devices when
1374*ec779b8eSAndroid Build Coastguard Worker         // capture preset is available in the given audio attributes parameter.
1375*ec779b8eSAndroid Build Coastguard Worker         status_t getInputDevicesForAttributes(const audio_attributes_t &attr,
1376*ec779b8eSAndroid Build Coastguard Worker                                               DeviceVector &devices);
1377*ec779b8eSAndroid Build Coastguard Worker 
1378*ec779b8eSAndroid Build Coastguard Worker         status_t getProfilesForDevices(const DeviceVector& devices,
1379*ec779b8eSAndroid Build Coastguard Worker                                        AudioProfileVector& audioProfiles,
1380*ec779b8eSAndroid Build Coastguard Worker                                        uint32_t flags,
1381*ec779b8eSAndroid Build Coastguard Worker                                        bool isInput);
1382*ec779b8eSAndroid Build Coastguard Worker 
1383*ec779b8eSAndroid Build Coastguard Worker         /**
1384*ec779b8eSAndroid Build Coastguard Worker          * Returns the preferred mixer attributes info for the given device port id and strategy.
1385*ec779b8eSAndroid Build Coastguard Worker          * Bit-perfect mixer attributes will be returned if it is active and
1386*ec779b8eSAndroid Build Coastguard Worker          * `activeBitPerfectPreferred` is true.
1387*ec779b8eSAndroid Build Coastguard Worker          */
1388*ec779b8eSAndroid Build Coastguard Worker         sp<PreferredMixerAttributesInfo> getPreferredMixerAttributesInfo(
1389*ec779b8eSAndroid Build Coastguard Worker                 audio_port_handle_t devicePortId,
1390*ec779b8eSAndroid Build Coastguard Worker                 product_strategy_t strategy,
1391*ec779b8eSAndroid Build Coastguard Worker                 bool activeBitPerfectPreferred = false);
1392*ec779b8eSAndroid Build Coastguard Worker 
1393*ec779b8eSAndroid Build Coastguard Worker         sp<SwAudioOutputDescriptor> reopenOutput(
1394*ec779b8eSAndroid Build Coastguard Worker                 sp<SwAudioOutputDescriptor> outputDesc,
1395*ec779b8eSAndroid Build Coastguard Worker                 const audio_config_t *config,
1396*ec779b8eSAndroid Build Coastguard Worker                 audio_output_flags_t flags,
1397*ec779b8eSAndroid Build Coastguard Worker                 const char* caller);
1398*ec779b8eSAndroid Build Coastguard Worker 
1399*ec779b8eSAndroid Build Coastguard Worker         void reopenOutputsWithDevices(
1400*ec779b8eSAndroid Build Coastguard Worker                 const std::map<audio_io_handle_t, DeviceVector>& outputsToReopen);
1401*ec779b8eSAndroid Build Coastguard Worker 
1402*ec779b8eSAndroid Build Coastguard Worker         PortHandleVector getClientsForStream(audio_stream_type_t streamType) const;
1403*ec779b8eSAndroid Build Coastguard Worker         void invalidateStreams(StreamTypeVector streams) const;
1404*ec779b8eSAndroid Build Coastguard Worker 
1405*ec779b8eSAndroid Build Coastguard Worker         bool checkHapticCompatibilityOnSpatializerOutput(const audio_config_t* config,
1406*ec779b8eSAndroid Build Coastguard Worker                                                          audio_session_t sessionId) const;
1407*ec779b8eSAndroid Build Coastguard Worker 
1408*ec779b8eSAndroid Build Coastguard Worker         void updateClientsInternalMute(const sp<SwAudioOutputDescriptor>& desc);
1409*ec779b8eSAndroid Build Coastguard Worker 
1410*ec779b8eSAndroid Build Coastguard Worker         float adjustDeviceAttenuationForAbsVolume(IVolumeCurves &curves,
1411*ec779b8eSAndroid Build Coastguard Worker                                                   VolumeSource volumeSource,
1412*ec779b8eSAndroid Build Coastguard Worker                                                   int index,
1413*ec779b8eSAndroid Build Coastguard Worker                                                   const DeviceTypeSet &deviceTypes);
1414*ec779b8eSAndroid Build Coastguard Worker 
1415*ec779b8eSAndroid Build Coastguard Worker         status_t updateMmapPolicyInfos(media::audio::common::AudioMMapPolicyType policyType);
1416*ec779b8eSAndroid Build Coastguard Worker 
1417*ec779b8eSAndroid Build Coastguard Worker         // Contains for devices that support absolute volume the audio attributes
1418*ec779b8eSAndroid Build Coastguard Worker         // corresponding to the streams that are driving the volume changes
1419*ec779b8eSAndroid Build Coastguard Worker         std::unordered_map<audio_devices_t, audio_attributes_t> mAbsoluteVolumeDrivingStreams;
1420*ec779b8eSAndroid Build Coastguard Worker 
1421*ec779b8eSAndroid Build Coastguard Worker         std::map<media::audio::common::AudioMMapPolicyType,
1422*ec779b8eSAndroid Build Coastguard Worker                 const std::vector<media::audio::common::AudioMMapPolicyInfo>> mMmapPolicyInfos;
1423*ec779b8eSAndroid Build Coastguard Worker         std::map<media::audio::common::AudioMMapPolicyType,
1424*ec779b8eSAndroid Build Coastguard Worker                 const std::map<media::audio::common::AudioDeviceDescription,
1425*ec779b8eSAndroid Build Coastguard Worker                          media::audio::common::AudioMMapPolicy>> mMmapPolicyByDeviceType;
1426*ec779b8eSAndroid Build Coastguard Worker };
1427*ec779b8eSAndroid Build Coastguard Worker 
1428*ec779b8eSAndroid Build Coastguard Worker };
1429