xref: /aosp_15_r20/frameworks/av/services/audioflinger/AudioFlinger.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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