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