1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_AUDIOPOLICYSERVICE_H 18 #define ANDROID_AUDIOPOLICYSERVICE_H 19 20 #include <cutils/misc.h> 21 #include <cutils/config_utils.h> 22 #include <cutils/compiler.h> 23 #include <utils/String8.h> 24 #include <utils/Vector.h> 25 #include <utils/SortedVector.h> 26 #include <binder/BinderService.h> 27 #include <binder/IUidObserver.h> 28 #include <system/audio.h> 29 #include <system/audio_policy.h> 30 #include <media/IAudioPolicyService.h> 31 #include <media/ToneGenerator.h> 32 #include <media/AudioEffect.h> 33 #include <media/AudioPolicy.h> 34 #include "AudioPolicyEffects.h" 35 #include "managerdefault/AudioPolicyManager.h" 36 37 #include <unordered_map> 38 39 namespace android { 40 41 using namespace std; 42 43 // ---------------------------------------------------------------------------- 44 45 class AudioPolicyService : 46 public BinderService<AudioPolicyService>, 47 public BnAudioPolicyService, 48 public IBinder::DeathRecipient 49 { 50 friend class BinderService<AudioPolicyService>; 51 52 public: 53 // for BinderService getServiceName()54 static const char *getServiceName() ANDROID_API { return "media.audio_policy"; } 55 56 virtual status_t dump(int fd, const Vector<String16>& args); 57 58 // 59 // BnAudioPolicyService (see AudioPolicyInterface for method descriptions) 60 // 61 62 virtual status_t setDeviceConnectionState(audio_devices_t device, 63 audio_policy_dev_state_t state, 64 const char *device_address, 65 const char *device_name); 66 virtual audio_policy_dev_state_t getDeviceConnectionState( 67 audio_devices_t device, 68 const char *device_address); 69 virtual status_t handleDeviceConfigChange(audio_devices_t device, 70 const char *device_address, 71 const char *device_name); 72 virtual status_t setPhoneState(audio_mode_t state); 73 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config); 74 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage); 75 virtual audio_io_handle_t getOutput(audio_stream_type_t stream); 76 virtual status_t getOutputForAttr(const audio_attributes_t *attr, 77 audio_io_handle_t *output, 78 audio_session_t session, 79 audio_stream_type_t *stream, 80 pid_t pid, 81 uid_t uid, 82 const audio_config_t *config, 83 audio_output_flags_t flags, 84 audio_port_handle_t *selectedDeviceId, 85 audio_port_handle_t *portId); 86 virtual status_t startOutput(audio_io_handle_t output, 87 audio_stream_type_t stream, 88 audio_session_t session); 89 virtual status_t stopOutput(audio_io_handle_t output, 90 audio_stream_type_t stream, 91 audio_session_t session); 92 virtual void releaseOutput(audio_io_handle_t output, 93 audio_stream_type_t stream, 94 audio_session_t session); 95 virtual status_t getInputForAttr(const audio_attributes_t *attr, 96 audio_io_handle_t *input, 97 audio_session_t session, 98 pid_t pid, 99 uid_t uid, 100 const String16& opPackageName, 101 const audio_config_base_t *config, 102 audio_input_flags_t flags, 103 audio_port_handle_t *selectedDeviceId = NULL, 104 audio_port_handle_t *portId = NULL); 105 virtual status_t startInput(audio_port_handle_t portId, 106 bool *silenced); 107 virtual status_t stopInput(audio_port_handle_t portId); 108 virtual void releaseInput(audio_port_handle_t portId); 109 virtual status_t initStreamVolume(audio_stream_type_t stream, 110 int indexMin, 111 int indexMax); 112 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 113 int index, 114 audio_devices_t device); 115 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 116 int *index, 117 audio_devices_t device); 118 119 virtual uint32_t getStrategyForStream(audio_stream_type_t stream); 120 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream); 121 122 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc); 123 virtual status_t registerEffect(const effect_descriptor_t *desc, 124 audio_io_handle_t io, 125 uint32_t strategy, 126 audio_session_t session, 127 int id); 128 virtual status_t unregisterEffect(int id); 129 virtual status_t setEffectEnabled(int id, bool enabled); 130 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 131 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 132 virtual bool isSourceActive(audio_source_t source) const; 133 134 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 135 effect_descriptor_t *descriptors, 136 uint32_t *count); 137 virtual status_t onTransact( 138 uint32_t code, 139 const Parcel& data, 140 Parcel* reply, 141 uint32_t flags); 142 143 // IBinder::DeathRecipient 144 virtual void binderDied(const wp<IBinder>& who); 145 146 // RefBase 147 virtual void onFirstRef(); 148 149 // 150 // Helpers for the struct audio_policy_service_ops implementation. 151 // This is used by the audio policy manager for certain operations that 152 // are implemented by the policy service. 153 // 154 virtual void setParameters(audio_io_handle_t ioHandle, 155 const char *keyValuePairs, 156 int delayMs); 157 158 virtual status_t setStreamVolume(audio_stream_type_t stream, 159 float volume, 160 audio_io_handle_t output, 161 int delayMs = 0); 162 virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 163 virtual status_t stopTone(); 164 virtual status_t setVoiceVolume(float volume, int delayMs = 0); 165 virtual bool isOffloadSupported(const audio_offload_info_t &config); 166 167 virtual status_t listAudioPorts(audio_port_role_t role, 168 audio_port_type_t type, 169 unsigned int *num_ports, 170 struct audio_port *ports, 171 unsigned int *generation); 172 virtual status_t getAudioPort(struct audio_port *port); 173 virtual status_t createAudioPatch(const struct audio_patch *patch, 174 audio_patch_handle_t *handle); 175 virtual status_t releaseAudioPatch(audio_patch_handle_t handle); 176 virtual status_t listAudioPatches(unsigned int *num_patches, 177 struct audio_patch *patches, 178 unsigned int *generation); 179 virtual status_t setAudioPortConfig(const struct audio_port_config *config); 180 181 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client); 182 183 virtual void setAudioPortCallbacksEnabled(bool enabled); 184 185 virtual status_t acquireSoundTriggerSession(audio_session_t *session, 186 audio_io_handle_t *ioHandle, 187 audio_devices_t *device); 188 189 virtual status_t releaseSoundTriggerSession(audio_session_t session); 190 191 virtual audio_mode_t getPhoneState(); 192 193 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration); 194 195 virtual status_t startAudioSource(const struct audio_port_config *source, 196 const audio_attributes_t *attributes, 197 audio_patch_handle_t *handle); 198 virtual status_t stopAudioSource(audio_patch_handle_t handle); 199 200 virtual status_t setMasterMono(bool mono); 201 virtual status_t getMasterMono(bool *mono); 202 203 virtual float getStreamVolumeDB( 204 audio_stream_type_t stream, int index, audio_devices_t device); 205 206 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats, 207 audio_format_t *surroundFormats, 208 bool *surroundFormatsEnabled, 209 bool reported); 210 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled); 211 212 status_t doStopOutput(audio_io_handle_t output, 213 audio_stream_type_t stream, 214 audio_session_t session); 215 void doReleaseOutput(audio_io_handle_t output, 216 audio_stream_type_t stream, 217 audio_session_t session); 218 219 status_t clientCreateAudioPatch(const struct audio_patch *patch, 220 audio_patch_handle_t *handle, 221 int delayMs); 222 status_t clientReleaseAudioPatch(audio_patch_handle_t handle, 223 int delayMs); 224 virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config, 225 int delayMs); 226 227 void removeNotificationClient(uid_t uid); 228 void onAudioPortListUpdate(); 229 void doOnAudioPortListUpdate(); 230 void onAudioPatchListUpdate(); 231 void doOnAudioPatchListUpdate(); 232 233 void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 234 void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 235 void onRecordingConfigurationUpdate(int event, const record_client_info_t *clientInfo, 236 const audio_config_base_t *clientConfig, 237 const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 238 void doOnRecordingConfigurationUpdate(int event, const record_client_info_t *clientInfo, 239 const audio_config_base_t *clientConfig, 240 const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 241 242 private: 243 AudioPolicyService() ANDROID_API; 244 virtual ~AudioPolicyService(); 245 246 status_t dumpInternals(int fd); 247 248 // Handles binder shell commands 249 virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args); 250 251 // Sets whether the given UID records only silence 252 virtual void setRecordSilenced(uid_t uid, bool silenced); 253 254 // Overrides the UID state as if it is idle 255 status_t handleSetUidState(Vector<String16>& args, int err); 256 257 // Clears the override for the UID state 258 status_t handleResetUidState(Vector<String16>& args, int err); 259 260 // Gets the UID state 261 status_t handleGetUidState(Vector<String16>& args, int out, int err); 262 263 // Prints the shell command help 264 status_t printHelp(int out); 265 266 std::string getDeviceTypeStrForPortId(audio_port_handle_t portId); 267 268 // If recording we need to make sure the UID is allowed to do that. If the UID is idle 269 // then it cannot record and gets buffers with zeros - silence. As soon as the UID 270 // transitions to an active state we will start reporting buffers with data. This approach 271 // transparently handles recording while the UID transitions between idle/active state 272 // avoiding to get stuck in a state receiving non-empty buffers while idle or in a state 273 // receiving empty buffers while active. 274 class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient { 275 public: UidPolicy(wp<AudioPolicyService> service)276 explicit UidPolicy(wp<AudioPolicyService> service) 277 : mService(service), mObserverRegistered(false) {} 278 279 void registerSelf(); 280 void unregisterSelf(); 281 282 // IBinder::DeathRecipient implementation 283 void binderDied(const wp<IBinder> &who) override; 284 285 bool isUidActive(uid_t uid); 286 287 // BnUidObserver implementation 288 void onUidActive(uid_t uid) override; 289 void onUidGone(uid_t uid, bool disabled) override; 290 void onUidIdle(uid_t uid, bool disabled) override; 291 addOverrideUid(uid_t uid,bool active)292 void addOverrideUid(uid_t uid, bool active) { updateOverrideUid(uid, active, true); } removeOverrideUid(uid_t uid)293 void removeOverrideUid(uid_t uid) { updateOverrideUid(uid, false, false); } 294 295 private: 296 bool isServiceUid(uid_t uid) const; 297 void notifyService(uid_t uid, bool active); 298 void updateOverrideUid(uid_t uid, bool active, bool insert); 299 void updateUidCache(uid_t uid, bool active, bool insert); 300 void updateUidLocked(std::unordered_map<uid_t, bool> *uids, 301 uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive); 302 303 wp<AudioPolicyService> mService; 304 Mutex mLock; 305 bool mObserverRegistered; 306 std::unordered_map<uid_t, bool> mOverrideUids; 307 std::unordered_map<uid_t, bool> mCachedUids; 308 }; 309 310 // Thread used for tone playback and to send audio config commands to audio flinger 311 // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because 312 // startTone() and stopTone() are normally called with mLock locked and requesting a tone start 313 // or stop will cause calls to AudioPolicyService and an attempt to lock mLock. 314 // For audio config commands, it is necessary because audio flinger requires that the calling 315 // process (user) has permission to modify audio settings. 316 class AudioCommandThread : public Thread { 317 class AudioCommand; 318 public: 319 320 // commands for tone AudioCommand 321 enum { 322 START_TONE, 323 STOP_TONE, 324 SET_VOLUME, 325 SET_PARAMETERS, 326 SET_VOICE_VOLUME, 327 STOP_OUTPUT, 328 RELEASE_OUTPUT, 329 CREATE_AUDIO_PATCH, 330 RELEASE_AUDIO_PATCH, 331 UPDATE_AUDIOPORT_LIST, 332 UPDATE_AUDIOPATCH_LIST, 333 SET_AUDIOPORT_CONFIG, 334 DYN_POLICY_MIX_STATE_UPDATE, 335 RECORDING_CONFIGURATION_UPDATE 336 }; 337 338 AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); 339 virtual ~AudioCommandThread(); 340 341 status_t dump(int fd); 342 343 // Thread virtuals 344 virtual void onFirstRef(); 345 virtual bool threadLoop(); 346 347 void exit(); 348 void startToneCommand(ToneGenerator::tone_type type, 349 audio_stream_type_t stream); 350 void stopToneCommand(); 351 status_t volumeCommand(audio_stream_type_t stream, float volume, 352 audio_io_handle_t output, int delayMs = 0); 353 status_t parametersCommand(audio_io_handle_t ioHandle, 354 const char *keyValuePairs, int delayMs = 0); 355 status_t voiceVolumeCommand(float volume, int delayMs = 0); 356 void stopOutputCommand(audio_io_handle_t output, 357 audio_stream_type_t stream, 358 audio_session_t session); 359 void releaseOutputCommand(audio_io_handle_t output, 360 audio_stream_type_t stream, 361 audio_session_t session); 362 status_t sendCommand(sp<AudioCommand>& command, int delayMs = 0); 363 void insertCommand_l(sp<AudioCommand>& command, int delayMs = 0); 364 status_t createAudioPatchCommand(const struct audio_patch *patch, 365 audio_patch_handle_t *handle, 366 int delayMs); 367 status_t releaseAudioPatchCommand(audio_patch_handle_t handle, 368 int delayMs); 369 void updateAudioPortListCommand(); 370 void updateAudioPatchListCommand(); 371 status_t setAudioPortConfigCommand(const struct audio_port_config *config, 372 int delayMs); 373 void dynamicPolicyMixStateUpdateCommand(const String8& regId, int32_t state); 374 void recordingConfigurationUpdateCommand( 375 int event, 376 const record_client_info_t *clientInfo, 377 const audio_config_base_t *clientConfig, 378 const audio_config_base_t *deviceConfig, 379 audio_patch_handle_t patchHandle); 380 void insertCommand_l(AudioCommand *command, int delayMs = 0); 381 private: 382 class AudioCommandData; 383 384 // descriptor for requested tone playback event 385 class AudioCommand: public RefBase { 386 387 public: AudioCommand()388 AudioCommand() 389 : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {} 390 391 void dump(char* buffer, size_t size); 392 393 int mCommand; // START_TONE, STOP_TONE ... 394 nsecs_t mTime; // time stamp 395 Mutex mLock; // mutex associated to mCond 396 Condition mCond; // condition for status return 397 status_t mStatus; // command status 398 bool mWaitStatus; // true if caller is waiting for status 399 sp<AudioCommandData> mParam; // command specific parameter data 400 }; 401 402 class AudioCommandData: public RefBase { 403 public: ~AudioCommandData()404 virtual ~AudioCommandData() {} 405 protected: AudioCommandData()406 AudioCommandData() {} 407 }; 408 409 class ToneData : public AudioCommandData { 410 public: 411 ToneGenerator::tone_type mType; // tone type (START_TONE only) 412 audio_stream_type_t mStream; // stream type (START_TONE only) 413 }; 414 415 class VolumeData : public AudioCommandData { 416 public: 417 audio_stream_type_t mStream; 418 float mVolume; 419 audio_io_handle_t mIO; 420 }; 421 422 class ParametersData : public AudioCommandData { 423 public: 424 audio_io_handle_t mIO; 425 String8 mKeyValuePairs; 426 }; 427 428 class VoiceVolumeData : public AudioCommandData { 429 public: 430 float mVolume; 431 }; 432 433 class StopOutputData : public AudioCommandData { 434 public: 435 audio_io_handle_t mIO; 436 audio_stream_type_t mStream; 437 audio_session_t mSession; 438 }; 439 440 class ReleaseOutputData : public AudioCommandData { 441 public: 442 audio_io_handle_t mIO; 443 audio_stream_type_t mStream; 444 audio_session_t mSession; 445 }; 446 447 class CreateAudioPatchData : public AudioCommandData { 448 public: 449 struct audio_patch mPatch; 450 audio_patch_handle_t mHandle; 451 }; 452 453 class ReleaseAudioPatchData : public AudioCommandData { 454 public: 455 audio_patch_handle_t mHandle; 456 }; 457 458 class SetAudioPortConfigData : public AudioCommandData { 459 public: 460 struct audio_port_config mConfig; 461 }; 462 463 class DynPolicyMixStateUpdateData : public AudioCommandData { 464 public: 465 String8 mRegId; 466 int32_t mState; 467 }; 468 469 class RecordingConfigurationUpdateData : public AudioCommandData { 470 public: 471 int mEvent; 472 record_client_info_t mClientInfo; 473 struct audio_config_base mClientConfig; 474 struct audio_config_base mDeviceConfig; 475 audio_patch_handle_t mPatchHandle; 476 }; 477 478 Mutex mLock; 479 Condition mWaitWorkCV; 480 Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands 481 ToneGenerator *mpToneGenerator; // the tone generator 482 sp<AudioCommand> mLastCommand; // last processed command (used by dump) 483 String8 mName; // string used by wake lock fo delayed commands 484 wp<AudioPolicyService> mService; 485 }; 486 487 class AudioPolicyClient : public AudioPolicyClientInterface 488 { 489 public: AudioPolicyClient(AudioPolicyService * service)490 explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {} ~AudioPolicyClient()491 virtual ~AudioPolicyClient() {} 492 493 // 494 // Audio HW module functions 495 // 496 497 // loads a HW module. 498 virtual audio_module_handle_t loadHwModule(const char *name); 499 500 // 501 // Audio output Control functions 502 // 503 504 // opens an audio output with the requested parameters. The parameter values can indicate to use the default values 505 // in case the audio policy manager has no specific requirements for the output being opened. 506 // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream. 507 // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly. 508 virtual status_t openOutput(audio_module_handle_t module, 509 audio_io_handle_t *output, 510 audio_config_t *config, 511 audio_devices_t *devices, 512 const String8& address, 513 uint32_t *latencyMs, 514 audio_output_flags_t flags); 515 // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by 516 // a special mixer thread in the AudioFlinger. 517 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2); 518 // closes the output stream 519 virtual status_t closeOutput(audio_io_handle_t output); 520 // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in 521 // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded. 522 virtual status_t suspendOutput(audio_io_handle_t output); 523 // restores a suspended output. 524 virtual status_t restoreOutput(audio_io_handle_t output); 525 526 // 527 // Audio input Control functions 528 // 529 530 // opens an audio input 531 virtual audio_io_handle_t openInput(audio_module_handle_t module, 532 audio_io_handle_t *input, 533 audio_config_t *config, 534 audio_devices_t *devices, 535 const String8& address, 536 audio_source_t source, 537 audio_input_flags_t flags); 538 // closes an audio input 539 virtual status_t closeInput(audio_io_handle_t input); 540 // 541 // misc control functions 542 // 543 544 // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes 545 // for each output (destination device) it is attached to. 546 virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0); 547 548 // invalidate a stream type, causing a reroute to an unspecified new output 549 virtual status_t invalidateStream(audio_stream_type_t stream); 550 551 // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface. 552 virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0); 553 // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager. 554 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys); 555 556 // request the playback of a tone on the specified stream: used for instance to replace notification sounds when playing 557 // over a telephony device during a phone call. 558 virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 559 virtual status_t stopTone(); 560 561 // set down link audio volume. 562 virtual status_t setVoiceVolume(float volume, int delayMs = 0); 563 564 // move effect to the specified output 565 virtual status_t moveEffects(audio_session_t session, 566 audio_io_handle_t srcOutput, 567 audio_io_handle_t dstOutput); 568 569 /* Create a patch between several source and sink ports */ 570 virtual status_t createAudioPatch(const struct audio_patch *patch, 571 audio_patch_handle_t *handle, 572 int delayMs); 573 574 /* Release a patch */ 575 virtual status_t releaseAudioPatch(audio_patch_handle_t handle, 576 int delayMs); 577 578 /* Set audio port configuration */ 579 virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs); 580 581 virtual void onAudioPortListUpdate(); 582 virtual void onAudioPatchListUpdate(); 583 virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); 584 virtual void onRecordingConfigurationUpdate(int event, 585 const record_client_info_t *clientInfo, 586 const audio_config_base_t *clientConfig, 587 const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle); 588 589 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use); 590 591 private: 592 AudioPolicyService *mAudioPolicyService; 593 }; 594 595 // --- Notification Client --- 596 class NotificationClient : public IBinder::DeathRecipient { 597 public: 598 NotificationClient(const sp<AudioPolicyService>& service, 599 const sp<IAudioPolicyServiceClient>& client, 600 uid_t uid); 601 virtual ~NotificationClient(); 602 603 void onAudioPortListUpdate(); 604 void onAudioPatchListUpdate(); 605 void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 606 void onRecordingConfigurationUpdate( 607 int event, const record_client_info_t *clientInfo, 608 const audio_config_base_t *clientConfig, 609 const audio_config_base_t *deviceConfig, 610 audio_patch_handle_t patchHandle); 611 void setAudioPortCallbacksEnabled(bool enabled); 612 613 // IBinder::DeathRecipient 614 virtual void binderDied(const wp<IBinder>& who); 615 616 private: 617 NotificationClient(const NotificationClient&); 618 NotificationClient& operator = (const NotificationClient&); 619 620 const wp<AudioPolicyService> mService; 621 const uid_t mUid; 622 const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient; 623 bool mAudioPortCallbacksEnabled; 624 }; 625 626 // --- AudioRecordClient --- 627 // Information about each registered AudioRecord client 628 // (between calls to getInputForAttr() and releaseInput()) 629 class AudioRecordClient : public RefBase { 630 public: AudioRecordClient(const audio_attributes_t attributes,const audio_io_handle_t input,uid_t uid,pid_t pid,const String16 & opPackageName,const audio_session_t session)631 AudioRecordClient(const audio_attributes_t attributes, 632 const audio_io_handle_t input, uid_t uid, pid_t pid, 633 const String16& opPackageName, const audio_session_t session) : 634 attributes(attributes), 635 input(input), uid(uid), pid(pid), 636 opPackageName(opPackageName), session(session), 637 active(false), isConcurrent(false), isVirtualDevice(false) {} ~AudioRecordClient()638 virtual ~AudioRecordClient() {} 639 640 const audio_attributes_t attributes; // source, flags ... 641 const audio_io_handle_t input; // audio HAL input IO handle 642 const uid_t uid; // client UID 643 const pid_t pid; // client PID 644 const String16 opPackageName; // client package name 645 const audio_session_t session; // audio session ID 646 bool active; // Capture is active or inactive 647 bool isConcurrent; // is allowed to concurrent capture 648 bool isVirtualDevice; // uses virtual device: updated by APM::getInputForAttr() 649 audio_port_handle_t deviceId; // selected input device port ID 650 }; 651 652 // A class automatically clearing and restoring binder caller identity inside 653 // a code block (scoped variable) 654 // Declare one systematically before calling AudioPolicyManager methods so that they are 655 // executed with the same level of privilege as audioserver process. 656 class AutoCallerClear { 657 public: AutoCallerClear()658 AutoCallerClear() : 659 mToken(IPCThreadState::self()->clearCallingIdentity()) {} ~AutoCallerClear()660 ~AutoCallerClear() { 661 IPCThreadState::self()->restoreCallingIdentity(mToken); 662 } 663 664 private: 665 const int64_t mToken; 666 }; 667 668 // Internal dump utilities. 669 status_t dumpPermissionDenial(int fd); 670 671 672 mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing 673 // device connection state or routing 674 mutable Mutex mEffectsLock; // serialize access to Effect state within APM. 675 // Note: lock acquisition order is always mLock > mEffectsLock: 676 // mLock protects AudioPolicyManager methods that can call into audio flinger 677 // and possibly back in to audio policy service and acquire mEffectsLock. 678 sp<AudioCommandThread> mAudioCommandThread; // audio commands thread 679 sp<AudioCommandThread> mTonePlaybackThread; // tone playback thread 680 sp<AudioCommandThread> mOutputCommandThread; // process stop and release output 681 struct audio_policy_device *mpAudioPolicyDev; 682 struct audio_policy *mpAudioPolicy; 683 AudioPolicyInterface *mAudioPolicyManager; 684 AudioPolicyClient *mAudioPolicyClient; 685 686 DefaultKeyedVector< uid_t, sp<NotificationClient> > mNotificationClients; 687 Mutex mNotificationClientsLock; // protects mNotificationClients 688 // Manage all effects configured in audio_effects.conf 689 sp<AudioPolicyEffects> mAudioPolicyEffects; 690 audio_mode_t mPhoneState; 691 692 sp<UidPolicy> mUidPolicy; 693 DefaultKeyedVector< audio_port_handle_t, sp<AudioRecordClient> > mAudioRecordClients; 694 }; 695 696 } // namespace android 697 698 #endif // ANDROID_AUDIOPOLICYSERVICE_H 699