• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2007, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 #ifndef ANDROID_AUDIO_FLINGER_H
19 #define ANDROID_AUDIO_FLINGER_H
20 
21 #include "Configuration.h"
22 #include <atomic>
23 #include <mutex>
24 #include <chrono>
25 #include <deque>
26 #include <map>
27 #include <numeric>
28 #include <optional>
29 #include <set>
30 #include <string>
31 #include <vector>
32 #include <stdint.h>
33 #include <sys/types.h>
34 #include <limits.h>
35 
36 #include <android/media/BnAudioTrack.h>
37 #include <android/media/IAudioFlingerClient.h>
38 #include <android/media/IAudioTrackCallback.h>
39 #include <android/os/BnExternalVibrationController.h>
40 #include <android/content/AttributionSourceState.h>
41 
42 
43 #include <android-base/macros.h>
44 #include <cutils/atomic.h>
45 #include <cutils/compiler.h>
46 
47 #include <cutils/properties.h>
48 #include <media/IAudioFlinger.h>
49 #include <media/AudioSystem.h>
50 #include <media/AudioTrack.h>
51 #include <media/MmapStreamInterface.h>
52 #include <media/MmapStreamCallback.h>
53 
54 #include <utils/Errors.h>
55 #include <utils/threads.h>
56 #include <utils/SortedVector.h>
57 #include <utils/TypeHelpers.h>
58 #include <utils/Vector.h>
59 
60 #include <binder/AppOpsManager.h>
61 #include <binder/BinderService.h>
62 #include <binder/IAppOpsCallback.h>
63 #include <binder/MemoryDealer.h>
64 
65 #include <system/audio.h>
66 #include <system/audio_policy.h>
67 
68 #include <media/audiohal/EffectBufferHalInterface.h>
69 #include <media/audiohal/StreamHalInterface.h>
70 #include <media/AudioBufferProvider.h>
71 #include <media/AudioContainers.h>
72 #include <media/AudioDeviceTypeAddr.h>
73 #include <media/AudioMixer.h>
74 #include <media/DeviceDescriptorBase.h>
75 #include <media/ExtendedAudioBufferProvider.h>
76 #include <media/VolumeShaper.h>
77 #include <mediautils/ServiceUtilities.h>
78 #include <mediautils/Synchronization.h>
79 
80 #include <audio_utils/clock.h>
81 #include <audio_utils/FdToString.h>
82 #include <audio_utils/LinearMap.h>
83 #include <audio_utils/SimpleLog.h>
84 #include <audio_utils/TimestampVerifier.h>
85 
86 #include "FastCapture.h"
87 #include "FastMixer.h"
88 #include <media/nbaio/NBAIO.h>
89 #include "AudioWatchdog.h"
90 #include "AudioStreamOut.h"
91 #include "SpdifStreamOut.h"
92 #include "AudioHwDevice.h"
93 #include "NBAIO_Tee.h"
94 #include "ThreadMetrics.h"
95 #include "TrackMetrics.h"
96 
97 #include <android/os/IPowerManager.h>
98 
99 #include <media/nblog/NBLog.h>
100 #include <private/media/AudioEffectShared.h>
101 #include <private/media/AudioTrackShared.h>
102 
103 #include <vibrator/ExternalVibration.h>
104 #include <vibrator/ExternalVibrationUtils.h>
105 
106 #include "android/media/BnAudioRecord.h"
107 #include "android/media/BnEffect.h"
108 
109 namespace android {
110 
111 class AudioMixer;
112 class AudioBuffer;
113 class AudioResampler;
114 class DeviceHalInterface;
115 class DevicesFactoryHalCallback;
116 class DevicesFactoryHalInterface;
117 class EffectsFactoryHalInterface;
118 class FastMixer;
119 class PassthruBufferProvider;
120 class RecordBufferConverter;
121 class ServerProxy;
122 
123 // ----------------------------------------------------------------------------
124 
125 static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3);
126 
127 #define INCLUDING_FROM_AUDIOFLINGER_H
128 
129 using android::content::AttributionSourceState;
130 
131 class AudioFlinger : public AudioFlingerServerAdapter::Delegate
132 {
133 public:
134     static void instantiate() ANDROID_API;
135 
136     static AttributionSourceState checkAttributionSourcePackage(
137         const AttributionSourceState& attributionSource);
138 
139     status_t dump(int fd, const Vector<String16>& args) override;
140 
141     // IAudioFlinger interface, in binder opcode order
142     status_t createTrack(const media::CreateTrackRequest& input,
143                          media::CreateTrackResponse& output) override;
144 
145     status_t createRecord(const media::CreateRecordRequest& input,
146                           media::CreateRecordResponse& output) override;
147 
148     virtual     uint32_t    sampleRate(audio_io_handle_t ioHandle) const;
149     virtual     audio_format_t format(audio_io_handle_t output) const;
150     virtual     size_t      frameCount(audio_io_handle_t ioHandle) const;
151     virtual     size_t      frameCountHAL(audio_io_handle_t ioHandle) const;
152     virtual     uint32_t    latency(audio_io_handle_t output) const;
153 
154     virtual     status_t    setMasterVolume(float value);
155     virtual     status_t    setMasterMute(bool muted);
156 
157     virtual     float       masterVolume() const;
158     virtual     bool        masterMute() const;
159 
160     // Balance value must be within -1.f (left only) to 1.f (right only) inclusive.
161                 status_t    setMasterBalance(float balance) override;
162                 status_t    getMasterBalance(float *balance) const override;
163 
164     virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value,
165                                             audio_io_handle_t output);
166     virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted);
167 
168     virtual     float       streamVolume(audio_stream_type_t stream,
169                                          audio_io_handle_t output) const;
170     virtual     bool        streamMute(audio_stream_type_t stream) const;
171 
172     virtual     status_t    setMode(audio_mode_t mode);
173 
174     virtual     status_t    setMicMute(bool state);
175     virtual     bool        getMicMute() const;
176 
177     virtual     void        setRecordSilenced(audio_port_handle_t portId, bool silenced);
178 
179     virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs);
180     virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const;
181 
182     virtual     void        registerClient(const sp<media::IAudioFlingerClient>& client);
183 
184     virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format,
185                                                audio_channel_mask_t channelMask) const;
186 
187     virtual status_t openOutput(const media::OpenOutputRequest& request,
188                                 media::OpenOutputResponse* response);
189 
190     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
191                                                   audio_io_handle_t output2);
192 
193     virtual status_t closeOutput(audio_io_handle_t output);
194 
195     virtual status_t suspendOutput(audio_io_handle_t output);
196 
197     virtual status_t restoreOutput(audio_io_handle_t output);
198 
199     virtual status_t openInput(const media::OpenInputRequest& request,
200                                media::OpenInputResponse* response);
201 
202     virtual status_t closeInput(audio_io_handle_t input);
203 
204     virtual status_t invalidateStream(audio_stream_type_t stream);
205 
206     virtual status_t setVoiceVolume(float volume);
207 
208     virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
209                                        audio_io_handle_t output) const;
210 
211     virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const;
212 
213     // This is the binder API.  For the internal API see nextUniqueId().
214     virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
215 
216     void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) override;
217 
218     virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid);
219 
220     virtual status_t queryNumberEffects(uint32_t *numEffects) const;
221 
222     virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const;
223 
224     virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
225                                          const effect_uuid_t *pTypeUuid,
226                                          uint32_t preferredTypeFlag,
227                                          effect_descriptor_t *descriptor) const;
228 
229     virtual status_t createEffect(const media::CreateEffectRequest& request,
230                                   media::CreateEffectResponse* response);
231 
232     virtual status_t moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput,
233                         audio_io_handle_t dstOutput);
234 
235             void setEffectSuspended(int effectId,
236                                     audio_session_t sessionId,
237                                     bool suspended) override;
238 
239     virtual audio_module_handle_t loadHwModule(const char *name);
240 
241     virtual uint32_t getPrimaryOutputSamplingRate();
242     virtual size_t getPrimaryOutputFrameCount();
243 
244     virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override;
245 
246     /* List available audio ports and their attributes */
247     virtual status_t listAudioPorts(unsigned int *num_ports,
248                                     struct audio_port *ports);
249 
250     /* Get attributes for a given audio port */
251     virtual status_t getAudioPort(struct audio_port_v7 *port);
252 
253     /* Create an audio patch between several source and sink ports */
254     virtual status_t createAudioPatch(const struct audio_patch *patch,
255                                        audio_patch_handle_t *handle);
256 
257     /* Release an audio patch */
258     virtual status_t releaseAudioPatch(audio_patch_handle_t handle);
259 
260     /* List existing audio patches */
261     virtual status_t listAudioPatches(unsigned int *num_patches,
262                                       struct audio_patch *patches);
263 
264     /* Set audio port configuration */
265     virtual status_t setAudioPortConfig(const struct audio_port_config *config);
266 
267     /* Get the HW synchronization source used for an audio session */
268     virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId);
269 
270     /* Indicate JAVA services are ready (scheduling, power management ...) */
271     virtual status_t systemReady();
272 
273     virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones);
274 
275     virtual status_t setAudioHalPids(const std::vector<pid_t>& pids);
276 
277     virtual status_t setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos);
278 
279     virtual status_t updateSecondaryOutputs(
280             const TrackSecondaryOutputsMap& trackSecondaryOutputs);
281 
282     status_t onTransactWrapper(TransactionCode code, const Parcel& data, uint32_t flags,
283         const std::function<status_t()>& delegate) override;
284 
285     // end of IAudioFlinger interface
286 
287     sp<NBLog::Writer>   newWriter_l(size_t size, const char *name);
288     void                unregisterWriter(const sp<NBLog::Writer>& writer);
289     sp<EffectsFactoryHalInterface> getEffectsFactory();
290 
291     status_t openMmapStream(MmapStreamInterface::stream_direction_t direction,
292                             const audio_attributes_t *attr,
293                             audio_config_base_t *config,
294                             const AudioClient& client,
295                             audio_port_handle_t *deviceId,
296                             audio_session_t *sessionId,
297                             const sp<MmapStreamCallback>& callback,
298                             sp<MmapStreamInterface>& interface,
299                             audio_port_handle_t *handle);
300 
301     static int onExternalVibrationStart(const sp<os::ExternalVibration>& externalVibration);
302     static void onExternalVibrationStop(const sp<os::ExternalVibration>& externalVibration);
303 
304     status_t addEffectToHal(audio_port_handle_t deviceId,
305             audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect);
306     status_t removeEffectFromHal(audio_port_handle_t deviceId,
307             audio_module_handle_t hwModuleId, sp<EffectHalInterface> effect);
308 
309     void updateDownStreamPatches_l(const struct audio_patch *patch,
310                                    const std::set<audio_io_handle_t> streams);
311 
312     const media::AudioVibratorInfo* getDefaultVibratorInfo_l();
313 
314 private:
315     // FIXME The 400 is temporarily too high until a leak of writers in media.log is fixed.
316     static const size_t kLogMemorySize = 400 * 1024;
317     sp<MemoryDealer>    mLogMemoryDealer;   // == 0 when NBLog is disabled
318     // When a log writer is unregistered, it is done lazily so that media.log can continue to see it
319     // for as long as possible.  The memory is only freed when it is needed for another log writer.
320     Vector< sp<NBLog::Writer> > mUnregisteredWriters;
321     Mutex               mUnregisteredWritersLock;
322 
323 public:
324     // Life cycle of gAudioFlinger and AudioFlinger:
325     //
326     // AudioFlinger is created once and survives until audioserver crashes
327     // irrespective of sp<> and wp<> as it is refcounted by ServiceManager and we
328     // don't issue a ServiceManager::tryUnregisterService().
329     //
330     // gAudioFlinger is an atomic pointer set on AudioFlinger::onFirstRef().
331     // After this is set, it is safe to obtain a wp<> or sp<> from it as the
332     // underlying object does not go away.
333     //
334     // Note: For most inner classes, it is acceptable to hold a reference to the outer
335     // AudioFlinger instance as creation requires AudioFlinger to exist in the first place.
336     //
337     // An atomic here ensures underlying writes have completed before setting
338     // the pointer. Access by memory_order_seq_cst.
339     //
340 
341     static inline std::atomic<AudioFlinger *> gAudioFlinger = nullptr;
342 
343     class SyncEvent;
344 
345     typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ;
346 
347     class SyncEvent : public RefBase {
348     public:
SyncEvent(AudioSystem::sync_event_t type,audio_session_t triggerSession,audio_session_t listenerSession,sync_event_callback_t callBack,wp<RefBase> cookie)349         SyncEvent(AudioSystem::sync_event_t type,
350                   audio_session_t triggerSession,
351                   audio_session_t listenerSession,
352                   sync_event_callback_t callBack,
353                   wp<RefBase> cookie)
354         : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession),
355           mCallback(callBack), mCookie(cookie)
356         {}
357 
~SyncEvent()358         virtual ~SyncEvent() {}
359 
trigger()360         void trigger() {
361             Mutex::Autolock _l(mLock);
362             if (mCallback) mCallback(wp<SyncEvent>(this));
363         }
isCancelled()364         bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); }
cancel()365         void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; }
type()366         AudioSystem::sync_event_t type() const { return mType; }
triggerSession()367         audio_session_t triggerSession() const { return mTriggerSession; }
listenerSession()368         audio_session_t listenerSession() const { return mListenerSession; }
cookie()369         wp<RefBase> cookie() const { return mCookie; }
370 
371     private:
372           const AudioSystem::sync_event_t mType;
373           const audio_session_t mTriggerSession;
374           const audio_session_t mListenerSession;
375           sync_event_callback_t mCallback;
376           const wp<RefBase> mCookie;
377           mutable Mutex mLock;
378     };
379 
380     sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type,
381                                         audio_session_t triggerSession,
382                                         audio_session_t listenerSession,
383                                         sync_event_callback_t callBack,
384                                         const wp<RefBase>& cookie);
385 
btNrecIsOff()386     bool        btNrecIsOff() const { return mBtNrecIsOff.load(); }
387 
388 
389 private:
390 
getMode()391                audio_mode_t getMode() const { return mMode; }
392 
393                             AudioFlinger() ANDROID_API;
394     virtual                 ~AudioFlinger();
395 
396     // call in any IAudioFlinger method that accesses mPrimaryHardwareDev
initCheck()397     status_t                initCheck() const { return mPrimaryHardwareDev == NULL ?
398                                                         NO_INIT : NO_ERROR; }
399 
400     // RefBase
401     virtual     void        onFirstRef();
402 
403     AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module,
404                                                 audio_devices_t deviceType);
405 
406     // Set kEnableExtendedChannels to true to enable greater than stereo output
407     // for the MixerThread and device sink.  Number of channels allowed is
408     // FCC_2 <= channels <= AudioMixer::MAX_NUM_CHANNELS.
409     static const bool kEnableExtendedChannels = true;
410 
411     // Returns true if channel mask is permitted for the PCM sink in the MixerThread
isValidPcmSinkChannelMask(audio_channel_mask_t channelMask)412     static inline bool isValidPcmSinkChannelMask(audio_channel_mask_t channelMask) {
413         switch (audio_channel_mask_get_representation(channelMask)) {
414         case AUDIO_CHANNEL_REPRESENTATION_POSITION: {
415             // Haptic channel mask is only applicable for channel position mask.
416             const uint32_t channelCount = audio_channel_count_from_out_mask(
417                     static_cast<audio_channel_mask_t>(channelMask & ~AUDIO_CHANNEL_HAPTIC_ALL));
418             const uint32_t maxChannelCount = kEnableExtendedChannels
419                     ? AudioMixer::MAX_NUM_CHANNELS : FCC_2;
420             if (channelCount < FCC_2 // mono is not supported at this time
421                     || channelCount > maxChannelCount) {
422                 return false;
423             }
424             // check that channelMask is the "canonical" one we expect for the channelCount.
425             return audio_channel_position_mask_is_out_canonical(channelMask);
426             }
427         case AUDIO_CHANNEL_REPRESENTATION_INDEX:
428             if (kEnableExtendedChannels) {
429                 const uint32_t channelCount = audio_channel_count_from_out_mask(channelMask);
430                 if (channelCount >= FCC_2 // mono is not supported at this time
431                         && channelCount <= AudioMixer::MAX_NUM_CHANNELS) {
432                     return true;
433                 }
434             }
435             return false;
436         default:
437             return false;
438         }
439     }
440 
441     // Set kEnableExtendedPrecision to true to use extended precision in MixerThread
442     static const bool kEnableExtendedPrecision = true;
443 
444     // Returns true if format is permitted for the PCM sink in the MixerThread
isValidPcmSinkFormat(audio_format_t format)445     static inline bool isValidPcmSinkFormat(audio_format_t format) {
446         switch (format) {
447         case AUDIO_FORMAT_PCM_16_BIT:
448             return true;
449         case AUDIO_FORMAT_PCM_FLOAT:
450         case AUDIO_FORMAT_PCM_24_BIT_PACKED:
451         case AUDIO_FORMAT_PCM_32_BIT:
452         case AUDIO_FORMAT_PCM_8_24_BIT:
453             return kEnableExtendedPrecision;
454         default:
455             return false;
456         }
457     }
458 
459     // standby delay for MIXER and DUPLICATING playback threads is read from property
460     // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs
461     static nsecs_t          mStandbyTimeInNsecs;
462 
463     // incremented by 2 when screen state changes, bit 0 == 1 means "off"
464     // AudioFlinger::setParameters() updates, other threads read w/o lock
465     static uint32_t         mScreenState;
466 
467     // Internal dump utilities.
468     static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
469     static bool dumpTryLock(Mutex& mutex);
470     void dumpPermissionDenial(int fd, const Vector<String16>& args);
471     void dumpClients(int fd, const Vector<String16>& args);
472     void dumpInternals(int fd, const Vector<String16>& args);
473 
474     SimpleLog mThreadLog{16}; // 16 Thread history limit
475 
476     class ThreadBase;
477     void dumpToThreadLog_l(const sp<ThreadBase> &thread);
478 
479     // --- Client ---
480     class Client : public RefBase {
481     public:
482                             Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
483         virtual             ~Client();
484         sp<MemoryDealer>    heap() const;
pid()485         pid_t               pid() const { return mPid; }
audioFlinger()486         sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; }
487 
488     private:
489         DISALLOW_COPY_AND_ASSIGN(Client);
490 
491         const sp<AudioFlinger> mAudioFlinger;
492               sp<MemoryDealer> mMemoryDealer;
493         const pid_t         mPid;
494     };
495 
496     // --- Notification Client ---
497     class NotificationClient : public IBinder::DeathRecipient {
498     public:
499                             NotificationClient(const sp<AudioFlinger>& audioFlinger,
500                                                 const sp<media::IAudioFlingerClient>& client,
501                                                 pid_t pid,
502                                                 uid_t uid);
503         virtual             ~NotificationClient();
504 
audioFlingerClient()505                 sp<media::IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; }
getPid()506                 pid_t getPid() const { return mPid; }
getUid()507                 uid_t getUid() const { return mUid; }
508 
509                 // IBinder::DeathRecipient
510                 virtual     void        binderDied(const wp<IBinder>& who);
511 
512     private:
513         DISALLOW_COPY_AND_ASSIGN(NotificationClient);
514 
515         const sp<AudioFlinger>  mAudioFlinger;
516         const pid_t             mPid;
517         const uid_t             mUid;
518         const sp<media::IAudioFlingerClient> mAudioFlingerClient;
519     };
520 
521     // --- MediaLogNotifier ---
522     // Thread in charge of notifying MediaLogService to start merging.
523     // Receives requests from AudioFlinger's binder activity. It is used to reduce the amount of
524     // binder calls to MediaLogService in case of bursts of AudioFlinger binder calls.
525     class MediaLogNotifier : public Thread {
526     public:
527         MediaLogNotifier();
528 
529         // Requests a MediaLogService notification. It's ignored if there has recently been another
530         void requestMerge();
531     private:
532         // Every iteration blocks waiting for a request, then interacts with MediaLogService to
533         // start merging.
534         // As every MediaLogService binder call is expensive, once it gets a request it ignores the
535         // following ones for a period of time.
536         virtual bool threadLoop() override;
537 
538         bool mPendingRequests;
539 
540         // Mutex and condition variable around mPendingRequests' value
541         Mutex       mMutex;
542         Condition   mCond;
543 
544         // Duration of the sleep period after a processed request
545         static const int kPostTriggerSleepPeriod = 1000000;
546     };
547 
548     const sp<MediaLogNotifier> mMediaLogNotifier;
549 
550     // This is a helper that is called during incoming binder calls.
551     // Requests media.log to start merging log buffers
552     void requestLogMerge();
553 
554     class TrackHandle;
555     class RecordHandle;
556     class RecordThread;
557     class PlaybackThread;
558     class MixerThread;
559     class DirectOutputThread;
560     class OffloadThread;
561     class DuplicatingThread;
562     class AsyncCallbackThread;
563     class Track;
564     class RecordTrack;
565     class EffectBase;
566     class EffectModule;
567     class EffectHandle;
568     class EffectChain;
569     class DeviceEffectProxy;
570     class DeviceEffectManager;
571     class PatchPanel;
572     class DeviceEffectManagerCallback;
573 
574     struct AudioStreamIn;
575     struct TeePatch;
576     using TeePatches = std::vector<TeePatch>;
577 
578 
579     struct  stream_type_t {
stream_type_tstream_type_t580         stream_type_t()
581             :   volume(1.0f),
582                 mute(false)
583         {
584         }
585         float       volume;
586         bool        mute;
587     };
588 
589     // Abstraction for the Audio Source for the RecordThread (HAL or PassthruPatchRecord).
590     struct Source
591     {
592         virtual ~Source() = default;
593         // The following methods have the same signatures as in StreamHalInterface.
594         virtual status_t read(void *buffer, size_t bytes, size_t *read) = 0;
595         virtual status_t getCapturePosition(int64_t *frames, int64_t *time) = 0;
596         virtual status_t standby() = 0;
597     };
598 
599     // --- PlaybackThread ---
600 #ifdef FLOAT_EFFECT_CHAIN
601 #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_FLOAT
602 using effect_buffer_t = float;
603 #else
604 #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_16_BIT
605 using effect_buffer_t = int16_t;
606 #endif
607 
608 #include "Threads.h"
609 
610 #include "PatchPanel.h"
611 
612 #include "Effects.h"
613 
614 #include "DeviceEffectManager.h"
615 
616     // Find io handle by session id.
617     // Preference is given to an io handle with a matching effect chain to session id.
618     // If none found, AUDIO_IO_HANDLE_NONE is returned.
619     template <typename T>
findIoHandleBySessionId_l(audio_session_t sessionId,const T & threads)620     static audio_io_handle_t findIoHandleBySessionId_l(
621             audio_session_t sessionId, const T& threads) {
622         audio_io_handle_t io = AUDIO_IO_HANDLE_NONE;
623 
624         for (size_t i = 0; i < threads.size(); i++) {
625             const uint32_t sessionType = threads.valueAt(i)->hasAudioSession(sessionId);
626             if (sessionType != 0) {
627                 io = threads.keyAt(i);
628                 if ((sessionType & AudioFlinger::ThreadBase::EFFECT_SESSION) != 0) {
629                     break; // effect chain here.
630                 }
631             }
632         }
633         return io;
634     }
635 
636     // server side of the client's IAudioTrack
637     class TrackHandle : public android::media::BnAudioTrack {
638     public:
639         explicit            TrackHandle(const sp<PlaybackThread::Track>& track);
640         virtual             ~TrackHandle();
641 
642         binder::Status getCblk(std::optional<media::SharedFileRegion>* _aidl_return) override;
643         binder::Status start(int32_t* _aidl_return) override;
644         binder::Status stop() override;
645         binder::Status flush() override;
646         binder::Status pause() override;
647         binder::Status attachAuxEffect(int32_t effectId, int32_t* _aidl_return) override;
648         binder::Status setParameters(const std::string& keyValuePairs,
649                                      int32_t* _aidl_return) override;
650         binder::Status selectPresentation(int32_t presentationId, int32_t programId,
651                                           int32_t* _aidl_return) override;
652         binder::Status getTimestamp(media::AudioTimestampInternal* timestamp,
653                                     int32_t* _aidl_return) override;
654         binder::Status signal() override;
655         binder::Status applyVolumeShaper(const media::VolumeShaperConfiguration& configuration,
656                                          const media::VolumeShaperOperation& operation,
657                                          int32_t* _aidl_return) override;
658         binder::Status getVolumeShaperState(
659                 int32_t id,
660                 std::optional<media::VolumeShaperState>* _aidl_return) override;
661         binder::Status getDualMonoMode(media::AudioDualMonoMode* _aidl_return) override;
662         binder::Status setDualMonoMode(media::AudioDualMonoMode mode) override;
663         binder::Status getAudioDescriptionMixLevel(float* _aidl_return) override;
664         binder::Status setAudioDescriptionMixLevel(float leveldB) override;
665         binder::Status getPlaybackRateParameters(
666                 media::AudioPlaybackRate* _aidl_return) override;
667         binder::Status setPlaybackRateParameters(
668                 const media::AudioPlaybackRate& playbackRate) override;
669 
670     private:
671         const sp<PlaybackThread::Track> mTrack;
672     };
673 
674     // server side of the client's IAudioRecord
675     class RecordHandle : public android::media::BnAudioRecord {
676     public:
677         explicit RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
678         virtual             ~RecordHandle();
679         virtual binder::Status    start(int /*AudioSystem::sync_event_t*/ event,
680                 int /*audio_session_t*/ triggerSession);
681         virtual binder::Status   stop();
682         virtual binder::Status   getActiveMicrophones(
683                 std::vector<media::MicrophoneInfoData>* activeMicrophones);
684         virtual binder::Status   setPreferredMicrophoneDirection(
685                 int /*audio_microphone_direction_t*/ direction);
686         virtual binder::Status   setPreferredMicrophoneFieldDimension(float zoom);
687         virtual binder::Status   shareAudioHistory(const std::string& sharedAudioPackageName,
688                                                    int64_t sharedAudioStartMs);
689 
690     private:
691         const sp<RecordThread::RecordTrack> mRecordTrack;
692 
693         // for use from destructor
694         void                stop_nonvirtual();
695     };
696 
697     // Mmap stream control interface implementation. Each MmapThreadHandle controls one
698     // MmapPlaybackThread or MmapCaptureThread instance.
699     class MmapThreadHandle : public MmapStreamInterface {
700     public:
701         explicit            MmapThreadHandle(const sp<MmapThread>& thread);
702         virtual             ~MmapThreadHandle();
703 
704         // MmapStreamInterface virtuals
705         virtual status_t createMmapBuffer(int32_t minSizeFrames,
706                                           struct audio_mmap_buffer_info *info);
707         virtual status_t getMmapPosition(struct audio_mmap_position *position);
708         virtual status_t getExternalPosition(uint64_t *position, int64_t *timeNanos);
709         virtual status_t start(const AudioClient& client,
710                                const audio_attributes_t *attr,
711                                audio_port_handle_t *handle);
712         virtual status_t stop(audio_port_handle_t handle);
713         virtual status_t standby();
714 
715     private:
716         const sp<MmapThread> mThread;
717     };
718 
719               ThreadBase *checkThread_l(audio_io_handle_t ioHandle) const;
720               PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const;
721               MixerThread *checkMixerThread_l(audio_io_handle_t output) const;
722               RecordThread *checkRecordThread_l(audio_io_handle_t input) const;
723               MmapThread *checkMmapThread_l(audio_io_handle_t io) const;
724               VolumeInterface *getVolumeInterface_l(audio_io_handle_t output) const;
725               Vector <VolumeInterface *> getAllVolumeInterfaces_l() const;
726 
727               sp<ThreadBase> openInput_l(audio_module_handle_t module,
728                                            audio_io_handle_t *input,
729                                            audio_config_t *config,
730                                            audio_devices_t device,
731                                            const char* address,
732                                            audio_source_t source,
733                                            audio_input_flags_t flags,
734                                            audio_devices_t outputDevice,
735                                            const String8& outputDeviceAddress);
736               sp<ThreadBase> openOutput_l(audio_module_handle_t module,
737                                           audio_io_handle_t *output,
738                                           audio_config_t *config,
739                                           audio_devices_t deviceType,
740                                           const String8& address,
741                                           audio_output_flags_t flags);
742 
743               void closeOutputFinish(const sp<PlaybackThread>& thread);
744               void closeInputFinish(const sp<RecordThread>& thread);
745 
746               // no range check, AudioFlinger::mLock held
streamMute_l(audio_stream_type_t stream)747               bool streamMute_l(audio_stream_type_t stream) const
748                                 { return mStreamTypes[stream].mute; }
749               void ioConfigChanged(audio_io_config_event event,
750                                    const sp<AudioIoDescriptor>& ioDesc,
751                                    pid_t pid = 0);
752 
753               // Allocate an audio_unique_id_t.
754               // Specific types are audio_io_handle_t, audio_session_t, effect ID (int),
755               // audio_module_handle_t, and audio_patch_handle_t.
756               // They all share the same ID space, but the namespaces are actually independent
757               // because there are separate KeyedVectors for each kind of ID.
758               // The return value is cast to the specific type depending on how the ID will be used.
759               // FIXME This API does not handle rollover to zero (for unsigned IDs),
760               //       or from positive to negative (for signed IDs).
761               //       Thus it may fail by returning an ID of the wrong sign,
762               //       or by returning a non-unique ID.
763               // This is the internal API.  For the binder API see newAudioUniqueId().
764               audio_unique_id_t nextUniqueId(audio_unique_id_use_t use);
765 
766               status_t moveEffectChain_l(audio_session_t sessionId,
767                                      PlaybackThread *srcThread,
768                                      PlaybackThread *dstThread);
769 
770               status_t moveAuxEffectToIo(int EffectId,
771                                          const sp<PlaybackThread>& dstThread,
772                                          sp<PlaybackThread> *srcThread);
773 
774               // return thread associated with primary hardware device, or NULL
775               PlaybackThread *primaryPlaybackThread_l() const;
776               DeviceTypeSet primaryOutputDevice_l() const;
777 
778               // return the playback thread with smallest HAL buffer size, and prefer fast
779               PlaybackThread *fastPlaybackThread_l() const;
780 
781               sp<ThreadBase> getEffectThread_l(audio_session_t sessionId, int effectId);
782 
783               ThreadBase *hapticPlaybackThread_l() const;
784 
785               void updateSecondaryOutputsForTrack_l(
786                       PlaybackThread::Track* track,
787                       PlaybackThread* thread,
788                       const std::vector<audio_io_handle_t>& secondaryOutputs) const;
789 
790 
791                 void        removeClient_l(pid_t pid);
792                 void        removeNotificationClient(pid_t pid);
793                 bool isNonOffloadableGlobalEffectEnabled_l();
794                 void onNonOffloadableGlobalEffectEnable();
795                 bool isSessionAcquired_l(audio_session_t audioSession);
796 
797                 // Store an effect chain to mOrphanEffectChains keyed vector.
798                 // Called when a thread exits and effects are still attached to it.
799                 // If effects are later created on the same session, they will reuse the same
800                 // effect chain and same instances in the effect library.
801                 // return ALREADY_EXISTS if a chain with the same session already exists in
802                 // mOrphanEffectChains. Note that this should never happen as there is only one
803                 // chain for a given session and it is attached to only one thread at a time.
804                 status_t        putOrphanEffectChain_l(const sp<EffectChain>& chain);
805                 // Get an effect chain for the specified session in mOrphanEffectChains and remove
806                 // it if found. Returns 0 if not found (this is the most common case).
807                 sp<EffectChain> getOrphanEffectChain_l(audio_session_t session);
808                 // Called when the last effect handle on an effect instance is removed. If this
809                 // effect belongs to an effect chain in mOrphanEffectChains, the chain is updated
810                 // and removed from mOrphanEffectChains if it does not contain any effect.
811                 // Return true if the effect was found in mOrphanEffectChains, false otherwise.
812                 bool            updateOrphanEffectChains(const sp<EffectModule>& effect);
813 
814                 std::vector< sp<EffectModule> > purgeStaleEffects_l();
815 
816                 void broadcastParametersToRecordThreads_l(const String8& keyValuePairs);
817                 void updateOutDevicesForRecordThreads_l(const DeviceDescriptorBaseVector& devices);
818                 void forwardParametersToDownstreamPatches_l(
819                         audio_io_handle_t upStream, const String8& keyValuePairs,
820                         std::function<bool(const sp<PlaybackThread>&)> useThread = nullptr);
821 
822     // AudioStreamIn is immutable, so their fields are const.
823     // For emphasis, we could also make all pointers to them be "const *",
824     // but that would clutter the code unnecessarily.
825 
826     struct AudioStreamIn : public Source {
827         AudioHwDevice* const audioHwDev;
828         sp<StreamInHalInterface> stream;
829         audio_input_flags_t flags;
830 
hwDevAudioStreamIn831         sp<DeviceHalInterface> hwDev() const { return audioHwDev->hwDevice(); }
832 
AudioStreamInAudioStreamIn833         AudioStreamIn(AudioHwDevice *dev, sp<StreamInHalInterface> in, audio_input_flags_t flags) :
834             audioHwDev(dev), stream(in), flags(flags) {}
readAudioStreamIn835         status_t read(void *buffer, size_t bytes, size_t *read) override {
836             return stream->read(buffer, bytes, read);
837         }
getCapturePositionAudioStreamIn838         status_t getCapturePosition(int64_t *frames, int64_t *time) override {
839             return stream->getCapturePosition(frames, time);
840         }
standbyAudioStreamIn841         status_t standby() override { return stream->standby(); }
842     };
843 
844     struct TeePatch {
845         sp<RecordThread::PatchRecord> patchRecord;
846         sp<PlaybackThread::PatchTrack> patchTrack;
847     };
848 
849     // for mAudioSessionRefs only
850     struct AudioSessionRef {
AudioSessionRefAudioSessionRef851         AudioSessionRef(audio_session_t sessionid, pid_t pid, uid_t uid) :
852             mSessionid(sessionid), mPid(pid), mUid(uid), mCnt(1) {}
853         const audio_session_t mSessionid;
854         const pid_t mPid;
855         const uid_t mUid;
856         int         mCnt;
857     };
858 
859     mutable     Mutex                               mLock;
860                 // protects mClients and mNotificationClients.
861                 // must be locked after mLock and ThreadBase::mLock if both must be locked
862                 // avoids acquiring AudioFlinger::mLock from inside thread loop.
863     mutable     Mutex                               mClientLock;
864                 // protected by mClientLock
865                 DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client()
866 
867                 mutable     Mutex                   mHardwareLock;
868                 // NOTE: If both mLock and mHardwareLock mutexes must be held,
869                 // always take mLock before mHardwareLock
870 
871                 // guarded by mHardwareLock
872                 AudioHwDevice* mPrimaryHardwareDev;
873                 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs;
874 
875                 // These two fields are immutable after onFirstRef(), so no lock needed to access
876                 sp<DevicesFactoryHalInterface> mDevicesFactoryHal;
877                 sp<DevicesFactoryHalCallback> mDevicesFactoryHalCallback;
878 
879     // for dump, indicates which hardware operation is currently in progress (but not stream ops)
880     enum hardware_call_state {
881         AUDIO_HW_IDLE = 0,              // no operation in progress
882         AUDIO_HW_INIT,                  // init_check
883         AUDIO_HW_OUTPUT_OPEN,           // open_output_stream
884         AUDIO_HW_OUTPUT_CLOSE,          // unused
885         AUDIO_HW_INPUT_OPEN,            // unused
886         AUDIO_HW_INPUT_CLOSE,           // unused
887         AUDIO_HW_STANDBY,               // unused
888         AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume
889         AUDIO_HW_GET_ROUTING,           // unused
890         AUDIO_HW_SET_ROUTING,           // unused
891         AUDIO_HW_GET_MODE,              // unused
892         AUDIO_HW_SET_MODE,              // set_mode
893         AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute
894         AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute
895         AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume
896         AUDIO_HW_SET_PARAMETER,         // set_parameters
897         AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size
898         AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume
899         AUDIO_HW_GET_PARAMETER,         // get_parameters
900         AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute
901         AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute
902         AUDIO_HW_GET_MICROPHONES,       // getMicrophones
903     };
904 
905     mutable     hardware_call_state                 mHardwareStatus;    // for dump only
906 
907 
908                 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads;
909                 stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT];
910 
911                 // member variables below are protected by mLock
912                 float                               mMasterVolume;
913                 bool                                mMasterMute;
914                 float                               mMasterBalance = 0.f;
915                 // end of variables protected by mLock
916 
917                 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads;
918 
919                 // protected by mClientLock
920                 DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
921 
922                 // updated by atomic_fetch_add_explicit
923                 volatile atomic_uint_fast32_t       mNextUniqueIds[AUDIO_UNIQUE_ID_USE_MAX];
924 
925                 audio_mode_t                        mMode;
926                 std::atomic_bool                    mBtNrecIsOff;
927 
928                 // protected by mLock
929                 Vector<AudioSessionRef*> mAudioSessionRefs;
930 
931                 float       masterVolume_l() const;
932                 float       getMasterBalance_l() const;
933                 bool        masterMute_l() const;
934                 audio_module_handle_t loadHwModule_l(const char *name);
935 
936                 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session
937                                                              // to be created
938 
939                 // Effect chains without a valid thread
940                 DefaultKeyedVector< audio_session_t , sp<EffectChain> > mOrphanEffectChains;
941 
942                 // list of sessions for which a valid HW A/V sync ID was retrieved from the HAL
943                 DefaultKeyedVector< audio_session_t , audio_hw_sync_t >mHwAvSyncIds;
944 
945                 // list of MMAP stream control threads. Those threads allow for wake lock, routing
946                 // and volume control for activity on the associated MMAP stream at the HAL.
947                 // Audio data transfer is directly handled by the client creating the MMAP stream
948                 DefaultKeyedVector< audio_io_handle_t, sp<MmapThread> >  mMmapThreads;
949 
950 private:
951     sp<Client>  registerPid(pid_t pid);    // always returns non-0
952 
953     // for use from destructor
954     status_t    closeOutput_nonvirtual(audio_io_handle_t output);
955     void        closeThreadInternal_l(const sp<PlaybackThread>& thread);
956     status_t    closeInput_nonvirtual(audio_io_handle_t input);
957     void        closeThreadInternal_l(const sp<RecordThread>& thread);
958     void        setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId);
959 
960     status_t    checkStreamType(audio_stream_type_t stream) const;
961 
962     void        filterReservedParameters(String8& keyValuePairs, uid_t callingUid);
963     void        logFilteredParameters(size_t originalKVPSize, const String8& originalKVPs,
964                                       size_t rejectedKVPSize, const String8& rejectedKVPs,
965                                       uid_t callingUid);
966 
967 public:
968     // These methods read variables atomically without mLock,
969     // though the variables are updated with mLock.
isLowRamDevice()970     bool    isLowRamDevice() const { return mIsLowRamDevice; }
971     size_t getClientSharedHeapSize() const;
972 
973 private:
974     std::atomic<bool> mIsLowRamDevice;
975     bool    mIsDeviceTypeKnown;
976     int64_t mTotalMemory;
977     std::atomic<size_t> mClientSharedHeapSize;
978     static constexpr size_t kMinimumClientSharedHeapSizeBytes = 1024 * 1024; // 1MB
979 
980     nsecs_t mGlobalEffectEnableTime;  // when a global effect was last enabled
981 
982     // protected by mLock
983     PatchPanel mPatchPanel;
984     sp<EffectsFactoryHalInterface> mEffectsFactoryHal;
985 
986     DeviceEffectManager mDeviceEffectManager;
987 
988     bool       mSystemReady;
989 
990     mediautils::UidInfo mUidInfo;
991 
992     SimpleLog  mRejectedSetParameterLog;
993     SimpleLog  mAppSetParameterLog;
994     SimpleLog  mSystemSetParameterLog;
995 
996     std::vector<media::AudioVibratorInfo> mAudioVibratorInfos;
997 
998     static inline constexpr const char *mMetricsId = AMEDIAMETRICS_KEY_AUDIO_FLINGER;
999 
1000     // Keep in sync with java definition in media/java/android/media/AudioRecord.java
1001     static constexpr int32_t kMaxSharedAudioHistoryMs = 5000;
1002 };
1003 
1004 #undef INCLUDING_FROM_AUDIOFLINGER_H
1005 
1006 std::string formatToString(audio_format_t format);
1007 std::string inputFlagsToString(audio_input_flags_t flags);
1008 std::string outputFlagsToString(audio_output_flags_t flags);
1009 std::string devicesToString(audio_devices_t devices);
1010 const char *sourceToString(audio_source_t source);
1011 
1012 // ----------------------------------------------------------------------------
1013 
1014 } // namespace android
1015 
1016 #endif // ANDROID_AUDIO_FLINGER_H
1017