AudioFlinger.h revision f947dbce4390f2c3c460325d37002a34f09c0b74
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 <stdint.h> 23#include <sys/types.h> 24#include <limits.h> 25 26#include <common_time/cc_helper.h> 27 28#include <cutils/compiler.h> 29 30#include <media/IAudioFlinger.h> 31#include <media/IAudioFlingerClient.h> 32#include <media/IAudioTrack.h> 33#include <media/IAudioRecord.h> 34#include <media/AudioSystem.h> 35#include <media/AudioTrack.h> 36 37#include <utils/Atomic.h> 38#include <utils/Errors.h> 39#include <utils/threads.h> 40#include <utils/SortedVector.h> 41#include <utils/TypeHelpers.h> 42#include <utils/Vector.h> 43 44#include <binder/BinderService.h> 45#include <binder/MemoryDealer.h> 46 47#include <system/audio.h> 48#include <hardware/audio.h> 49#include <hardware/audio_policy.h> 50 51#include <media/AudioBufferProvider.h> 52#include <media/ExtendedAudioBufferProvider.h> 53#include "FastMixer.h" 54#include <media/nbaio/NBAIO.h> 55#include "AudioWatchdog.h" 56 57#include <powermanager/IPowerManager.h> 58 59#include <media/nbaio/NBLog.h> 60#include <private/media/AudioTrackShared.h> 61 62namespace android { 63 64struct audio_track_cblk_t; 65struct effect_param_cblk_t; 66class AudioMixer; 67class AudioBuffer; 68class AudioResampler; 69class FastMixer; 70class ServerProxy; 71 72// ---------------------------------------------------------------------------- 73 74// AudioFlinger has a hard-coded upper limit of 2 channels for capture and playback. 75// There is support for > 2 channel tracks down-mixed to 2 channel output via a down-mix effect. 76// Adding full support for > 2 channel capture or playback would require more than simply changing 77// this #define. There is an independent hard-coded upper limit in AudioMixer; 78// removing that AudioMixer limit would be necessary but insufficient to support > 2 channels. 79// The macro FCC_2 highlights some (but not all) places where there is are 2-channel assumptions. 80// Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc. 81#define FCC_2 2 // FCC_2 = Fixed Channel Count 2 82 83static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); 84 85#define INCLUDING_FROM_AUDIOFLINGER_H 86 87class AudioFlinger : 88 public BinderService<AudioFlinger>, 89 public BnAudioFlinger 90{ 91 friend class BinderService<AudioFlinger>; // for AudioFlinger() 92public: 93 static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; } 94 95 virtual status_t dump(int fd, const Vector<String16>& args); 96 97 // IAudioFlinger interface, in binder opcode order 98 virtual sp<IAudioTrack> createTrack( 99 audio_stream_type_t streamType, 100 uint32_t sampleRate, 101 audio_format_t format, 102 audio_channel_mask_t channelMask, 103 size_t *pFrameCount, 104 IAudioFlinger::track_flags_t *flags, 105 const sp<IMemory>& sharedBuffer, 106 audio_io_handle_t output, 107 pid_t tid, 108 int *sessionId, 109 int clientUid, 110 status_t *status /*non-NULL*/); 111 112 virtual sp<IAudioRecord> openRecord( 113 audio_io_handle_t input, 114 uint32_t sampleRate, 115 audio_format_t format, 116 audio_channel_mask_t channelMask, 117 size_t *pFrameCount, 118 IAudioFlinger::track_flags_t *flags, 119 pid_t tid, 120 int *sessionId, 121 sp<IMemory>& cblk, 122 sp<IMemory>& buffers, 123 status_t *status /*non-NULL*/); 124 125 virtual uint32_t sampleRate(audio_io_handle_t output) const; 126 virtual audio_format_t format(audio_io_handle_t output) const; 127 virtual size_t frameCount(audio_io_handle_t output) const; 128 virtual uint32_t latency(audio_io_handle_t output) const; 129 130 virtual status_t setMasterVolume(float value); 131 virtual status_t setMasterMute(bool muted); 132 133 virtual float masterVolume() const; 134 virtual bool masterMute() const; 135 136 virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 137 audio_io_handle_t output); 138 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted); 139 140 virtual float streamVolume(audio_stream_type_t stream, 141 audio_io_handle_t output) const; 142 virtual bool streamMute(audio_stream_type_t stream) const; 143 144 virtual status_t setMode(audio_mode_t mode); 145 146 virtual status_t setMicMute(bool state); 147 virtual bool getMicMute() const; 148 149 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); 150 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const; 151 152 virtual void registerClient(const sp<IAudioFlingerClient>& client); 153 154 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 155 audio_channel_mask_t channelMask) const; 156 157 virtual audio_io_handle_t openOutput(audio_module_handle_t module, 158 audio_devices_t *pDevices, 159 uint32_t *pSamplingRate, 160 audio_format_t *pFormat, 161 audio_channel_mask_t *pChannelMask, 162 uint32_t *pLatencyMs, 163 audio_output_flags_t flags, 164 const audio_offload_info_t *offloadInfo); 165 166 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 167 audio_io_handle_t output2); 168 169 virtual status_t closeOutput(audio_io_handle_t output); 170 171 virtual status_t suspendOutput(audio_io_handle_t output); 172 173 virtual status_t restoreOutput(audio_io_handle_t output); 174 175 virtual audio_io_handle_t openInput(audio_module_handle_t module, 176 audio_devices_t *pDevices, 177 uint32_t *pSamplingRate, 178 audio_format_t *pFormat, 179 audio_channel_mask_t *pChannelMask); 180 181 virtual status_t closeInput(audio_io_handle_t input); 182 183 virtual status_t invalidateStream(audio_stream_type_t stream); 184 185 virtual status_t setVoiceVolume(float volume); 186 187 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 188 audio_io_handle_t output) const; 189 190 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const; 191 192 virtual int newAudioSessionId(); 193 194 virtual void acquireAudioSessionId(int audioSession, pid_t pid); 195 196 virtual void releaseAudioSessionId(int audioSession, pid_t pid); 197 198 virtual status_t queryNumberEffects(uint32_t *numEffects) const; 199 200 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const; 201 202 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 203 effect_descriptor_t *descriptor) const; 204 205 virtual sp<IEffect> createEffect( 206 effect_descriptor_t *pDesc, 207 const sp<IEffectClient>& effectClient, 208 int32_t priority, 209 audio_io_handle_t io, 210 int sessionId, 211 status_t *status /*non-NULL*/, 212 int *id, 213 int *enabled); 214 215 virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput, 216 audio_io_handle_t dstOutput); 217 218 virtual audio_module_handle_t loadHwModule(const char *name); 219 220 virtual uint32_t getPrimaryOutputSamplingRate(); 221 virtual size_t getPrimaryOutputFrameCount(); 222 223 virtual status_t setLowRamDevice(bool isLowRamDevice); 224 225 /* List available audio ports and their attributes */ 226 virtual status_t listAudioPorts(unsigned int *num_ports, 227 struct audio_port *ports); 228 229 /* Get attributes for a given audio port */ 230 virtual status_t getAudioPort(struct audio_port *port); 231 232 /* Create an audio patch between several source and sink ports */ 233 virtual status_t createAudioPatch(const struct audio_patch *patch, 234 audio_patch_handle_t *handle); 235 236 /* Release an audio patch */ 237 virtual status_t releaseAudioPatch(audio_patch_handle_t handle); 238 239 /* List existing audio patches */ 240 virtual status_t listAudioPatches(unsigned int *num_patches, 241 struct audio_patch *patches); 242 243 /* Set audio port configuration */ 244 virtual status_t setAudioPortConfig(const struct audio_port_config *config); 245 246 virtual status_t onTransact( 247 uint32_t code, 248 const Parcel& data, 249 Parcel* reply, 250 uint32_t flags); 251 252 // end of IAudioFlinger interface 253 254 sp<NBLog::Writer> newWriter_l(size_t size, const char *name); 255 void unregisterWriter(const sp<NBLog::Writer>& writer); 256private: 257 static const size_t kLogMemorySize = 40 * 1024; 258 sp<MemoryDealer> mLogMemoryDealer; // == 0 when NBLog is disabled 259 // When a log writer is unregistered, it is done lazily so that media.log can continue to see it 260 // for as long as possible. The memory is only freed when it is needed for another log writer. 261 Vector< sp<NBLog::Writer> > mUnregisteredWriters; 262 Mutex mUnregisteredWritersLock; 263public: 264 265 class SyncEvent; 266 267 typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ; 268 269 class SyncEvent : public RefBase { 270 public: 271 SyncEvent(AudioSystem::sync_event_t type, 272 int triggerSession, 273 int listenerSession, 274 sync_event_callback_t callBack, 275 wp<RefBase> cookie) 276 : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession), 277 mCallback(callBack), mCookie(cookie) 278 {} 279 280 virtual ~SyncEvent() {} 281 282 void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); } 283 bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); } 284 void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; } 285 AudioSystem::sync_event_t type() const { return mType; } 286 int triggerSession() const { return mTriggerSession; } 287 int listenerSession() const { return mListenerSession; } 288 wp<RefBase> cookie() const { return mCookie; } 289 290 private: 291 const AudioSystem::sync_event_t mType; 292 const int mTriggerSession; 293 const int mListenerSession; 294 sync_event_callback_t mCallback; 295 const wp<RefBase> mCookie; 296 mutable Mutex mLock; 297 }; 298 299 sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type, 300 int triggerSession, 301 int listenerSession, 302 sync_event_callback_t callBack, 303 wp<RefBase> cookie); 304 305private: 306 class AudioHwDevice; // fwd declaration for findSuitableHwDev_l 307 308 audio_mode_t getMode() const { return mMode; } 309 310 bool btNrecIsOff() const { return mBtNrecIsOff; } 311 312 AudioFlinger() ANDROID_API; 313 virtual ~AudioFlinger(); 314 315 // call in any IAudioFlinger method that accesses mPrimaryHardwareDev 316 status_t initCheck() const { return mPrimaryHardwareDev == NULL ? 317 NO_INIT : NO_ERROR; } 318 319 // RefBase 320 virtual void onFirstRef(); 321 322 AudioHwDevice* findSuitableHwDev_l(audio_module_handle_t module, 323 audio_devices_t devices); 324 void purgeStaleEffects_l(); 325 326 // standby delay for MIXER and DUPLICATING playback threads is read from property 327 // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs 328 static nsecs_t mStandbyTimeInNsecs; 329 330 // incremented by 2 when screen state changes, bit 0 == 1 means "off" 331 // AudioFlinger::setParameters() updates, other threads read w/o lock 332 static uint32_t mScreenState; 333 334 // Internal dump utilities. 335 static const int kDumpLockRetries = 50; 336 static const int kDumpLockSleepUs = 20000; 337 static bool dumpTryLock(Mutex& mutex); 338 void dumpPermissionDenial(int fd, const Vector<String16>& args); 339 void dumpClients(int fd, const Vector<String16>& args); 340 void dumpInternals(int fd, const Vector<String16>& args); 341 342 // --- Client --- 343 class Client : public RefBase { 344 public: 345 Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 346 virtual ~Client(); 347 sp<MemoryDealer> heap() const; 348 pid_t pid() const { return mPid; } 349 sp<AudioFlinger> audioFlinger() const { return mAudioFlinger; } 350 351 bool reserveTimedTrack(); 352 void releaseTimedTrack(); 353 354 private: 355 Client(const Client&); 356 Client& operator = (const Client&); 357 const sp<AudioFlinger> mAudioFlinger; 358 const sp<MemoryDealer> mMemoryDealer; 359 const pid_t mPid; 360 361 Mutex mTimedTrackLock; 362 int mTimedTrackCount; 363 }; 364 365 // --- Notification Client --- 366 class NotificationClient : public IBinder::DeathRecipient { 367 public: 368 NotificationClient(const sp<AudioFlinger>& audioFlinger, 369 const sp<IAudioFlingerClient>& client, 370 pid_t pid); 371 virtual ~NotificationClient(); 372 373 sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } 374 375 // IBinder::DeathRecipient 376 virtual void binderDied(const wp<IBinder>& who); 377 378 private: 379 NotificationClient(const NotificationClient&); 380 NotificationClient& operator = (const NotificationClient&); 381 382 const sp<AudioFlinger> mAudioFlinger; 383 const pid_t mPid; 384 const sp<IAudioFlingerClient> mAudioFlingerClient; 385 }; 386 387 class TrackHandle; 388 class RecordHandle; 389 class RecordThread; 390 class PlaybackThread; 391 class MixerThread; 392 class DirectOutputThread; 393 class OffloadThread; 394 class DuplicatingThread; 395 class AsyncCallbackThread; 396 class Track; 397 class RecordTrack; 398 class EffectModule; 399 class EffectHandle; 400 class EffectChain; 401 struct AudioStreamOut; 402 struct AudioStreamIn; 403 404 struct stream_type_t { 405 stream_type_t() 406 : volume(1.0f), 407 mute(false) 408 { 409 } 410 float volume; 411 bool mute; 412 }; 413 414 // --- PlaybackThread --- 415 416#include "Threads.h" 417 418#include "Effects.h" 419 420#include "PatchPanel.h" 421 422 // server side of the client's IAudioTrack 423 class TrackHandle : public android::BnAudioTrack { 424 public: 425 TrackHandle(const sp<PlaybackThread::Track>& track); 426 virtual ~TrackHandle(); 427 virtual sp<IMemory> getCblk() const; 428 virtual status_t start(); 429 virtual void stop(); 430 virtual void flush(); 431 virtual void pause(); 432 virtual status_t attachAuxEffect(int effectId); 433 virtual status_t allocateTimedBuffer(size_t size, 434 sp<IMemory>* buffer); 435 virtual status_t queueTimedBuffer(const sp<IMemory>& buffer, 436 int64_t pts); 437 virtual status_t setMediaTimeTransform(const LinearTransform& xform, 438 int target); 439 virtual status_t setParameters(const String8& keyValuePairs); 440 virtual status_t getTimestamp(AudioTimestamp& timestamp); 441 virtual void signal(); // signal playback thread for a change in control block 442 443 virtual status_t onTransact( 444 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 445 446 private: 447 const sp<PlaybackThread::Track> mTrack; 448 }; 449 450 // server side of the client's IAudioRecord 451 class RecordHandle : public android::BnAudioRecord { 452 public: 453 RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 454 virtual ~RecordHandle(); 455 virtual status_t start(int /*AudioSystem::sync_event_t*/ event, int triggerSession); 456 virtual void stop(); 457 virtual status_t onTransact( 458 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 459 private: 460 const sp<RecordThread::RecordTrack> mRecordTrack; 461 462 // for use from destructor 463 void stop_nonvirtual(); 464 }; 465 466 467 PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const; 468 MixerThread *checkMixerThread_l(audio_io_handle_t output) const; 469 RecordThread *checkRecordThread_l(audio_io_handle_t input) const; 470 // no range check, AudioFlinger::mLock held 471 bool streamMute_l(audio_stream_type_t stream) const 472 { return mStreamTypes[stream].mute; } 473 // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held 474 float streamVolume_l(audio_stream_type_t stream) const 475 { return mStreamTypes[stream].volume; } 476 void audioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2); 477 478 // Allocate an audio_io_handle_t, session ID, effect ID, or audio_module_handle_t. 479 // They all share the same ID space, but the namespaces are actually independent 480 // because there are separate KeyedVectors for each kind of ID. 481 // The return value is uint32_t, but is cast to signed for some IDs. 482 // FIXME This API does not handle rollover to zero (for unsigned IDs), 483 // or from positive to negative (for signed IDs). 484 // Thus it may fail by returning an ID of the wrong sign, 485 // or by returning a non-unique ID. 486 uint32_t nextUniqueId(); 487 488 status_t moveEffectChain_l(int sessionId, 489 PlaybackThread *srcThread, 490 PlaybackThread *dstThread, 491 bool reRegister); 492 // return thread associated with primary hardware device, or NULL 493 PlaybackThread *primaryPlaybackThread_l() const; 494 audio_devices_t primaryOutputDevice_l() const; 495 496 sp<PlaybackThread> getEffectThread_l(int sessionId, int EffectId); 497 498 499 void removeClient_l(pid_t pid); 500 void removeNotificationClient(pid_t pid); 501 bool isNonOffloadableGlobalEffectEnabled_l(); 502 void onNonOffloadableGlobalEffectEnable(); 503 504 class AudioHwDevice { 505 public: 506 enum Flags { 507 AHWD_CAN_SET_MASTER_VOLUME = 0x1, 508 AHWD_CAN_SET_MASTER_MUTE = 0x2, 509 }; 510 511 AudioHwDevice(const char *moduleName, 512 audio_hw_device_t *hwDevice, 513 Flags flags) 514 : mModuleName(strdup(moduleName)) 515 , mHwDevice(hwDevice) 516 , mFlags(flags) { } 517 /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); } 518 519 bool canSetMasterVolume() const { 520 return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME)); 521 } 522 523 bool canSetMasterMute() const { 524 return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE)); 525 } 526 527 const char *moduleName() const { return mModuleName; } 528 audio_hw_device_t *hwDevice() const { return mHwDevice; } 529 uint32_t version() const { return mHwDevice->common.version; } 530 531 private: 532 const char * const mModuleName; 533 audio_hw_device_t * const mHwDevice; 534 const Flags mFlags; 535 }; 536 537 // AudioStreamOut and AudioStreamIn are immutable, so their fields are const. 538 // For emphasis, we could also make all pointers to them be "const *", 539 // but that would clutter the code unnecessarily. 540 541 struct AudioStreamOut { 542 AudioHwDevice* const audioHwDev; 543 audio_stream_out_t* const stream; 544 const audio_output_flags_t flags; 545 546 audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); } 547 548 AudioStreamOut(AudioHwDevice *dev, audio_stream_out_t *out, audio_output_flags_t flags) : 549 audioHwDev(dev), stream(out), flags(flags) {} 550 }; 551 552 struct AudioStreamIn { 553 AudioHwDevice* const audioHwDev; 554 audio_stream_in_t* const stream; 555 556 audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); } 557 558 AudioStreamIn(AudioHwDevice *dev, audio_stream_in_t *in) : 559 audioHwDev(dev), stream(in) {} 560 }; 561 562 // for mAudioSessionRefs only 563 struct AudioSessionRef { 564 AudioSessionRef(int sessionid, pid_t pid) : 565 mSessionid(sessionid), mPid(pid), mCnt(1) {} 566 const int mSessionid; 567 const pid_t mPid; 568 int mCnt; 569 }; 570 571 mutable Mutex mLock; 572 // protects mClients and mNotificationClients. 573 // must be locked after mLock and ThreadBase::mLock if both must be locked 574 // avoids acquiring AudioFlinger::mLock from inside thread loop. 575 mutable Mutex mClientLock; 576 // protected by mClientLock 577 DefaultKeyedVector< pid_t, wp<Client> > mClients; // see ~Client() 578 579 mutable Mutex mHardwareLock; 580 // NOTE: If both mLock and mHardwareLock mutexes must be held, 581 // always take mLock before mHardwareLock 582 583 // These two fields are immutable after onFirstRef(), so no lock needed to access 584 AudioHwDevice* mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL 585 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*> mAudioHwDevs; 586 587 // for dump, indicates which hardware operation is currently in progress (but not stream ops) 588 enum hardware_call_state { 589 AUDIO_HW_IDLE = 0, // no operation in progress 590 AUDIO_HW_INIT, // init_check 591 AUDIO_HW_OUTPUT_OPEN, // open_output_stream 592 AUDIO_HW_OUTPUT_CLOSE, // unused 593 AUDIO_HW_INPUT_OPEN, // unused 594 AUDIO_HW_INPUT_CLOSE, // unused 595 AUDIO_HW_STANDBY, // unused 596 AUDIO_HW_SET_MASTER_VOLUME, // set_master_volume 597 AUDIO_HW_GET_ROUTING, // unused 598 AUDIO_HW_SET_ROUTING, // unused 599 AUDIO_HW_GET_MODE, // unused 600 AUDIO_HW_SET_MODE, // set_mode 601 AUDIO_HW_GET_MIC_MUTE, // get_mic_mute 602 AUDIO_HW_SET_MIC_MUTE, // set_mic_mute 603 AUDIO_HW_SET_VOICE_VOLUME, // set_voice_volume 604 AUDIO_HW_SET_PARAMETER, // set_parameters 605 AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size 606 AUDIO_HW_GET_MASTER_VOLUME, // get_master_volume 607 AUDIO_HW_GET_PARAMETER, // get_parameters 608 AUDIO_HW_SET_MASTER_MUTE, // set_master_mute 609 AUDIO_HW_GET_MASTER_MUTE, // get_master_mute 610 }; 611 612 mutable hardware_call_state mHardwareStatus; // for dump only 613 614 615 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> > mPlaybackThreads; 616 stream_type_t mStreamTypes[AUDIO_STREAM_CNT]; 617 618 // member variables below are protected by mLock 619 float mMasterVolume; 620 bool mMasterMute; 621 // end of variables protected by mLock 622 623 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> > mRecordThreads; 624 625 // protected by mClientLock 626 DefaultKeyedVector< pid_t, sp<NotificationClient> > mNotificationClients; 627 628 volatile int32_t mNextUniqueId; // updated by android_atomic_inc 629 // nextUniqueId() returns uint32_t, but this is declared int32_t 630 // because the atomic operations require an int32_t 631 632 audio_mode_t mMode; 633 bool mBtNrecIsOff; 634 635 // protected by mLock 636 Vector<AudioSessionRef*> mAudioSessionRefs; 637 638 float masterVolume_l() const; 639 bool masterMute_l() const; 640 audio_module_handle_t loadHwModule_l(const char *name); 641 642 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session 643 // to be created 644 645private: 646 sp<Client> registerPid(pid_t pid); // always returns non-0 647 648 // for use from destructor 649 status_t closeOutput_nonvirtual(audio_io_handle_t output); 650 status_t closeInput_nonvirtual(audio_io_handle_t input); 651 652#ifdef TEE_SINK 653 // all record threads serially share a common tee sink, which is re-created on format change 654 sp<NBAIO_Sink> mRecordTeeSink; 655 sp<NBAIO_Source> mRecordTeeSource; 656#endif 657 658public: 659 660#ifdef TEE_SINK 661 // tee sink, if enabled by property, allows dumpsys to write most recent audio to .wav file 662 static void dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id = 0); 663 664 // whether tee sink is enabled by property 665 static bool mTeeSinkInputEnabled; 666 static bool mTeeSinkOutputEnabled; 667 static bool mTeeSinkTrackEnabled; 668 669 // runtime configured size of each tee sink pipe, in frames 670 static size_t mTeeSinkInputFrames; 671 static size_t mTeeSinkOutputFrames; 672 static size_t mTeeSinkTrackFrames; 673 674 // compile-time default size of tee sink pipes, in frames 675 // 0x200000 stereo 16-bit PCM frames = 47.5 seconds at 44.1 kHz, 8 megabytes 676 static const size_t kTeeSinkInputFramesDefault = 0x200000; 677 static const size_t kTeeSinkOutputFramesDefault = 0x200000; 678 static const size_t kTeeSinkTrackFramesDefault = 0x200000; 679#endif 680 681 // This method reads from a variable without mLock, but the variable is updated under mLock. So 682 // we might read a stale value, or a value that's inconsistent with respect to other variables. 683 // In this case, it's safe because the return value isn't used for making an important decision. 684 // The reason we don't want to take mLock is because it could block the caller for a long time. 685 bool isLowRamDevice() const { return mIsLowRamDevice; } 686 687private: 688 bool mIsLowRamDevice; 689 bool mIsDeviceTypeKnown; 690 nsecs_t mGlobalEffectEnableTime; // when a global effect was last enabled 691 692 sp<PatchPanel> mPatchPanel; 693}; 694 695#undef INCLUDING_FROM_AUDIOFLINGER_H 696 697const char *formatToString(audio_format_t format); 698 699// ---------------------------------------------------------------------------- 700 701}; // namespace android 702 703#endif // ANDROID_AUDIO_FLINGER_H 704