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 <system/audio.h> 28 #include <system/audio_policy.h> 29 #include <hardware/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 <hardware_legacy/AudioPolicyInterface.h> 35 #include "AudioPolicyEffects.h" 36 #include "AudioPolicyManager.h" 37 38 39 namespace android { 40 41 // ---------------------------------------------------------------------------- 42 43 class AudioPolicyService : 44 public BinderService<AudioPolicyService>, 45 public BnAudioPolicyService, 46 public IBinder::DeathRecipient 47 { 48 friend class BinderService<AudioPolicyService>; 49 50 public: 51 // for BinderService 52 static const char *getServiceName() ANDROID_API { return "media.audio_policy"; } 53 54 virtual status_t dump(int fd, const Vector<String16>& args); 55 56 // 57 // BnAudioPolicyService (see AudioPolicyInterface for method descriptions) 58 // 59 60 virtual status_t setDeviceConnectionState(audio_devices_t device, 61 audio_policy_dev_state_t state, 62 const char *device_address); 63 virtual audio_policy_dev_state_t getDeviceConnectionState( 64 audio_devices_t device, 65 const char *device_address); 66 virtual status_t setPhoneState(audio_mode_t state); 67 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config); 68 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage); 69 virtual audio_io_handle_t getOutput(audio_stream_type_t stream, 70 uint32_t samplingRate = 0, 71 audio_format_t format = AUDIO_FORMAT_DEFAULT, 72 audio_channel_mask_t channelMask = 0, 73 audio_output_flags_t flags = 74 AUDIO_OUTPUT_FLAG_NONE, 75 const audio_offload_info_t *offloadInfo = NULL); 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 uint32_t samplingRate = 0, 81 audio_format_t format = AUDIO_FORMAT_DEFAULT, 82 audio_channel_mask_t channelMask = 0, 83 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, 84 const audio_offload_info_t *offloadInfo = NULL); 85 virtual status_t startOutput(audio_io_handle_t output, 86 audio_stream_type_t stream, 87 audio_session_t session); 88 virtual status_t stopOutput(audio_io_handle_t output, 89 audio_stream_type_t stream, 90 audio_session_t session); 91 virtual void releaseOutput(audio_io_handle_t output, 92 audio_stream_type_t stream, 93 audio_session_t session); 94 virtual status_t getInputForAttr(const audio_attributes_t *attr, 95 audio_io_handle_t *input, 96 audio_session_t session, 97 uint32_t samplingRate, 98 audio_format_t format, 99 audio_channel_mask_t channelMask, 100 audio_input_flags_t flags); 101 virtual status_t startInput(audio_io_handle_t input, 102 audio_session_t session); 103 virtual status_t stopInput(audio_io_handle_t input, 104 audio_session_t session); 105 virtual void releaseInput(audio_io_handle_t input, 106 audio_session_t session); 107 virtual status_t initStreamVolume(audio_stream_type_t stream, 108 int indexMin, 109 int indexMax); 110 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 111 int index, 112 audio_devices_t device); 113 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 114 int *index, 115 audio_devices_t device); 116 117 virtual uint32_t getStrategyForStream(audio_stream_type_t stream); 118 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream); 119 120 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc); 121 virtual status_t registerEffect(const effect_descriptor_t *desc, 122 audio_io_handle_t io, 123 uint32_t strategy, 124 int session, 125 int id); 126 virtual status_t unregisterEffect(int id); 127 virtual status_t setEffectEnabled(int id, bool enabled); 128 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 129 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const; 130 virtual bool isSourceActive(audio_source_t source) const; 131 132 virtual status_t queryDefaultPreProcessing(int audioSession, 133 effect_descriptor_t *descriptors, 134 uint32_t *count); 135 virtual status_t onTransact( 136 uint32_t code, 137 const Parcel& data, 138 Parcel* reply, 139 uint32_t flags); 140 141 // IBinder::DeathRecipient 142 virtual void binderDied(const wp<IBinder>& who); 143 144 // RefBase 145 virtual void onFirstRef(); 146 147 // 148 // Helpers for the struct audio_policy_service_ops implementation. 149 // This is used by the audio policy manager for certain operations that 150 // are implemented by the policy service. 151 // 152 virtual void setParameters(audio_io_handle_t ioHandle, 153 const char *keyValuePairs, 154 int delayMs); 155 156 virtual status_t setStreamVolume(audio_stream_type_t stream, 157 float volume, 158 audio_io_handle_t output, 159 int delayMs = 0); 160 virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 161 virtual status_t stopTone(); 162 virtual status_t setVoiceVolume(float volume, int delayMs = 0); 163 virtual bool isOffloadSupported(const audio_offload_info_t &config); 164 165 virtual status_t listAudioPorts(audio_port_role_t role, 166 audio_port_type_t type, 167 unsigned int *num_ports, 168 struct audio_port *ports, 169 unsigned int *generation); 170 virtual status_t getAudioPort(struct audio_port *port); 171 virtual status_t createAudioPatch(const struct audio_patch *patch, 172 audio_patch_handle_t *handle); 173 virtual status_t releaseAudioPatch(audio_patch_handle_t handle); 174 virtual status_t listAudioPatches(unsigned int *num_patches, 175 struct audio_patch *patches, 176 unsigned int *generation); 177 virtual status_t setAudioPortConfig(const struct audio_port_config *config); 178 179 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client); 180 181 virtual status_t acquireSoundTriggerSession(audio_session_t *session, 182 audio_io_handle_t *ioHandle, 183 audio_devices_t *device); 184 185 virtual status_t releaseSoundTriggerSession(audio_session_t session); 186 187 virtual audio_mode_t getPhoneState(); 188 189 virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration); 190 191 status_t doStopOutput(audio_io_handle_t output, 192 audio_stream_type_t stream, 193 audio_session_t session); 194 void doReleaseOutput(audio_io_handle_t output, 195 audio_stream_type_t stream, 196 audio_session_t session); 197 198 status_t clientCreateAudioPatch(const struct audio_patch *patch, 199 audio_patch_handle_t *handle, 200 int delayMs); 201 status_t clientReleaseAudioPatch(audio_patch_handle_t handle, 202 int delayMs); 203 virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config, 204 int delayMs); 205 206 void removeNotificationClient(uid_t uid); 207 void onAudioPortListUpdate(); 208 void doOnAudioPortListUpdate(); 209 void onAudioPatchListUpdate(); 210 void doOnAudioPatchListUpdate(); 211 212 private: 213 AudioPolicyService() ANDROID_API; 214 virtual ~AudioPolicyService(); 215 216 status_t dumpInternals(int fd); 217 218 // Thread used for tone playback and to send audio config commands to audio flinger 219 // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because 220 // startTone() and stopTone() are normally called with mLock locked and requesting a tone start 221 // or stop will cause calls to AudioPolicyService and an attempt to lock mLock. 222 // For audio config commands, it is necessary because audio flinger requires that the calling 223 // process (user) has permission to modify audio settings. 224 class AudioCommandThread : public Thread { 225 class AudioCommand; 226 public: 227 228 // commands for tone AudioCommand 229 enum { 230 START_TONE, 231 STOP_TONE, 232 SET_VOLUME, 233 SET_PARAMETERS, 234 SET_VOICE_VOLUME, 235 STOP_OUTPUT, 236 RELEASE_OUTPUT, 237 CREATE_AUDIO_PATCH, 238 RELEASE_AUDIO_PATCH, 239 UPDATE_AUDIOPORT_LIST, 240 UPDATE_AUDIOPATCH_LIST, 241 SET_AUDIOPORT_CONFIG, 242 }; 243 244 AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); 245 virtual ~AudioCommandThread(); 246 247 status_t dump(int fd); 248 249 // Thread virtuals 250 virtual void onFirstRef(); 251 virtual bool threadLoop(); 252 253 void exit(); 254 void startToneCommand(ToneGenerator::tone_type type, 255 audio_stream_type_t stream); 256 void stopToneCommand(); 257 status_t volumeCommand(audio_stream_type_t stream, float volume, 258 audio_io_handle_t output, int delayMs = 0); 259 status_t parametersCommand(audio_io_handle_t ioHandle, 260 const char *keyValuePairs, int delayMs = 0); 261 status_t voiceVolumeCommand(float volume, int delayMs = 0); 262 void stopOutputCommand(audio_io_handle_t output, 263 audio_stream_type_t stream, 264 audio_session_t session); 265 void releaseOutputCommand(audio_io_handle_t output, 266 audio_stream_type_t stream, 267 audio_session_t session); 268 status_t sendCommand(sp<AudioCommand>& command, int delayMs = 0); 269 void insertCommand_l(sp<AudioCommand>& command, int delayMs = 0); 270 status_t createAudioPatchCommand(const struct audio_patch *patch, 271 audio_patch_handle_t *handle, 272 int delayMs); 273 status_t releaseAudioPatchCommand(audio_patch_handle_t handle, 274 int delayMs); 275 void updateAudioPortListCommand(); 276 void updateAudioPatchListCommand(); 277 status_t setAudioPortConfigCommand(const struct audio_port_config *config, 278 int delayMs); 279 void insertCommand_l(AudioCommand *command, int delayMs = 0); 280 281 private: 282 class AudioCommandData; 283 284 // descriptor for requested tone playback event 285 class AudioCommand: public RefBase { 286 287 public: 288 AudioCommand() 289 : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {} 290 291 void dump(char* buffer, size_t size); 292 293 int mCommand; // START_TONE, STOP_TONE ... 294 nsecs_t mTime; // time stamp 295 Mutex mLock; // mutex associated to mCond 296 Condition mCond; // condition for status return 297 status_t mStatus; // command status 298 bool mWaitStatus; // true if caller is waiting for status 299 sp<AudioCommandData> mParam; // command specific parameter data 300 }; 301 302 class AudioCommandData: public RefBase { 303 public: 304 virtual ~AudioCommandData() {} 305 protected: 306 AudioCommandData() {} 307 }; 308 309 class ToneData : public AudioCommandData { 310 public: 311 ToneGenerator::tone_type mType; // tone type (START_TONE only) 312 audio_stream_type_t mStream; // stream type (START_TONE only) 313 }; 314 315 class VolumeData : public AudioCommandData { 316 public: 317 audio_stream_type_t mStream; 318 float mVolume; 319 audio_io_handle_t mIO; 320 }; 321 322 class ParametersData : public AudioCommandData { 323 public: 324 audio_io_handle_t mIO; 325 String8 mKeyValuePairs; 326 }; 327 328 class VoiceVolumeData : public AudioCommandData { 329 public: 330 float mVolume; 331 }; 332 333 class StopOutputData : public AudioCommandData { 334 public: 335 audio_io_handle_t mIO; 336 audio_stream_type_t mStream; 337 audio_session_t mSession; 338 }; 339 340 class ReleaseOutputData : public AudioCommandData { 341 public: 342 audio_io_handle_t mIO; 343 audio_stream_type_t mStream; 344 audio_session_t mSession; 345 }; 346 347 class CreateAudioPatchData : public AudioCommandData { 348 public: 349 struct audio_patch mPatch; 350 audio_patch_handle_t mHandle; 351 }; 352 353 class ReleaseAudioPatchData : public AudioCommandData { 354 public: 355 audio_patch_handle_t mHandle; 356 }; 357 358 class SetAudioPortConfigData : public AudioCommandData { 359 public: 360 struct audio_port_config mConfig; 361 }; 362 363 Mutex mLock; 364 Condition mWaitWorkCV; 365 Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands 366 ToneGenerator *mpToneGenerator; // the tone generator 367 sp<AudioCommand> mLastCommand; // last processed command (used by dump) 368 String8 mName; // string used by wake lock fo delayed commands 369 wp<AudioPolicyService> mService; 370 }; 371 372 class AudioPolicyClient : public AudioPolicyClientInterface 373 { 374 public: 375 AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {} 376 virtual ~AudioPolicyClient() {} 377 378 // 379 // Audio HW module functions 380 // 381 382 // loads a HW module. 383 virtual audio_module_handle_t loadHwModule(const char *name); 384 385 // 386 // Audio output Control functions 387 // 388 389 // opens an audio output with the requested parameters. The parameter values can indicate to use the default values 390 // in case the audio policy manager has no specific requirements for the output being opened. 391 // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream. 392 // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly. 393 virtual status_t openOutput(audio_module_handle_t module, 394 audio_io_handle_t *output, 395 audio_config_t *config, 396 audio_devices_t *devices, 397 const String8& address, 398 uint32_t *latencyMs, 399 audio_output_flags_t flags); 400 // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by 401 // a special mixer thread in the AudioFlinger. 402 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2); 403 // closes the output stream 404 virtual status_t closeOutput(audio_io_handle_t output); 405 // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in 406 // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded. 407 virtual status_t suspendOutput(audio_io_handle_t output); 408 // restores a suspended output. 409 virtual status_t restoreOutput(audio_io_handle_t output); 410 411 // 412 // Audio input Control functions 413 // 414 415 // opens an audio input 416 virtual audio_io_handle_t openInput(audio_module_handle_t module, 417 audio_io_handle_t *input, 418 audio_config_t *config, 419 audio_devices_t *devices, 420 const String8& address, 421 audio_source_t source, 422 audio_input_flags_t flags); 423 // closes an audio input 424 virtual status_t closeInput(audio_io_handle_t input); 425 // 426 // misc control functions 427 // 428 429 // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes 430 // for each output (destination device) it is attached to. 431 virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0); 432 433 // invalidate a stream type, causing a reroute to an unspecified new output 434 virtual status_t invalidateStream(audio_stream_type_t stream); 435 436 // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface. 437 virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0); 438 // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager. 439 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys); 440 441 // request the playback of a tone on the specified stream: used for instance to replace notification sounds when playing 442 // over a telephony device during a phone call. 443 virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream); 444 virtual status_t stopTone(); 445 446 // set down link audio volume. 447 virtual status_t setVoiceVolume(float volume, int delayMs = 0); 448 449 // move effect to the specified output 450 virtual status_t moveEffects(int session, 451 audio_io_handle_t srcOutput, 452 audio_io_handle_t dstOutput); 453 454 /* Create a patch between several source and sink ports */ 455 virtual status_t createAudioPatch(const struct audio_patch *patch, 456 audio_patch_handle_t *handle, 457 int delayMs); 458 459 /* Release a patch */ 460 virtual status_t releaseAudioPatch(audio_patch_handle_t handle, 461 int delayMs); 462 463 /* Set audio port configuration */ 464 virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs); 465 466 virtual void onAudioPortListUpdate(); 467 virtual void onAudioPatchListUpdate(); 468 469 virtual audio_unique_id_t newAudioUniqueId(); 470 471 private: 472 AudioPolicyService *mAudioPolicyService; 473 }; 474 475 // --- Notification Client --- 476 class NotificationClient : public IBinder::DeathRecipient { 477 public: 478 NotificationClient(const sp<AudioPolicyService>& service, 479 const sp<IAudioPolicyServiceClient>& client, 480 uid_t uid); 481 virtual ~NotificationClient(); 482 483 void onAudioPortListUpdate(); 484 void onAudioPatchListUpdate(); 485 486 // IBinder::DeathRecipient 487 virtual void binderDied(const wp<IBinder>& who); 488 489 private: 490 NotificationClient(const NotificationClient&); 491 NotificationClient& operator = (const NotificationClient&); 492 493 const wp<AudioPolicyService> mService; 494 const uid_t mUid; 495 const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient; 496 }; 497 498 // Internal dump utilities. 499 status_t dumpPermissionDenial(int fd); 500 501 502 mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing 503 // device connection state or routing 504 sp<AudioCommandThread> mAudioCommandThread; // audio commands thread 505 sp<AudioCommandThread> mTonePlaybackThread; // tone playback thread 506 sp<AudioCommandThread> mOutputCommandThread; // process stop and release output 507 struct audio_policy_device *mpAudioPolicyDev; 508 struct audio_policy *mpAudioPolicy; 509 AudioPolicyInterface *mAudioPolicyManager; 510 AudioPolicyClient *mAudioPolicyClient; 511 512 DefaultKeyedVector< uid_t, sp<NotificationClient> > mNotificationClients; 513 Mutex mNotificationClientsLock; // protects mNotificationClients 514 // Manage all effects configured in audio_effects.conf 515 sp<AudioPolicyEffects> mAudioPolicyEffects; 516 audio_mode_t mPhoneState; 517 }; 518 519 }; // namespace android 520 521 #endif // ANDROID_AUDIOPOLICYSERVICE_H 522