1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2007, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker ** 5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker ** 9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker ** 11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #pragma once 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker // Classes and interfaces directly used. 21*ec779b8eSAndroid Build Coastguard Worker #include "Client.h" 22*ec779b8eSAndroid Build Coastguard Worker #include "DeviceEffectManager.h" 23*ec779b8eSAndroid Build Coastguard Worker #include "EffectConfiguration.h" 24*ec779b8eSAndroid Build Coastguard Worker #include "IAfEffect.h" 25*ec779b8eSAndroid Build Coastguard Worker #include "IAfPatchPanel.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "IAfThread.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "IAfTrack.h" 28*ec779b8eSAndroid Build Coastguard Worker #include "MelReporter.h" 29*ec779b8eSAndroid Build Coastguard Worker #include "PatchCommandThread.h" 30*ec779b8eSAndroid Build Coastguard Worker #include "audio_utils/clock.h" 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker // External classes 33*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/FdToString.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/SimpleLog.h> 36*ec779b8eSAndroid Build Coastguard Worker #include <media/IAudioFlinger.h> 37*ec779b8eSAndroid Build Coastguard Worker #include <media/IAudioPolicyServiceLocal.h> 38*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaMetricsItem.h> 39*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/DevicesFactoryHalInterface.h> 40*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ServiceUtilities.h> 41*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/Synchronization.h> 42*ec779b8eSAndroid Build Coastguard Worker #include <psh_utils/AudioPowerManager.h> 43*ec779b8eSAndroid Build Coastguard Worker 44*ec779b8eSAndroid Build Coastguard Worker // not needed with the includes above, added to prevent transitive include dependency. 45*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 46*ec779b8eSAndroid Build Coastguard Worker #include <utils/String16.h> 47*ec779b8eSAndroid Build Coastguard Worker #include <atomic> 48*ec779b8eSAndroid Build Coastguard Worker #include <functional> 49*ec779b8eSAndroid Build Coastguard Worker #include <map> 50*ec779b8eSAndroid Build Coastguard Worker #include <optional> 51*ec779b8eSAndroid Build Coastguard Worker #include <set> 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker namespace android { 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker class AudioFlinger 56*ec779b8eSAndroid Build Coastguard Worker : public AudioFlingerServerAdapter::Delegate // IAudioFlinger client interface 57*ec779b8eSAndroid Build Coastguard Worker , public IAfClientCallback 58*ec779b8eSAndroid Build Coastguard Worker , public IAfDeviceEffectManagerCallback 59*ec779b8eSAndroid Build Coastguard Worker , public IAfMelReporterCallback 60*ec779b8eSAndroid Build Coastguard Worker , public IAfPatchPanelCallback 61*ec779b8eSAndroid Build Coastguard Worker , public IAfThreadCallback 62*ec779b8eSAndroid Build Coastguard Worker { 63*ec779b8eSAndroid Build Coastguard Worker friend class sp<AudioFlinger>; 64*ec779b8eSAndroid Build Coastguard Worker public: 65*ec779b8eSAndroid Build Coastguard Worker static void instantiate() ANDROID_API; 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker status_t resetReferencesForTest(); 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker // Called by main when startup finished -- for logging purposes only startupFinished()70*ec779b8eSAndroid Build Coastguard Worker void startupFinished() { 71*ec779b8eSAndroid Build Coastguard Worker mStartupFinishedTime.store(audio_utils_get_real_time_ns(), std::memory_order_release); 72*ec779b8eSAndroid Build Coastguard Worker } 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker private: 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker // ---- begin IAudioFlinger interface 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker status_t dump(int fd, const Vector<String16>& args) final EXCLUDES_AudioFlinger_Mutex; 79*ec779b8eSAndroid Build Coastguard Worker 80*ec779b8eSAndroid Build Coastguard Worker status_t createTrack(const media::CreateTrackRequest& input, 81*ec779b8eSAndroid Build Coastguard Worker media::CreateTrackResponse& output) final EXCLUDES_AudioFlinger_Mutex; 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker status_t createRecord(const media::CreateRecordRequest& input, 84*ec779b8eSAndroid Build Coastguard Worker media::CreateRecordResponse& output) final EXCLUDES_AudioFlinger_Mutex; 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate(audio_io_handle_t ioHandle) const final EXCLUDES_AudioFlinger_Mutex; 87*ec779b8eSAndroid Build Coastguard Worker audio_format_t format(audio_io_handle_t output) const final EXCLUDES_AudioFlinger_Mutex; 88*ec779b8eSAndroid Build Coastguard Worker size_t frameCount(audio_io_handle_t ioHandle) const final EXCLUDES_AudioFlinger_Mutex; 89*ec779b8eSAndroid Build Coastguard Worker size_t frameCountHAL(audio_io_handle_t ioHandle) const final EXCLUDES_AudioFlinger_Mutex; 90*ec779b8eSAndroid Build Coastguard Worker uint32_t latency(audio_io_handle_t output) const final EXCLUDES_AudioFlinger_Mutex; 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker status_t setMasterVolume(float value) final EXCLUDES_AudioFlinger_Mutex; 93*ec779b8eSAndroid Build Coastguard Worker status_t setMasterMute(bool muted) final EXCLUDES_AudioFlinger_Mutex; 94*ec779b8eSAndroid Build Coastguard Worker float masterVolume() const final EXCLUDES_AudioFlinger_Mutex; 95*ec779b8eSAndroid Build Coastguard Worker bool masterMute() const final EXCLUDES_AudioFlinger_Mutex; 96*ec779b8eSAndroid Build Coastguard Worker 97*ec779b8eSAndroid Build Coastguard Worker // Balance value must be within -1.f (left only) to 1.f (right only) inclusive. 98*ec779b8eSAndroid Build Coastguard Worker status_t setMasterBalance(float balance) final EXCLUDES_AudioFlinger_Mutex; 99*ec779b8eSAndroid Build Coastguard Worker status_t getMasterBalance(float* balance) const final EXCLUDES_AudioFlinger_Mutex; 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker status_t setStreamVolume(audio_stream_type_t stream, float value, 102*ec779b8eSAndroid Build Coastguard Worker bool muted, audio_io_handle_t output) final EXCLUDES_AudioFlinger_Mutex; 103*ec779b8eSAndroid Build Coastguard Worker status_t setStreamMute(audio_stream_type_t stream, bool muted) final 104*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker status_t setPortsVolume(const std::vector<audio_port_handle_t>& portIds, float volume, 107*ec779b8eSAndroid Build Coastguard Worker bool muted, audio_io_handle_t output) final EXCLUDES_AudioFlinger_Mutex; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker status_t setMode(audio_mode_t mode) final EXCLUDES_AudioFlinger_Mutex; 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker status_t setMicMute(bool state) final EXCLUDES_AudioFlinger_Mutex; 112*ec779b8eSAndroid Build Coastguard Worker bool getMicMute() const final EXCLUDES_AudioFlinger_Mutex; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker void setRecordSilenced(audio_port_handle_t portId, bool silenced) final 115*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) final 118*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 119*ec779b8eSAndroid Build Coastguard Worker String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const final 120*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 121*ec779b8eSAndroid Build Coastguard Worker 122*ec779b8eSAndroid Build Coastguard Worker void registerClient(const sp<media::IAudioFlingerClient>& client) final 123*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 124*ec779b8eSAndroid Build Coastguard Worker size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 125*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask) const final EXCLUDES_AudioFlinger_Mutex; 126*ec779b8eSAndroid Build Coastguard Worker 127*ec779b8eSAndroid Build Coastguard Worker status_t openOutput(const media::OpenOutputRequest& request, 128*ec779b8eSAndroid Build Coastguard Worker media::OpenOutputResponse* response) final EXCLUDES_AudioFlinger_Mutex; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 131*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output2) final EXCLUDES_AudioFlinger_Mutex; 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker status_t closeOutput(audio_io_handle_t output) final EXCLUDES_AudioFlinger_Mutex; 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker status_t suspendOutput(audio_io_handle_t output) final EXCLUDES_AudioFlinger_Mutex; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker status_t restoreOutput(audio_io_handle_t output) final EXCLUDES_AudioFlinger_Mutex; 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker status_t openInput(const media::OpenInputRequest& request, 140*ec779b8eSAndroid Build Coastguard Worker media::OpenInputResponse* response) final EXCLUDES_AudioFlinger_Mutex; 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker status_t closeInput(audio_io_handle_t input) final EXCLUDES_AudioFlinger_Mutex; 143*ec779b8eSAndroid Build Coastguard Worker 144*ec779b8eSAndroid Build Coastguard Worker status_t setVoiceVolume(float volume) final EXCLUDES_AudioFlinger_Mutex; 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker status_t getRenderPosition(uint32_t* halFrames, uint32_t* dspFrames, 147*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output) const final EXCLUDES_AudioFlinger_Mutex; 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const final 150*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 151*ec779b8eSAndroid Build Coastguard Worker 152*ec779b8eSAndroid Build Coastguard Worker // This is the binder API. For the internal API see nextUniqueId(). 153*ec779b8eSAndroid Build Coastguard Worker audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) final 154*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 155*ec779b8eSAndroid Build Coastguard Worker 156*ec779b8eSAndroid Build Coastguard Worker void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) final 157*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 158*ec779b8eSAndroid Build Coastguard Worker 159*ec779b8eSAndroid Build Coastguard Worker void releaseAudioSessionId(audio_session_t audioSession, pid_t pid) final 160*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 161*ec779b8eSAndroid Build Coastguard Worker 162*ec779b8eSAndroid Build Coastguard Worker status_t queryNumberEffects(uint32_t* numEffects) const final EXCLUDES_AudioFlinger_Mutex; 163*ec779b8eSAndroid Build Coastguard Worker 164*ec779b8eSAndroid Build Coastguard Worker status_t queryEffect(uint32_t index, effect_descriptor_t* descriptor) const final 165*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker status_t getEffectDescriptor(const effect_uuid_t* pUuid, 168*ec779b8eSAndroid Build Coastguard Worker const effect_uuid_t* pTypeUuid, 169*ec779b8eSAndroid Build Coastguard Worker uint32_t preferredTypeFlag, 170*ec779b8eSAndroid Build Coastguard Worker effect_descriptor_t* descriptor) const final EXCLUDES_AudioFlinger_Mutex; 171*ec779b8eSAndroid Build Coastguard Worker 172*ec779b8eSAndroid Build Coastguard Worker status_t createEffect(const media::CreateEffectRequest& request, 173*ec779b8eSAndroid Build Coastguard Worker media::CreateEffectResponse* response) final EXCLUDES_AudioFlinger_Mutex; 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker status_t moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput, 176*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t dstOutput) final EXCLUDES_AudioFlinger_Mutex; 177*ec779b8eSAndroid Build Coastguard Worker 178*ec779b8eSAndroid Build Coastguard Worker void setEffectSuspended(int effectId, 179*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 180*ec779b8eSAndroid Build Coastguard Worker bool suspended) final EXCLUDES_AudioFlinger_Mutex; 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker audio_module_handle_t loadHwModule(const char* name) final EXCLUDES_AudioFlinger_Mutex; 183*ec779b8eSAndroid Build Coastguard Worker 184*ec779b8eSAndroid Build Coastguard Worker uint32_t getPrimaryOutputSamplingRate() const final EXCLUDES_AudioFlinger_Mutex; 185*ec779b8eSAndroid Build Coastguard Worker size_t getPrimaryOutputFrameCount() const final EXCLUDES_AudioFlinger_Mutex; 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) final 188*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 189*ec779b8eSAndroid Build Coastguard Worker 190*ec779b8eSAndroid Build Coastguard Worker /* Get attributes for a given audio port */ 191*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPort(struct audio_port_v7* port) const final EXCLUDES_AudioFlinger_Mutex; 192*ec779b8eSAndroid Build Coastguard Worker 193*ec779b8eSAndroid Build Coastguard Worker /* Create an audio patch between several source and sink ports */ 194*ec779b8eSAndroid Build Coastguard Worker status_t createAudioPatch(const struct audio_patch *patch, 195*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t* handle) final EXCLUDES_AudioFlinger_Mutex; 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker /* Release an audio patch */ 198*ec779b8eSAndroid Build Coastguard Worker status_t releaseAudioPatch(audio_patch_handle_t handle) final EXCLUDES_AudioFlinger_Mutex; 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker /* List existing audio patches */ 201*ec779b8eSAndroid Build Coastguard Worker status_t listAudioPatches(unsigned int* num_patches, 202*ec779b8eSAndroid Build Coastguard Worker struct audio_patch* patches) const final EXCLUDES_AudioFlinger_Mutex; 203*ec779b8eSAndroid Build Coastguard Worker 204*ec779b8eSAndroid Build Coastguard Worker /* Set audio port configuration */ 205*ec779b8eSAndroid Build Coastguard Worker status_t setAudioPortConfig(const struct audio_port_config* config) final 206*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 207*ec779b8eSAndroid Build Coastguard Worker 208*ec779b8eSAndroid Build Coastguard Worker /* Get the HW synchronization source used for an audio session */ 209*ec779b8eSAndroid Build Coastguard Worker audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) final 210*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker /* Indicate JAVA services are ready (scheduling, power management ...) */ 213*ec779b8eSAndroid Build Coastguard Worker status_t systemReady() final EXCLUDES_AudioFlinger_Mutex; audioPolicyReady()214*ec779b8eSAndroid Build Coastguard Worker status_t audioPolicyReady() final { mAudioPolicyReady.store(true); return NO_ERROR; } 215*ec779b8eSAndroid Build Coastguard Worker 216*ec779b8eSAndroid Build Coastguard Worker status_t getMicrophones(std::vector<media::MicrophoneInfoFw>* microphones) const final 217*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker status_t setAudioHalPids(const std::vector<pid_t>& pids) final 220*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker status_t setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos) final 223*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 224*ec779b8eSAndroid Build Coastguard Worker 225*ec779b8eSAndroid Build Coastguard Worker status_t updateSecondaryOutputs( 226*ec779b8eSAndroid Build Coastguard Worker const TrackSecondaryOutputsMap& trackSecondaryOutputs) final 227*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 228*ec779b8eSAndroid Build Coastguard Worker 229*ec779b8eSAndroid Build Coastguard Worker status_t getMmapPolicyInfos( 230*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioMMapPolicyType policyType, 231*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioMMapPolicyInfo>* policyInfos) final 232*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 233*ec779b8eSAndroid Build Coastguard Worker 234*ec779b8eSAndroid Build Coastguard Worker int32_t getAAudioMixerBurstCount() const final EXCLUDES_AudioFlinger_Mutex; 235*ec779b8eSAndroid Build Coastguard Worker 236*ec779b8eSAndroid Build Coastguard Worker int32_t getAAudioHardwareBurstMinUsec() const final EXCLUDES_AudioFlinger_Mutex; 237*ec779b8eSAndroid Build Coastguard Worker 238*ec779b8eSAndroid Build Coastguard Worker status_t setDeviceConnectedState(const struct audio_port_v7* port, 239*ec779b8eSAndroid Build Coastguard Worker media::DeviceConnectedState state) final EXCLUDES_AudioFlinger_Mutex; 240*ec779b8eSAndroid Build Coastguard Worker 241*ec779b8eSAndroid Build Coastguard Worker status_t setSimulateDeviceConnections(bool enabled) final EXCLUDES_AudioFlinger_Mutex; 242*ec779b8eSAndroid Build Coastguard Worker 243*ec779b8eSAndroid Build Coastguard Worker status_t setRequestedLatencyMode( 244*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, audio_latency_mode_t mode) final 245*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 246*ec779b8eSAndroid Build Coastguard Worker 247*ec779b8eSAndroid Build Coastguard Worker status_t getSupportedLatencyModes(audio_io_handle_t output, 248*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_latency_mode_t>* modes) const final EXCLUDES_AudioFlinger_Mutex; 249*ec779b8eSAndroid Build Coastguard Worker 250*ec779b8eSAndroid Build Coastguard Worker status_t setBluetoothVariableLatencyEnabled(bool enabled) final EXCLUDES_AudioFlinger_Mutex; 251*ec779b8eSAndroid Build Coastguard Worker 252*ec779b8eSAndroid Build Coastguard Worker status_t isBluetoothVariableLatencyEnabled(bool* enabled) const final 253*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 254*ec779b8eSAndroid Build Coastguard Worker 255*ec779b8eSAndroid Build Coastguard Worker status_t supportsBluetoothVariableLatency(bool* support) const final 256*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 257*ec779b8eSAndroid Build Coastguard Worker 258*ec779b8eSAndroid Build Coastguard Worker status_t getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback, 259*ec779b8eSAndroid Build Coastguard Worker sp<media::ISoundDose>* soundDose) const final EXCLUDES_AudioFlinger_Mutex; 260*ec779b8eSAndroid Build Coastguard Worker 261*ec779b8eSAndroid Build Coastguard Worker status_t invalidateTracks(const std::vector<audio_port_handle_t>& portIds) final 262*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 263*ec779b8eSAndroid Build Coastguard Worker 264*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPolicyConfig(media::AudioPolicyConfig* config) final 265*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 266*ec779b8eSAndroid Build Coastguard Worker 267*ec779b8eSAndroid Build Coastguard Worker // Get the attributes of the mix port when connecting to the given device port. 268*ec779b8eSAndroid Build Coastguard Worker status_t getAudioMixPort(const struct audio_port_v7* devicePort, 269*ec779b8eSAndroid Build Coastguard Worker struct audio_port_v7* mixPort) const final EXCLUDES_AudioFlinger_Mutex; 270*ec779b8eSAndroid Build Coastguard Worker 271*ec779b8eSAndroid Build Coastguard Worker status_t setTracksInternalMute( 272*ec779b8eSAndroid Build Coastguard Worker const std::vector<media::TrackInternalMuteInfo>& tracksInternalMute) final 273*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 274*ec779b8eSAndroid Build Coastguard Worker 275*ec779b8eSAndroid Build Coastguard Worker status_t onTransactWrapper(TransactionCode code, const Parcel& data, uint32_t flags, 276*ec779b8eSAndroid Build Coastguard Worker const std::function<status_t()>& delegate) final EXCLUDES_AudioFlinger_Mutex; 277*ec779b8eSAndroid Build Coastguard Worker 278*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAudioFlinger interface 279*ec779b8eSAndroid Build Coastguard Worker 280*ec779b8eSAndroid Build Coastguard Worker // ---- begin IAfClientCallback interface 281*ec779b8eSAndroid Build Coastguard Worker clientMutex()282*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& clientMutex() const final 283*ec779b8eSAndroid Build Coastguard Worker RETURN_CAPABILITY(audio_utils::AudioFlinger_ClientMutex) { 284*ec779b8eSAndroid Build Coastguard Worker return mClientMutex; 285*ec779b8eSAndroid Build Coastguard Worker } 286*ec779b8eSAndroid Build Coastguard Worker void removeClient_l(pid_t pid) REQUIRES(clientMutex()) final; 287*ec779b8eSAndroid Build Coastguard Worker void removeNotificationClient(pid_t pid) final EXCLUDES_AudioFlinger_Mutex; 288*ec779b8eSAndroid Build Coastguard Worker status_t moveAuxEffectToIo( 289*ec779b8eSAndroid Build Coastguard Worker int effectId, 290*ec779b8eSAndroid Build Coastguard Worker const sp<IAfPlaybackThread>& dstThread, 291*ec779b8eSAndroid Build Coastguard Worker sp<IAfPlaybackThread>* srcThread) final EXCLUDES_AudioFlinger_Mutex; 292*ec779b8eSAndroid Build Coastguard Worker 293*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAfClientCallback interface 294*ec779b8eSAndroid Build Coastguard Worker 295*ec779b8eSAndroid Build Coastguard Worker // ---- begin IAfDeviceEffectManagerCallback interface 296*ec779b8eSAndroid Build Coastguard Worker 297*ec779b8eSAndroid Build Coastguard Worker // also used by IAfThreadCallback isAudioPolicyReady()298*ec779b8eSAndroid Build Coastguard Worker bool isAudioPolicyReady() const final { return mAudioPolicyReady.load(); } 299*ec779b8eSAndroid Build Coastguard Worker // below also used by IAfMelReporterCallback, IAfPatchPanelCallback getPatchCommandThread()300*ec779b8eSAndroid Build Coastguard Worker const sp<PatchCommandThread>& getPatchCommandThread() final { return mPatchCommandThread; } 301*ec779b8eSAndroid Build Coastguard Worker status_t addEffectToHal( 302*ec779b8eSAndroid Build Coastguard Worker const struct audio_port_config* device, const sp<EffectHalInterface>& effect) final 303*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_HardwareMutex; 304*ec779b8eSAndroid Build Coastguard Worker status_t removeEffectFromHal( 305*ec779b8eSAndroid Build Coastguard Worker const struct audio_port_config* device, const sp<EffectHalInterface>& effect) final 306*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_HardwareMutex; 307*ec779b8eSAndroid Build Coastguard Worker 308*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAfDeviceEffectManagerCallback interface 309*ec779b8eSAndroid Build Coastguard Worker 310*ec779b8eSAndroid Build Coastguard Worker // ---- begin IAfMelReporterCallback interface 311*ec779b8eSAndroid Build Coastguard Worker 312*ec779b8eSAndroid Build Coastguard Worker // below also used by IAfThreadCallback mutex()313*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& mutex() const final 314*ec779b8eSAndroid Build Coastguard Worker RETURN_CAPABILITY(audio_utils::AudioFlinger_Mutex) 315*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_BELOW_AudioFlinger_Mutex { return mMutex; } 316*ec779b8eSAndroid Build Coastguard Worker sp<IAfThreadBase> checkOutputThread_l(audio_io_handle_t ioHandle) const final 317*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 318*ec779b8eSAndroid Build Coastguard Worker 319*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAfMelReporterCallback interface 320*ec779b8eSAndroid Build Coastguard Worker 321*ec779b8eSAndroid Build Coastguard Worker // ---- begin IAfPatchPanelCallback interface 322*ec779b8eSAndroid Build Coastguard Worker 323*ec779b8eSAndroid Build Coastguard Worker void closeThreadInternal_l(const sp<IAfPlaybackThread>& thread) final REQUIRES(mutex()); 324*ec779b8eSAndroid Build Coastguard Worker void closeThreadInternal_l(const sp<IAfRecordThread>& thread) final REQUIRES(mutex()); 325*ec779b8eSAndroid Build Coastguard Worker // return thread associated with primary hardware device, or NULL 326*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* primaryPlaybackThread_l() const final REQUIRES(mutex()); 327*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* checkPlaybackThread_l(audio_io_handle_t output) const final 328*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 329*ec779b8eSAndroid Build Coastguard Worker IAfRecordThread* checkRecordThread_l(audio_io_handle_t input) const final REQUIRES(mutex()); 330*ec779b8eSAndroid Build Coastguard Worker IAfMmapThread* checkMmapThread_l(audio_io_handle_t io) const final REQUIRES(mutex()); 331*ec779b8eSAndroid Build Coastguard Worker sp<IAfThreadBase> openInput_l(audio_module_handle_t module, 332*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t* input, 333*ec779b8eSAndroid Build Coastguard Worker audio_config_t* config, 334*ec779b8eSAndroid Build Coastguard Worker audio_devices_t device, 335*ec779b8eSAndroid Build Coastguard Worker const char* address, 336*ec779b8eSAndroid Build Coastguard Worker audio_source_t source, 337*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags, 338*ec779b8eSAndroid Build Coastguard Worker audio_devices_t outputDevice, 339*ec779b8eSAndroid Build Coastguard Worker const String8& outputDeviceAddress) final REQUIRES(mutex()); 340*ec779b8eSAndroid Build Coastguard Worker sp<IAfThreadBase> openOutput_l(audio_module_handle_t module, 341*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t* output, 342*ec779b8eSAndroid Build Coastguard Worker audio_config_t* halConfig, 343*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t* mixerConfig, 344*ec779b8eSAndroid Build Coastguard Worker audio_devices_t deviceType, 345*ec779b8eSAndroid Build Coastguard Worker const String8& address, 346*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t* flags, 347*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t attributes) final REQUIRES(mutex()); 348*ec779b8eSAndroid Build Coastguard Worker const DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>& getAudioHwDevs_l()349*ec779b8eSAndroid Build Coastguard Worker getAudioHwDevs_l() const final REQUIRES(mutex(), hardwareMutex()) { 350*ec779b8eSAndroid Build Coastguard Worker return mAudioHwDevs; 351*ec779b8eSAndroid Build Coastguard Worker } 352*ec779b8eSAndroid Build Coastguard Worker void updateDownStreamPatches_l(const struct audio_patch* patch, 353*ec779b8eSAndroid Build Coastguard Worker const std::set<audio_io_handle_t>& streams) final REQUIRES(mutex()); 354*ec779b8eSAndroid Build Coastguard Worker void updateOutDevicesForRecordThreads_l(const DeviceDescriptorBaseVector& devices) final 355*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 356*ec779b8eSAndroid Build Coastguard Worker 357*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAfPatchPanelCallback interface 358*ec779b8eSAndroid Build Coastguard Worker 359*ec779b8eSAndroid Build Coastguard Worker // ----- begin IAfThreadCallback interface 360*ec779b8eSAndroid Build Coastguard Worker 361*ec779b8eSAndroid Build Coastguard Worker bool isNonOffloadableGlobalEffectEnabled_l() const final 362*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()) EXCLUDES_ThreadBase_Mutex; btNrecIsOff()363*ec779b8eSAndroid Build Coastguard Worker bool btNrecIsOff() const final { return mBtNrecIsOff.load(); } 364*ec779b8eSAndroid Build Coastguard Worker float masterVolume_l() const final REQUIRES(mutex()); 365*ec779b8eSAndroid Build Coastguard Worker bool masterMute_l() const final REQUIRES(mutex()); 366*ec779b8eSAndroid Build Coastguard Worker float getMasterBalance_l() const REQUIRES(mutex()); 367*ec779b8eSAndroid Build Coastguard Worker // no range check, AudioFlinger::mutex() held streamMute_l(audio_stream_type_t stream)368*ec779b8eSAndroid Build Coastguard Worker bool streamMute_l(audio_stream_type_t stream) const final REQUIRES(mutex()) { 369*ec779b8eSAndroid Build Coastguard Worker return mStreamTypes[stream].mute; 370*ec779b8eSAndroid Build Coastguard Worker } getMode()371*ec779b8eSAndroid Build Coastguard Worker audio_mode_t getMode() const final { return mMode; } isLowRamDevice()372*ec779b8eSAndroid Build Coastguard Worker bool isLowRamDevice() const final { return mIsLowRamDevice; } getScreenState()373*ec779b8eSAndroid Build Coastguard Worker uint32_t getScreenState() const final { return mScreenState; } 374*ec779b8eSAndroid Build Coastguard Worker 375*ec779b8eSAndroid Build Coastguard Worker std::optional<media::AudioVibratorInfo> getDefaultVibratorInfo_l() const final 376*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); getPatchPanel()377*ec779b8eSAndroid Build Coastguard Worker const sp<IAfPatchPanel>& getPatchPanel() const final { return mPatchPanel; } getMelReporter()378*ec779b8eSAndroid Build Coastguard Worker const sp<MelReporter>& getMelReporter() const final { return mMelReporter; } getEffectsFactoryHal()379*ec779b8eSAndroid Build Coastguard Worker const sp<EffectsFactoryHalInterface>& getEffectsFactoryHal() const final { 380*ec779b8eSAndroid Build Coastguard Worker return mEffectsFactoryHal; 381*ec779b8eSAndroid Build Coastguard Worker } 382*ec779b8eSAndroid Build Coastguard Worker sp<IAudioManager> getOrCreateAudioManager() final; 383*ec779b8eSAndroid Build Coastguard Worker 384*ec779b8eSAndroid Build Coastguard Worker // Called when the last effect handle on an effect instance is removed. If this 385*ec779b8eSAndroid Build Coastguard Worker // effect belongs to an effect chain in mOrphanEffectChains, the chain is updated 386*ec779b8eSAndroid Build Coastguard Worker // and removed from mOrphanEffectChains if it does not contain any effect. 387*ec779b8eSAndroid Build Coastguard Worker // Return true if the effect was found in mOrphanEffectChains, false otherwise. 388*ec779b8eSAndroid Build Coastguard Worker bool updateOrphanEffectChains(const sp<IAfEffectModule>& effect) final 389*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 390*ec779b8eSAndroid Build Coastguard Worker 391*ec779b8eSAndroid Build Coastguard Worker status_t moveEffectChain_ll(audio_session_t sessionId, 392*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* srcThread, IAfPlaybackThread* dstThread, 393*ec779b8eSAndroid Build Coastguard Worker IAfEffectChain* srcChain = nullptr) final 394*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex(), audio_utils::ThreadBase_Mutex); 395*ec779b8eSAndroid Build Coastguard Worker 396*ec779b8eSAndroid Build Coastguard Worker // This is a helper that is called during incoming binder calls. 397*ec779b8eSAndroid Build Coastguard Worker // Requests media.log to start merging log buffers 398*ec779b8eSAndroid Build Coastguard Worker void requestLogMerge() final; 399*ec779b8eSAndroid Build Coastguard Worker sp<NBLog::Writer> newWriter_l(size_t size, const char *name) final REQUIRES(mutex()); 400*ec779b8eSAndroid Build Coastguard Worker void unregisterWriter(const sp<NBLog::Writer>& writer) final; 401*ec779b8eSAndroid Build Coastguard Worker 402*ec779b8eSAndroid Build Coastguard Worker sp<audioflinger::SyncEvent> createSyncEvent(AudioSystem::sync_event_t type, 403*ec779b8eSAndroid Build Coastguard Worker audio_session_t triggerSession, 404*ec779b8eSAndroid Build Coastguard Worker audio_session_t listenerSession, 405*ec779b8eSAndroid Build Coastguard Worker const audioflinger::SyncEventCallback& callBack, 406*ec779b8eSAndroid Build Coastguard Worker const wp<IAfTrackBase>& cookie) final EXCLUDES_AudioFlinger_Mutex; 407*ec779b8eSAndroid Build Coastguard Worker 408*ec779b8eSAndroid Build Coastguard Worker // Hold either AudioFlinger::mutex or ThreadBase::mutex 409*ec779b8eSAndroid Build Coastguard Worker void ioConfigChanged_l(audio_io_config_event_t event, 410*ec779b8eSAndroid Build Coastguard Worker const sp<AudioIoDescriptor>& ioDesc, 411*ec779b8eSAndroid Build Coastguard Worker pid_t pid = 0) final EXCLUDES_AudioFlinger_ClientMutex; 412*ec779b8eSAndroid Build Coastguard Worker void onNonOffloadableGlobalEffectEnable() final EXCLUDES_AudioFlinger_Mutex; 413*ec779b8eSAndroid Build Coastguard Worker void onSupportedLatencyModesChanged( 414*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, const std::vector<audio_latency_mode_t>& modes) final 415*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_ClientMutex; 416*ec779b8eSAndroid Build Coastguard Worker void onHardError(std::set<audio_port_handle_t>& trackPortIds) final 417*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_ClientMutex; 418*ec779b8eSAndroid Build Coastguard Worker 419*ec779b8eSAndroid Build Coastguard Worker const ::com::android::media::permission::IPermissionProvider& getPermissionProvider() final; 420*ec779b8eSAndroid Build Coastguard Worker 421*ec779b8eSAndroid Build Coastguard Worker // ---- end of IAfThreadCallback interface 422*ec779b8eSAndroid Build Coastguard Worker 423*ec779b8eSAndroid Build Coastguard Worker /* List available audio ports and their attributes */ 424*ec779b8eSAndroid Build Coastguard Worker status_t listAudioPorts(unsigned int* num_ports, struct audio_port* ports) const 425*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_Mutex; 426*ec779b8eSAndroid Build Coastguard Worker 427*ec779b8eSAndroid Build Coastguard Worker sp<EffectsFactoryHalInterface> getEffectsFactory(); 428*ec779b8eSAndroid Build Coastguard Worker getStartupFinishedTime()429*ec779b8eSAndroid Build Coastguard Worker int64_t getStartupFinishedTime() { 430*ec779b8eSAndroid Build Coastguard Worker return mStartupFinishedTime.load(std::memory_order_acquire); 431*ec779b8eSAndroid Build Coastguard Worker } 432*ec779b8eSAndroid Build Coastguard Worker 433*ec779b8eSAndroid Build Coastguard Worker public: 434*ec779b8eSAndroid Build Coastguard Worker // TODO(b/292281786): Remove this when Oboeservice can get access to 435*ec779b8eSAndroid Build Coastguard Worker // openMmapStream through an IAudioFlinger handle directly. 436*ec779b8eSAndroid Build Coastguard Worker static inline std::atomic<AudioFlinger*> gAudioFlinger = nullptr; 437*ec779b8eSAndroid Build Coastguard Worker 438*ec779b8eSAndroid Build Coastguard Worker status_t openMmapStream(MmapStreamInterface::stream_direction_t direction, 439*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t *attr, 440*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t *config, 441*ec779b8eSAndroid Build Coastguard Worker const AudioClient& client, 442*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector *deviceIds, 443*ec779b8eSAndroid Build Coastguard Worker audio_session_t *sessionId, 444*ec779b8eSAndroid Build Coastguard Worker const sp<MmapStreamCallback>& callback, 445*ec779b8eSAndroid Build Coastguard Worker sp<MmapStreamInterface>& interface, 446*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t *handle) EXCLUDES_AudioFlinger_Mutex; 447*ec779b8eSAndroid Build Coastguard Worker initAudioPolicyLocal(sp<media::IAudioPolicyServiceLocal> audioPolicyLocal)448*ec779b8eSAndroid Build Coastguard Worker void initAudioPolicyLocal(sp<media::IAudioPolicyServiceLocal> audioPolicyLocal) { 449*ec779b8eSAndroid Build Coastguard Worker if (mAudioPolicyServiceLocal.load() == nullptr) { 450*ec779b8eSAndroid Build Coastguard Worker mAudioPolicyServiceLocal = std::move(audioPolicyLocal); 451*ec779b8eSAndroid Build Coastguard Worker } 452*ec779b8eSAndroid Build Coastguard Worker } 453*ec779b8eSAndroid Build Coastguard Worker 454*ec779b8eSAndroid Build Coastguard Worker private: 455*ec779b8eSAndroid Build Coastguard Worker // FIXME The 400 is temporarily too high until a leak of writers in media.log is fixed. 456*ec779b8eSAndroid Build Coastguard Worker static const size_t kLogMemorySize = 400 * 1024; 457*ec779b8eSAndroid Build Coastguard Worker sp<MemoryDealer> mLogMemoryDealer; // == 0 when NBLog is disabled 458*ec779b8eSAndroid Build Coastguard Worker // When a log writer is unregistered, it is done lazily so that media.log can continue to see it 459*ec779b8eSAndroid Build Coastguard Worker // for as long as possible. The memory is only freed when it is needed for another log writer. 460*ec779b8eSAndroid Build Coastguard Worker Vector< sp<NBLog::Writer> > mUnregisteredWriters; unregisteredWritersMutex()461*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& unregisteredWritersMutex() const { return mUnregisteredWritersMutex; } 462*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mUnregisteredWritersMutex{ 463*ec779b8eSAndroid Build Coastguard Worker audio_utils::MutexOrder::kAudioFlinger_UnregisteredWritersMutex}; 464*ec779b8eSAndroid Build Coastguard Worker 465*ec779b8eSAndroid Build Coastguard Worker AudioFlinger() ANDROID_API; 466*ec779b8eSAndroid Build Coastguard Worker ~AudioFlinger() override; 467*ec779b8eSAndroid Build Coastguard Worker 468*ec779b8eSAndroid Build Coastguard Worker // call in any IAudioFlinger method that accesses mPrimaryHardwareDev initCheck()469*ec779b8eSAndroid Build Coastguard Worker status_t initCheck() const { return mPrimaryHardwareDev == NULL ? 470*ec779b8eSAndroid Build Coastguard Worker NO_INIT : NO_ERROR; } 471*ec779b8eSAndroid Build Coastguard Worker 472*ec779b8eSAndroid Build Coastguard Worker // RefBase 473*ec779b8eSAndroid Build Coastguard Worker void onFirstRef() override; 474*ec779b8eSAndroid Build Coastguard Worker 475*ec779b8eSAndroid Build Coastguard Worker AudioHwDevice* findSuitableHwDev_l(audio_module_handle_t module, 476*ec779b8eSAndroid Build Coastguard Worker audio_devices_t deviceType) REQUIRES(mutex()); 477*ec779b8eSAndroid Build Coastguard Worker 478*ec779b8eSAndroid Build Coastguard Worker // incremented by 2 when screen state changes, bit 0 == 1 means "off" 479*ec779b8eSAndroid Build Coastguard Worker // AudioFlinger::setParameters() updates with mutex(). 480*ec779b8eSAndroid Build Coastguard Worker std::atomic_uint32_t mScreenState{}; 481*ec779b8eSAndroid Build Coastguard Worker 482*ec779b8eSAndroid Build Coastguard Worker void dumpPermissionDenial(int fd); 483*ec779b8eSAndroid Build Coastguard Worker void dumpClients_ll(int fd, bool dumpAllocators) REQUIRES(mutex(), clientMutex()); 484*ec779b8eSAndroid Build Coastguard Worker void dumpInternals_l(int fd) REQUIRES(mutex()); 485*ec779b8eSAndroid Build Coastguard Worker void dumpStats(int fd); 486*ec779b8eSAndroid Build Coastguard Worker 487*ec779b8eSAndroid Build Coastguard Worker SimpleLog mThreadLog{16}; // 16 Thread history limit 488*ec779b8eSAndroid Build Coastguard Worker 489*ec779b8eSAndroid Build Coastguard Worker void dumpToThreadLog_l(const sp<IAfThreadBase>& thread) REQUIRES(mutex()); 490*ec779b8eSAndroid Build Coastguard Worker 491*ec779b8eSAndroid Build Coastguard Worker // --- Notification Client --- 492*ec779b8eSAndroid Build Coastguard Worker class NotificationClient : public IBinder::DeathRecipient { 493*ec779b8eSAndroid Build Coastguard Worker public: 494*ec779b8eSAndroid Build Coastguard Worker NotificationClient(const sp<AudioFlinger>& audioFlinger, 495*ec779b8eSAndroid Build Coastguard Worker const sp<media::IAudioFlingerClient>& client, 496*ec779b8eSAndroid Build Coastguard Worker pid_t pid, 497*ec779b8eSAndroid Build Coastguard Worker uid_t uid); 498*ec779b8eSAndroid Build Coastguard Worker virtual ~NotificationClient(); 499*ec779b8eSAndroid Build Coastguard Worker audioFlingerClient()500*ec779b8eSAndroid Build Coastguard Worker sp<media::IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } getPid()501*ec779b8eSAndroid Build Coastguard Worker pid_t getPid() const { return mPid; } getUid()502*ec779b8eSAndroid Build Coastguard Worker uid_t getUid() const { return mUid; } 503*ec779b8eSAndroid Build Coastguard Worker 504*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient 505*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 506*ec779b8eSAndroid Build Coastguard Worker 507*ec779b8eSAndroid Build Coastguard Worker private: 508*ec779b8eSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(NotificationClient); 509*ec779b8eSAndroid Build Coastguard Worker 510*ec779b8eSAndroid Build Coastguard Worker const sp<AudioFlinger> mAudioFlinger; 511*ec779b8eSAndroid Build Coastguard Worker const pid_t mPid; 512*ec779b8eSAndroid Build Coastguard Worker const uid_t mUid; 513*ec779b8eSAndroid Build Coastguard Worker const sp<media::IAudioFlingerClient> mAudioFlingerClient; 514*ec779b8eSAndroid Build Coastguard Worker const std::unique_ptr<media::psh_utils::Token> mClientToken; 515*ec779b8eSAndroid Build Coastguard Worker }; 516*ec779b8eSAndroid Build Coastguard Worker 517*ec779b8eSAndroid Build Coastguard Worker // --- MediaLogNotifier --- 518*ec779b8eSAndroid Build Coastguard Worker // Thread in charge of notifying MediaLogService to start merging. 519*ec779b8eSAndroid Build Coastguard Worker // Receives requests from AudioFlinger's binder activity. It is used to reduce the amount of 520*ec779b8eSAndroid Build Coastguard Worker // binder calls to MediaLogService in case of bursts of AudioFlinger binder calls. 521*ec779b8eSAndroid Build Coastguard Worker class MediaLogNotifier : public Thread { 522*ec779b8eSAndroid Build Coastguard Worker public: 523*ec779b8eSAndroid Build Coastguard Worker MediaLogNotifier(); 524*ec779b8eSAndroid Build Coastguard Worker 525*ec779b8eSAndroid Build Coastguard Worker // Requests a MediaLogService notification. It's ignored if there has recently been another 526*ec779b8eSAndroid Build Coastguard Worker void requestMerge(); 527*ec779b8eSAndroid Build Coastguard Worker private: 528*ec779b8eSAndroid Build Coastguard Worker // Every iteration blocks waiting for a request, then interacts with MediaLogService to 529*ec779b8eSAndroid Build Coastguard Worker // start merging. 530*ec779b8eSAndroid Build Coastguard Worker // As every MediaLogService binder call is expensive, once it gets a request it ignores the 531*ec779b8eSAndroid Build Coastguard Worker // following ones for a period of time. 532*ec779b8eSAndroid Build Coastguard Worker virtual bool threadLoop() override; 533*ec779b8eSAndroid Build Coastguard Worker 534*ec779b8eSAndroid Build Coastguard Worker bool mPendingRequests; 535*ec779b8eSAndroid Build Coastguard Worker 536*ec779b8eSAndroid Build Coastguard Worker // Mutex and condition variable around mPendingRequests' value 537*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex mMutex{audio_utils::MutexOrder::kMediaLogNotifier_Mutex}; 538*ec779b8eSAndroid Build Coastguard Worker audio_utils::condition_variable mCondition; 539*ec779b8eSAndroid Build Coastguard Worker 540*ec779b8eSAndroid Build Coastguard Worker // Duration of the sleep period after a processed request 541*ec779b8eSAndroid Build Coastguard Worker static const int kPostTriggerSleepPeriod = 1000000; 542*ec779b8eSAndroid Build Coastguard Worker }; 543*ec779b8eSAndroid Build Coastguard Worker 544*ec779b8eSAndroid Build Coastguard Worker const sp<MediaLogNotifier> mMediaLogNotifier = sp<MediaLogNotifier>::make(); 545*ec779b8eSAndroid Build Coastguard Worker 546*ec779b8eSAndroid Build Coastguard Worker // Find io handle by session id. 547*ec779b8eSAndroid Build Coastguard Worker // Preference is given to an io handle with a matching effect chain to session id. 548*ec779b8eSAndroid Build Coastguard Worker // If none found, AUDIO_IO_HANDLE_NONE is returned. 549*ec779b8eSAndroid Build Coastguard Worker template <typename T> findIoHandleBySessionId_l(audio_session_t sessionId,const T & threads)550*ec779b8eSAndroid Build Coastguard Worker static audio_io_handle_t findIoHandleBySessionId_l( 551*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, const T& threads) 552*ec779b8eSAndroid Build Coastguard Worker REQUIRES(audio_utils::AudioFlinger_Mutex) { 553*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t io = AUDIO_IO_HANDLE_NONE; 554*ec779b8eSAndroid Build Coastguard Worker 555*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < threads.size(); i++) { 556*ec779b8eSAndroid Build Coastguard Worker const uint32_t sessionType = threads.valueAt(i)->hasAudioSession(sessionId); 557*ec779b8eSAndroid Build Coastguard Worker if (sessionType != 0) { 558*ec779b8eSAndroid Build Coastguard Worker io = threads.keyAt(i); 559*ec779b8eSAndroid Build Coastguard Worker if ((sessionType & IAfThreadBase::EFFECT_SESSION) != 0) { 560*ec779b8eSAndroid Build Coastguard Worker break; // effect chain here. 561*ec779b8eSAndroid Build Coastguard Worker } 562*ec779b8eSAndroid Build Coastguard Worker } 563*ec779b8eSAndroid Build Coastguard Worker } 564*ec779b8eSAndroid Build Coastguard Worker return io; 565*ec779b8eSAndroid Build Coastguard Worker } 566*ec779b8eSAndroid Build Coastguard Worker 567*ec779b8eSAndroid Build Coastguard Worker IAfThreadBase* checkThread_l(audio_io_handle_t ioHandle) const REQUIRES(mutex()); 568*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* checkMixerThread_l(audio_io_handle_t output) const REQUIRES(mutex()); 569*ec779b8eSAndroid Build Coastguard Worker 570*ec779b8eSAndroid Build Coastguard Worker sp<VolumeInterface> getVolumeInterface_l(audio_io_handle_t output) const REQUIRES(mutex()); 571*ec779b8eSAndroid Build Coastguard Worker 572*ec779b8eSAndroid Build Coastguard Worker std::vector<sp<VolumeInterface>> getAllVolumeInterfaces_l() const REQUIRES(mutex()); 573*ec779b8eSAndroid Build Coastguard Worker 574*ec779b8eSAndroid Build Coastguard Worker 575*ec779b8eSAndroid Build Coastguard Worker static void closeOutputFinish(const sp<IAfPlaybackThread>& thread); 576*ec779b8eSAndroid Build Coastguard Worker void closeInputFinish(const sp<IAfRecordThread>& thread); 577*ec779b8eSAndroid Build Coastguard Worker 578*ec779b8eSAndroid Build Coastguard Worker // Allocate an audio_unique_id_t. 579*ec779b8eSAndroid Build Coastguard Worker // Specific types are audio_io_handle_t, audio_session_t, effect ID (int), 580*ec779b8eSAndroid Build Coastguard Worker // audio_module_handle_t, and audio_patch_handle_t. 581*ec779b8eSAndroid Build Coastguard Worker // They all share the same ID space, but the namespaces are actually independent 582*ec779b8eSAndroid Build Coastguard Worker // because there are separate KeyedVectors for each kind of ID. 583*ec779b8eSAndroid Build Coastguard Worker // The return value is cast to the specific type depending on how the ID will be used. 584*ec779b8eSAndroid Build Coastguard Worker // FIXME This API does not handle rollover to zero (for unsigned IDs), 585*ec779b8eSAndroid Build Coastguard Worker // or from positive to negative (for signed IDs). 586*ec779b8eSAndroid Build Coastguard Worker // Thus it may fail by returning an ID of the wrong sign, 587*ec779b8eSAndroid Build Coastguard Worker // or by returning a non-unique ID. 588*ec779b8eSAndroid Build Coastguard Worker // This is the internal API. For the binder API see newAudioUniqueId(). 589*ec779b8eSAndroid Build Coastguard Worker // used by IAfDeviceEffectManagerCallback, IAfPatchPanelCallback, IAfThreadCallback 590*ec779b8eSAndroid Build Coastguard Worker audio_unique_id_t nextUniqueId(audio_unique_id_use_t use) final; 591*ec779b8eSAndroid Build Coastguard Worker 592*ec779b8eSAndroid Build Coastguard Worker status_t moveEffectChain_ll(audio_session_t sessionId, 593*ec779b8eSAndroid Build Coastguard Worker IAfRecordThread* srcThread, IAfRecordThread* dstThread) 594*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex(), audio_utils::ThreadBase_Mutex); 595*ec779b8eSAndroid Build Coastguard Worker 596*ec779b8eSAndroid Build Coastguard Worker // return thread associated with primary hardware device, or NULL 597*ec779b8eSAndroid Build Coastguard Worker DeviceTypeSet primaryOutputDevice_l() const REQUIRES(mutex()); 598*ec779b8eSAndroid Build Coastguard Worker 599*ec779b8eSAndroid Build Coastguard Worker // return the playback thread with smallest HAL buffer size, and prefer fast 600*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* fastPlaybackThread_l() const REQUIRES(mutex()); 601*ec779b8eSAndroid Build Coastguard Worker 602*ec779b8eSAndroid Build Coastguard Worker sp<IAfThreadBase> getEffectThread_l(audio_session_t sessionId, int effectId) 603*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 604*ec779b8eSAndroid Build Coastguard Worker 605*ec779b8eSAndroid Build Coastguard Worker IAfThreadBase* hapticPlaybackThread_l() const REQUIRES(mutex()); 606*ec779b8eSAndroid Build Coastguard Worker 607*ec779b8eSAndroid Build Coastguard Worker void updateSecondaryOutputsForTrack_l( 608*ec779b8eSAndroid Build Coastguard Worker IAfTrack* track, 609*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* thread, 610*ec779b8eSAndroid Build Coastguard Worker const std::vector<audio_io_handle_t>& secondaryOutputs) const REQUIRES(mutex()); 611*ec779b8eSAndroid Build Coastguard Worker 612*ec779b8eSAndroid Build Coastguard Worker bool isSessionAcquired_l(audio_session_t audioSession) REQUIRES(mutex()); 613*ec779b8eSAndroid Build Coastguard Worker 614*ec779b8eSAndroid Build Coastguard Worker // Store an effect chain to mOrphanEffectChains keyed vector. 615*ec779b8eSAndroid Build Coastguard Worker // Called when a thread exits and effects are still attached to it. 616*ec779b8eSAndroid Build Coastguard Worker // If effects are later created on the same session, they will reuse the same 617*ec779b8eSAndroid Build Coastguard Worker // effect chain and same instances in the effect library. 618*ec779b8eSAndroid Build Coastguard Worker // return ALREADY_EXISTS if a chain with the same session already exists in 619*ec779b8eSAndroid Build Coastguard Worker // mOrphanEffectChains. Note that this should never happen as there is only one 620*ec779b8eSAndroid Build Coastguard Worker // chain for a given session and it is attached to only one thread at a time. 621*ec779b8eSAndroid Build Coastguard Worker status_t putOrphanEffectChain_l(const sp<IAfEffectChain>& chain) REQUIRES(mutex()); 622*ec779b8eSAndroid Build Coastguard Worker // Get an effect chain for the specified session in mOrphanEffectChains and remove 623*ec779b8eSAndroid Build Coastguard Worker // it if found. Returns 0 if not found (this is the most common case). 624*ec779b8eSAndroid Build Coastguard Worker sp<IAfEffectChain> getOrphanEffectChain_l(audio_session_t session) REQUIRES(mutex()); 625*ec779b8eSAndroid Build Coastguard Worker 626*ec779b8eSAndroid Build Coastguard Worker std::vector< sp<IAfEffectModule> > purgeStaleEffects_l() REQUIRES(mutex()); 627*ec779b8eSAndroid Build Coastguard Worker 628*ec779b8eSAndroid Build Coastguard Worker std::vector< sp<IAfEffectModule> > purgeOrphanEffectChains_l() REQUIRES(mutex()); 629*ec779b8eSAndroid Build Coastguard Worker bool updateOrphanEffectChains_l(const sp<IAfEffectModule>& effect) REQUIRES(mutex()); 630*ec779b8eSAndroid Build Coastguard Worker 631*ec779b8eSAndroid Build Coastguard Worker void broadcastParametersToRecordThreads_l(const String8& keyValuePairs) REQUIRES(mutex()); 632*ec779b8eSAndroid Build Coastguard Worker void forwardParametersToDownstreamPatches_l( 633*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t upStream, const String8& keyValuePairs, 634*ec779b8eSAndroid Build Coastguard Worker const std::function<bool(const sp<IAfPlaybackThread>&)>& useThread = nullptr) 635*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 636*ec779b8eSAndroid Build Coastguard Worker 637*ec779b8eSAndroid Build Coastguard Worker // for mAudioSessionRefs only 638*ec779b8eSAndroid Build Coastguard Worker struct AudioSessionRef { AudioSessionRefAudioSessionRef639*ec779b8eSAndroid Build Coastguard Worker AudioSessionRef(audio_session_t sessionid, pid_t pid, uid_t uid) : 640*ec779b8eSAndroid Build Coastguard Worker mSessionid(sessionid), mPid(pid), mUid(uid), mCnt(1) {} 641*ec779b8eSAndroid Build Coastguard Worker const audio_session_t mSessionid; 642*ec779b8eSAndroid Build Coastguard Worker const pid_t mPid; 643*ec779b8eSAndroid Build Coastguard Worker const uid_t mUid; 644*ec779b8eSAndroid Build Coastguard Worker int mCnt; 645*ec779b8eSAndroid Build Coastguard Worker }; 646*ec779b8eSAndroid Build Coastguard Worker 647*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioFlinger_Mutex}; 648*ec779b8eSAndroid Build Coastguard Worker // protects mClients and mNotificationClients. 649*ec779b8eSAndroid Build Coastguard Worker // must be locked after mutex() and ThreadBase::mutex() if both must be locked 650*ec779b8eSAndroid Build Coastguard Worker // avoids acquiring AudioFlinger::mutex() from inside thread loop. 651*ec779b8eSAndroid Build Coastguard Worker 652*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mClientMutex{audio_utils::MutexOrder::kAudioFlinger_ClientMutex}; 653*ec779b8eSAndroid Build Coastguard Worker 654*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<pid_t, wp<Client>> mClients GUARDED_BY(clientMutex()); // see ~Client() 655*ec779b8eSAndroid Build Coastguard Worker hardwareMutex()656*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& hardwareMutex() const { return mHardwareMutex; } 657*ec779b8eSAndroid Build Coastguard Worker 658*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mHardwareMutex{ 659*ec779b8eSAndroid Build Coastguard Worker audio_utils::MutexOrder::kAudioFlinger_HardwareMutex}; 660*ec779b8eSAndroid Build Coastguard Worker // NOTE: If both mMutex and mHardwareMutex mutexes must be held, 661*ec779b8eSAndroid Build Coastguard Worker // always take mMutex before mHardwareMutex 662*ec779b8eSAndroid Build Coastguard Worker 663*ec779b8eSAndroid Build Coastguard Worker std::atomic<AudioHwDevice*> mPrimaryHardwareDev = nullptr; 664*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*> mAudioHwDevs GUARDED_BY(hardwareMutex ())665*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(hardwareMutex()) {nullptr /* defValue */}; 666*ec779b8eSAndroid Build Coastguard Worker 667*ec779b8eSAndroid Build Coastguard Worker static bool inputBufferSizeDevsCmp(const AudioHwDevice* lhs, const AudioHwDevice* rhs); 668*ec779b8eSAndroid Build Coastguard Worker std::set<AudioHwDevice*, decltype(&inputBufferSizeDevsCmp)> GUARDED_BY(hardwareMutex ())669*ec779b8eSAndroid Build Coastguard Worker mInputBufferSizeOrderedDevs GUARDED_BY(hardwareMutex()) {inputBufferSizeDevsCmp}; 670*ec779b8eSAndroid Build Coastguard Worker 671*ec779b8eSAndroid Build Coastguard Worker const sp<DevicesFactoryHalInterface> mDevicesFactoryHal = 672*ec779b8eSAndroid Build Coastguard Worker DevicesFactoryHalInterface::create(); 673*ec779b8eSAndroid Build Coastguard Worker /* const */ sp<DevicesFactoryHalCallback> mDevicesFactoryHalCallback; // set onFirstRef(). 674*ec779b8eSAndroid Build Coastguard Worker 675*ec779b8eSAndroid Build Coastguard Worker // for dump, indicates which hardware operation is currently in progress (but not stream ops) 676*ec779b8eSAndroid Build Coastguard Worker enum hardware_call_state { 677*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_IDLE = 0, // no operation in progress 678*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_INIT, // init_check 679*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_OUTPUT_OPEN, // open_output_stream 680*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_OUTPUT_CLOSE, // unused 681*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_INPUT_OPEN, // unused 682*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_INPUT_CLOSE, // unused 683*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_STANDBY, // unused 684*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_MASTER_VOLUME, // set_master_volume 685*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_ROUTING, // unused 686*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_ROUTING, // unused 687*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_MODE, // unused 688*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_MODE, // set_mode 689*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_MIC_MUTE, // get_mic_mute 690*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_MIC_MUTE, // set_mic_mute 691*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_VOICE_VOLUME, // set_voice_volume 692*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_PARAMETER, // set_parameters 693*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size 694*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_MASTER_VOLUME, // get_master_volume 695*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_PARAMETER, // get_parameters 696*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_MASTER_MUTE, // set_master_mute 697*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_MASTER_MUTE, // get_master_mute 698*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_GET_MICROPHONES, // getMicrophones 699*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_CONNECTED_STATE, // setConnectedState 700*ec779b8eSAndroid Build Coastguard Worker AUDIO_HW_SET_SIMULATE_CONNECTIONS, // setSimulateDeviceConnections 701*ec779b8eSAndroid Build Coastguard Worker }; 702*ec779b8eSAndroid Build Coastguard Worker 703*ec779b8eSAndroid Build Coastguard Worker mutable hardware_call_state mHardwareStatus = AUDIO_HW_IDLE; // for dump only 704*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_io_handle_t, sp<IAfPlaybackThread>> mPlaybackThreads 705*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mutex()); 706*ec779b8eSAndroid Build Coastguard Worker stream_type_t mStreamTypes[AUDIO_STREAM_CNT] GUARDED_BY(mutex()); 707*ec779b8eSAndroid Build Coastguard Worker 708*ec779b8eSAndroid Build Coastguard Worker float mMasterVolume GUARDED_BY(mutex()) = 1.f; 709*ec779b8eSAndroid Build Coastguard Worker bool mMasterMute GUARDED_BY(mutex()) = false; 710*ec779b8eSAndroid Build Coastguard Worker float mMasterBalance GUARDED_BY(mutex()) = 0.f; 711*ec779b8eSAndroid Build Coastguard Worker 712*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_io_handle_t, sp<IAfRecordThread>> mRecordThreads GUARDED_BY(mutex()); 713*ec779b8eSAndroid Build Coastguard Worker 714*ec779b8eSAndroid Build Coastguard Worker std::map<pid_t, sp<NotificationClient>> mNotificationClients GUARDED_BY(clientMutex()); 715*ec779b8eSAndroid Build Coastguard Worker 716*ec779b8eSAndroid Build Coastguard Worker // updated by atomic_fetch_add_explicit 717*ec779b8eSAndroid Build Coastguard Worker volatile atomic_uint_fast32_t mNextUniqueIds[AUDIO_UNIQUE_ID_USE_MAX]; // ctor init 718*ec779b8eSAndroid Build Coastguard Worker 719*ec779b8eSAndroid Build Coastguard Worker std::atomic<audio_mode_t> mMode = AUDIO_MODE_INVALID; 720*ec779b8eSAndroid Build Coastguard Worker std::atomic<bool> mBtNrecIsOff = false; 721*ec779b8eSAndroid Build Coastguard Worker 722*ec779b8eSAndroid Build Coastguard Worker Vector<AudioSessionRef*> mAudioSessionRefs GUARDED_BY(mutex()); 723*ec779b8eSAndroid Build Coastguard Worker 724*ec779b8eSAndroid Build Coastguard Worker AudioHwDevice* loadHwModule_ll(const char *name) REQUIRES(mutex(), hardwareMutex()); 725*ec779b8eSAndroid Build Coastguard Worker 726*ec779b8eSAndroid Build Coastguard Worker // sync events awaiting for a session to be created. 727*ec779b8eSAndroid Build Coastguard Worker std::list<sp<audioflinger::SyncEvent>> mPendingSyncEvents GUARDED_BY(mutex()); 728*ec779b8eSAndroid Build Coastguard Worker 729*ec779b8eSAndroid Build Coastguard Worker // Effect chains without a valid thread 730*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_session_t, sp<IAfEffectChain>> mOrphanEffectChains 731*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mutex()); 732*ec779b8eSAndroid Build Coastguard Worker 733*ec779b8eSAndroid Build Coastguard Worker // list of sessions for which a valid HW A/V sync ID was retrieved from the HAL 734*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_session_t, audio_hw_sync_t> mHwAvSyncIds GUARDED_BY(mutex()); 735*ec779b8eSAndroid Build Coastguard Worker 736*ec779b8eSAndroid Build Coastguard Worker // list of MMAP stream control threads. Those threads allow for wake lock, routing 737*ec779b8eSAndroid Build Coastguard Worker // and volume control for activity on the associated MMAP stream at the HAL. 738*ec779b8eSAndroid Build Coastguard Worker // Audio data transfer is directly handled by the client creating the MMAP stream 739*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_io_handle_t, sp<IAfMmapThread>> mMmapThreads GUARDED_BY(mutex()); 740*ec779b8eSAndroid Build Coastguard Worker 741*ec779b8eSAndroid Build Coastguard Worker // always returns non-null 742*ec779b8eSAndroid Build Coastguard Worker sp<Client> registerClient(pid_t pid, uid_t uid) EXCLUDES_AudioFlinger_ClientMutex; 743*ec779b8eSAndroid Build Coastguard Worker 744*ec779b8eSAndroid Build Coastguard Worker sp<IAfEffectHandle> createOrphanEffect_l(const sp<Client>& client, 745*ec779b8eSAndroid Build Coastguard Worker const sp<media::IEffectClient>& effectClient, 746*ec779b8eSAndroid Build Coastguard Worker int32_t priority, 747*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 748*ec779b8eSAndroid Build Coastguard Worker effect_descriptor_t *desc, 749*ec779b8eSAndroid Build Coastguard Worker int *enabled, 750*ec779b8eSAndroid Build Coastguard Worker status_t *status /*non-NULL*/, 751*ec779b8eSAndroid Build Coastguard Worker bool pinned, 752*ec779b8eSAndroid Build Coastguard Worker bool notifyFramesProcessed) REQUIRES(mutex()); 753*ec779b8eSAndroid Build Coastguard Worker 754*ec779b8eSAndroid Build Coastguard Worker // for use from destructor 755*ec779b8eSAndroid Build Coastguard Worker status_t closeOutput_nonvirtual(audio_io_handle_t output) EXCLUDES_AudioFlinger_Mutex; 756*ec779b8eSAndroid Build Coastguard Worker status_t closeInput_nonvirtual(audio_io_handle_t input) EXCLUDES_AudioFlinger_Mutex; 757*ec779b8eSAndroid Build Coastguard Worker void setAudioHwSyncForSession_l(IAfPlaybackThread* thread, audio_session_t sessionId) 758*ec779b8eSAndroid Build Coastguard Worker REQUIRES(mutex()); 759*ec779b8eSAndroid Build Coastguard Worker 760*ec779b8eSAndroid Build Coastguard Worker static status_t checkStreamType(audio_stream_type_t stream); 761*ec779b8eSAndroid Build Coastguard Worker 762*ec779b8eSAndroid Build Coastguard Worker // no mutex needed. 763*ec779b8eSAndroid Build Coastguard Worker void filterReservedParameters(String8& keyValuePairs, uid_t callingUid); 764*ec779b8eSAndroid Build Coastguard Worker void logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs, 765*ec779b8eSAndroid Build Coastguard Worker size_t rejectedKVPSize, const String8& rejectedKVPs, 766*ec779b8eSAndroid Build Coastguard Worker uid_t callingUid); 767*ec779b8eSAndroid Build Coastguard Worker 768*ec779b8eSAndroid Build Coastguard Worker // These methods read variables atomically without mLock, 769*ec779b8eSAndroid Build Coastguard Worker // though the variables are updated with mLock. 770*ec779b8eSAndroid Build Coastguard Worker size_t getClientSharedHeapSize() const; 771*ec779b8eSAndroid Build Coastguard Worker 772*ec779b8eSAndroid Build Coastguard Worker std::atomic<bool> mIsLowRamDevice = true; 773*ec779b8eSAndroid Build Coastguard Worker bool mIsDeviceTypeKnown GUARDED_BY(mutex()) = false; 774*ec779b8eSAndroid Build Coastguard Worker int64_t mTotalMemory GUARDED_BY(mutex()) = 0; 775*ec779b8eSAndroid Build Coastguard Worker std::atomic<size_t> mClientSharedHeapSize = kMinimumClientSharedHeapSizeBytes; 776*ec779b8eSAndroid Build Coastguard Worker static constexpr size_t kMinimumClientSharedHeapSizeBytes = 1024 * 1024; // 1MB 777*ec779b8eSAndroid Build Coastguard Worker 778*ec779b8eSAndroid Build Coastguard Worker /* const */ sp<IAfPatchPanel> mPatchPanel; 779*ec779b8eSAndroid Build Coastguard Worker 780*ec779b8eSAndroid Build Coastguard Worker const sp<EffectsFactoryHalInterface> mEffectsFactoryHal = 781*ec779b8eSAndroid Build Coastguard Worker audioflinger::EffectConfiguration::getEffectsFactoryHal(); 782*ec779b8eSAndroid Build Coastguard Worker 783*ec779b8eSAndroid Build Coastguard Worker const sp<PatchCommandThread> mPatchCommandThread = sp<PatchCommandThread>::make(); 784*ec779b8eSAndroid Build Coastguard Worker /* const */ sp<DeviceEffectManager> mDeviceEffectManager; // set onFirstRef 785*ec779b8eSAndroid Build Coastguard Worker /* const */ sp<MelReporter> mMelReporter; // set onFirstRef 786*ec779b8eSAndroid Build Coastguard Worker 787*ec779b8eSAndroid Build Coastguard Worker bool mSystemReady GUARDED_BY(mutex()) = false; 788*ec779b8eSAndroid Build Coastguard Worker std::atomic<bool> mAudioPolicyReady = false; 789*ec779b8eSAndroid Build Coastguard Worker 790*ec779b8eSAndroid Build Coastguard Worker // no mutex needed. 791*ec779b8eSAndroid Build Coastguard Worker SimpleLog mRejectedSetParameterLog; 792*ec779b8eSAndroid Build Coastguard Worker SimpleLog mAppSetParameterLog; 793*ec779b8eSAndroid Build Coastguard Worker SimpleLog mSystemSetParameterLog; 794*ec779b8eSAndroid Build Coastguard Worker 795*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioVibratorInfo> mAudioVibratorInfos GUARDED_BY(mutex()); 796*ec779b8eSAndroid Build Coastguard Worker 797*ec779b8eSAndroid Build Coastguard Worker static inline constexpr const char *mMetricsId = AMEDIAMETRICS_KEY_AUDIO_FLINGER; 798*ec779b8eSAndroid Build Coastguard Worker 799*ec779b8eSAndroid Build Coastguard Worker std::map<media::audio::common::AudioMMapPolicyType, 800*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioMMapPolicyInfo>> mPolicyInfos 801*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mutex()); 802*ec779b8eSAndroid Build Coastguard Worker int32_t mAAudioBurstsPerBuffer GUARDED_BY(mutex()) = 0; 803*ec779b8eSAndroid Build Coastguard Worker int32_t mAAudioHwBurstMinMicros GUARDED_BY(mutex()) = 0; 804*ec779b8eSAndroid Build Coastguard Worker 805*ec779b8eSAndroid Build Coastguard Worker /** Interface for interacting with the AudioService. */ 806*ec779b8eSAndroid Build Coastguard Worker mediautils::atomic_sp<IAudioManager> mAudioManager; 807*ec779b8eSAndroid Build Coastguard Worker 808*ec779b8eSAndroid Build Coastguard Worker // Bluetooth Variable latency control logic is enabled or disabled 809*ec779b8eSAndroid Build Coastguard Worker std::atomic<bool> mBluetoothLatencyModesEnabled = true; 810*ec779b8eSAndroid Build Coastguard Worker 811*ec779b8eSAndroid Build Coastguard Worker // Local interface to AudioPolicyService, late inited, but logically const 812*ec779b8eSAndroid Build Coastguard Worker mediautils::atomic_sp<media::IAudioPolicyServiceLocal> mAudioPolicyServiceLocal; 813*ec779b8eSAndroid Build Coastguard Worker 814*ec779b8eSAndroid Build Coastguard Worker const int64_t mStartTime = audio_utils_get_real_time_ns(); 815*ec779b8eSAndroid Build Coastguard Worker // Late-inited from main() 816*ec779b8eSAndroid Build Coastguard Worker std::atomic<int64_t> mStartupFinishedTime {}; 817*ec779b8eSAndroid Build Coastguard Worker }; 818*ec779b8eSAndroid Build Coastguard Worker 819*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 820*ec779b8eSAndroid Build Coastguard Worker 821*ec779b8eSAndroid Build Coastguard Worker } // namespace android 822