1 /* 2 * Copyright (C) 2006-2007 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 #define LOG_TAG "AudioSystem" 18 //#define LOG_NDEBUG 0 19 20 #include <utils/Log.h> 21 #include <binder/IServiceManager.h> 22 #include <binder/ProcessState.h> 23 #include <binder/IPCThreadState.h> 24 #include <media/AudioResamplerPublic.h> 25 #include <media/AudioSystem.h> 26 #include <media/IAudioFlinger.h> 27 #include <media/IAudioPolicyService.h> 28 #include <media/TypeConverter.h> 29 #include <math.h> 30 31 #include <system/audio.h> 32 33 // ---------------------------------------------------------------------------- 34 35 namespace android { 36 37 // client singleton for AudioFlinger binder interface 38 Mutex AudioSystem::gLock; 39 Mutex AudioSystem::gLockAPS; 40 sp<IAudioFlinger> AudioSystem::gAudioFlinger; 41 sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 42 audio_error_callback AudioSystem::gAudioErrorCallback = NULL; 43 dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL; 44 record_config_callback AudioSystem::gRecordConfigCallback = NULL; 45 46 // establish binder interface to AudioFlinger service 47 const sp<IAudioFlinger> AudioSystem::get_audio_flinger() 48 { 49 sp<IAudioFlinger> af; 50 sp<AudioFlingerClient> afc; 51 { 52 Mutex::Autolock _l(gLock); 53 if (gAudioFlinger == 0) { 54 sp<IServiceManager> sm = defaultServiceManager(); 55 sp<IBinder> binder; 56 do { 57 binder = sm->getService(String16("media.audio_flinger")); 58 if (binder != 0) 59 break; 60 ALOGW("AudioFlinger not published, waiting..."); 61 usleep(500000); // 0.5 s 62 } while (true); 63 if (gAudioFlingerClient == NULL) { 64 gAudioFlingerClient = new AudioFlingerClient(); 65 } else { 66 if (gAudioErrorCallback) { 67 gAudioErrorCallback(NO_ERROR); 68 } 69 } 70 binder->linkToDeath(gAudioFlingerClient); 71 gAudioFlinger = interface_cast<IAudioFlinger>(binder); 72 LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0); 73 afc = gAudioFlingerClient; 74 // Make sure callbacks can be received by gAudioFlingerClient 75 ProcessState::self()->startThreadPool(); 76 } 77 af = gAudioFlinger; 78 } 79 if (afc != 0) { 80 int64_t token = IPCThreadState::self()->clearCallingIdentity(); 81 af->registerClient(afc); 82 IPCThreadState::self()->restoreCallingIdentity(token); 83 } 84 return af; 85 } 86 87 const sp<AudioSystem::AudioFlingerClient> AudioSystem::getAudioFlingerClient() 88 { 89 // calling get_audio_flinger() will initialize gAudioFlingerClient if needed 90 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 91 if (af == 0) return 0; 92 Mutex::Autolock _l(gLock); 93 return gAudioFlingerClient; 94 } 95 96 sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) 97 { 98 sp<AudioIoDescriptor> desc; 99 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 100 if (afc != 0) { 101 desc = afc->getIoDescriptor(ioHandle); 102 } 103 return desc; 104 } 105 106 /* static */ status_t AudioSystem::checkAudioFlinger() 107 { 108 if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) { 109 return NO_ERROR; 110 } 111 return DEAD_OBJECT; 112 } 113 114 // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp 115 116 status_t AudioSystem::muteMicrophone(bool state) 117 { 118 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 119 if (af == 0) return PERMISSION_DENIED; 120 return af->setMicMute(state); 121 } 122 123 status_t AudioSystem::isMicrophoneMuted(bool* state) 124 { 125 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 126 if (af == 0) return PERMISSION_DENIED; 127 *state = af->getMicMute(); 128 return NO_ERROR; 129 } 130 131 status_t AudioSystem::setMasterVolume(float value) 132 { 133 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 134 if (af == 0) return PERMISSION_DENIED; 135 af->setMasterVolume(value); 136 return NO_ERROR; 137 } 138 139 status_t AudioSystem::setMasterMute(bool mute) 140 { 141 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 142 if (af == 0) return PERMISSION_DENIED; 143 af->setMasterMute(mute); 144 return NO_ERROR; 145 } 146 147 status_t AudioSystem::getMasterVolume(float* volume) 148 { 149 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 150 if (af == 0) return PERMISSION_DENIED; 151 *volume = af->masterVolume(); 152 return NO_ERROR; 153 } 154 155 status_t AudioSystem::getMasterMute(bool* mute) 156 { 157 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 158 if (af == 0) return PERMISSION_DENIED; 159 *mute = af->masterMute(); 160 return NO_ERROR; 161 } 162 163 status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value, 164 audio_io_handle_t output) 165 { 166 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 167 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 168 if (af == 0) return PERMISSION_DENIED; 169 af->setStreamVolume(stream, value, output); 170 return NO_ERROR; 171 } 172 173 status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) 174 { 175 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 176 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 177 if (af == 0) return PERMISSION_DENIED; 178 af->setStreamMute(stream, mute); 179 return NO_ERROR; 180 } 181 182 status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume, 183 audio_io_handle_t output) 184 { 185 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 186 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 187 if (af == 0) return PERMISSION_DENIED; 188 *volume = af->streamVolume(stream, output); 189 return NO_ERROR; 190 } 191 192 status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute) 193 { 194 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 195 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 196 if (af == 0) return PERMISSION_DENIED; 197 *mute = af->streamMute(stream); 198 return NO_ERROR; 199 } 200 201 status_t AudioSystem::setMode(audio_mode_t mode) 202 { 203 if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE; 204 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 205 if (af == 0) return PERMISSION_DENIED; 206 return af->setMode(mode); 207 } 208 209 status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 210 { 211 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 212 if (af == 0) return PERMISSION_DENIED; 213 return af->setParameters(ioHandle, keyValuePairs); 214 } 215 216 String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) 217 { 218 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 219 String8 result = String8(""); 220 if (af == 0) return result; 221 222 result = af->getParameters(ioHandle, keys); 223 return result; 224 } 225 226 status_t AudioSystem::setParameters(const String8& keyValuePairs) 227 { 228 return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs); 229 } 230 231 String8 AudioSystem::getParameters(const String8& keys) 232 { 233 return getParameters(AUDIO_IO_HANDLE_NONE, keys); 234 } 235 236 // convert volume steps to natural log scale 237 238 // change this value to change volume scaling 239 static const float dBPerStep = 0.5f; 240 // shouldn't need to touch these 241 static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 242 static const float dBConvertInverse = 1.0f / dBConvert; 243 244 float AudioSystem::linearToLog(int volume) 245 { 246 // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 247 // ALOGD("linearToLog(%d)=%f", volume, v); 248 // return v; 249 return volume ? exp(float(100 - volume) * dBConvert) : 0; 250 } 251 252 int AudioSystem::logToLinear(float volume) 253 { 254 // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 255 // ALOGD("logTolinear(%d)=%f", v, volume); 256 // return v; 257 return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 258 } 259 260 /* static */ size_t AudioSystem::calculateMinFrameCount( 261 uint32_t afLatencyMs, uint32_t afFrameCount, uint32_t afSampleRate, 262 uint32_t sampleRate, float speed /*, uint32_t notificationsPerBufferReq*/) 263 { 264 // Ensure that buffer depth covers at least audio hardware latency 265 uint32_t minBufCount = afLatencyMs / ((1000 * afFrameCount) / afSampleRate); 266 if (minBufCount < 2) { 267 minBufCount = 2; 268 } 269 #if 0 270 // The notificationsPerBufferReq parameter is not yet used for non-fast tracks, 271 // but keeping the code here to make it easier to add later. 272 if (minBufCount < notificationsPerBufferReq) { 273 minBufCount = notificationsPerBufferReq; 274 } 275 #endif 276 ALOGV("calculateMinFrameCount afLatency %u afFrameCount %u afSampleRate %u " 277 "sampleRate %u speed %f minBufCount: %u" /*" notificationsPerBufferReq %u"*/, 278 afLatencyMs, afFrameCount, afSampleRate, sampleRate, speed, minBufCount 279 /*, notificationsPerBufferReq*/); 280 return minBufCount * sourceFramesNeededWithTimestretch( 281 sampleRate, afFrameCount, afSampleRate, speed); 282 } 283 284 285 status_t AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType) 286 { 287 audio_io_handle_t output; 288 289 if (streamType == AUDIO_STREAM_DEFAULT) { 290 streamType = AUDIO_STREAM_MUSIC; 291 } 292 293 output = getOutput(streamType); 294 if (output == 0) { 295 return PERMISSION_DENIED; 296 } 297 298 return getSamplingRate(output, samplingRate); 299 } 300 301 status_t AudioSystem::getSamplingRate(audio_io_handle_t ioHandle, 302 uint32_t* samplingRate) 303 { 304 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 305 if (af == 0) return PERMISSION_DENIED; 306 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle); 307 if (desc == 0) { 308 *samplingRate = af->sampleRate(ioHandle); 309 } else { 310 *samplingRate = desc->mSamplingRate; 311 } 312 if (*samplingRate == 0) { 313 ALOGE("AudioSystem::getSamplingRate failed for ioHandle %d", ioHandle); 314 return BAD_VALUE; 315 } 316 317 ALOGV("getSamplingRate() ioHandle %d, sampling rate %u", ioHandle, *samplingRate); 318 319 return NO_ERROR; 320 } 321 322 status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType) 323 { 324 audio_io_handle_t output; 325 326 if (streamType == AUDIO_STREAM_DEFAULT) { 327 streamType = AUDIO_STREAM_MUSIC; 328 } 329 330 output = getOutput(streamType); 331 if (output == AUDIO_IO_HANDLE_NONE) { 332 return PERMISSION_DENIED; 333 } 334 335 return getFrameCount(output, frameCount); 336 } 337 338 status_t AudioSystem::getFrameCount(audio_io_handle_t ioHandle, 339 size_t* frameCount) 340 { 341 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 342 if (af == 0) return PERMISSION_DENIED; 343 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle); 344 if (desc == 0) { 345 *frameCount = af->frameCount(ioHandle); 346 } else { 347 *frameCount = desc->mFrameCount; 348 } 349 if (*frameCount == 0) { 350 ALOGE("AudioSystem::getFrameCount failed for ioHandle %d", ioHandle); 351 return BAD_VALUE; 352 } 353 354 ALOGV("getFrameCount() ioHandle %d, frameCount %zu", ioHandle, *frameCount); 355 356 return NO_ERROR; 357 } 358 359 status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) 360 { 361 audio_io_handle_t output; 362 363 if (streamType == AUDIO_STREAM_DEFAULT) { 364 streamType = AUDIO_STREAM_MUSIC; 365 } 366 367 output = getOutput(streamType); 368 if (output == AUDIO_IO_HANDLE_NONE) { 369 return PERMISSION_DENIED; 370 } 371 372 return getLatency(output, latency); 373 } 374 375 status_t AudioSystem::getLatency(audio_io_handle_t output, 376 uint32_t* latency) 377 { 378 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 379 if (af == 0) return PERMISSION_DENIED; 380 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output); 381 if (outputDesc == 0) { 382 *latency = af->latency(output); 383 } else { 384 *latency = outputDesc->mLatency; 385 } 386 387 ALOGV("getLatency() output %d, latency %d", output, *latency); 388 389 return NO_ERROR; 390 } 391 392 status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format, 393 audio_channel_mask_t channelMask, size_t* buffSize) 394 { 395 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 396 if (afc == 0) { 397 return NO_INIT; 398 } 399 return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize); 400 } 401 402 status_t AudioSystem::setVoiceVolume(float value) 403 { 404 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 405 if (af == 0) return PERMISSION_DENIED; 406 return af->setVoiceVolume(value); 407 } 408 409 status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t *halFrames, 410 uint32_t *dspFrames) 411 { 412 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 413 if (af == 0) return PERMISSION_DENIED; 414 415 return af->getRenderPosition(halFrames, dspFrames, output); 416 } 417 418 uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) 419 { 420 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 421 uint32_t result = 0; 422 if (af == 0) return result; 423 if (ioHandle == AUDIO_IO_HANDLE_NONE) return result; 424 425 result = af->getInputFramesLost(ioHandle); 426 return result; 427 } 428 429 audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use) 430 { 431 // Must not use AF as IDs will re-roll on audioserver restart, b/130369529. 432 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 433 if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE; 434 return af->newAudioUniqueId(use); 435 } 436 437 void AudioSystem::acquireAudioSessionId(audio_session_t audioSession, pid_t pid) 438 { 439 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 440 if (af != 0) { 441 af->acquireAudioSessionId(audioSession, pid); 442 } 443 } 444 445 void AudioSystem::releaseAudioSessionId(audio_session_t audioSession, pid_t pid) 446 { 447 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 448 if (af != 0) { 449 af->releaseAudioSessionId(audioSession, pid); 450 } 451 } 452 453 audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) 454 { 455 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 456 if (af == 0) return AUDIO_HW_SYNC_INVALID; 457 return af->getAudioHwSyncForSession(sessionId); 458 } 459 460 status_t AudioSystem::systemReady() 461 { 462 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 463 if (af == 0) return NO_INIT; 464 return af->systemReady(); 465 } 466 467 status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle, 468 size_t* frameCount) 469 { 470 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 471 if (af == 0) return PERMISSION_DENIED; 472 sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle); 473 if (desc == 0) { 474 *frameCount = af->frameCountHAL(ioHandle); 475 } else { 476 *frameCount = desc->mFrameCountHAL; 477 } 478 if (*frameCount == 0) { 479 ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle); 480 return BAD_VALUE; 481 } 482 483 ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount); 484 485 return NO_ERROR; 486 } 487 488 // --------------------------------------------------------------------------- 489 490 491 void AudioSystem::AudioFlingerClient::clearIoCache() 492 { 493 Mutex::Autolock _l(mLock); 494 mIoDescriptors.clear(); 495 mInBuffSize = 0; 496 mInSamplingRate = 0; 497 mInFormat = AUDIO_FORMAT_DEFAULT; 498 mInChannelMask = AUDIO_CHANNEL_NONE; 499 } 500 501 void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused) 502 { 503 audio_error_callback cb = NULL; 504 { 505 Mutex::Autolock _l(AudioSystem::gLock); 506 AudioSystem::gAudioFlinger.clear(); 507 cb = gAudioErrorCallback; 508 } 509 510 // clear output handles and stream to output map caches 511 clearIoCache(); 512 513 if (cb) { 514 cb(DEAD_OBJECT); 515 } 516 ALOGW("AudioFlinger server died!"); 517 } 518 519 void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event event, 520 const sp<AudioIoDescriptor>& ioDesc) { 521 ALOGV("ioConfigChanged() event %d", event); 522 523 if (ioDesc == 0 || ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return; 524 525 audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE; 526 std::vector<sp<AudioDeviceCallback>> callbacksToCall; 527 { 528 Mutex::Autolock _l(mLock); 529 auto callbacks = std::map<audio_port_handle_t, wp<AudioDeviceCallback>>(); 530 531 switch (event) { 532 case AUDIO_OUTPUT_OPENED: 533 case AUDIO_OUTPUT_REGISTERED: 534 case AUDIO_INPUT_OPENED: 535 case AUDIO_INPUT_REGISTERED: { 536 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); 537 if (oldDesc == 0) { 538 mIoDescriptors.add(ioDesc->mIoHandle, ioDesc); 539 } else { 540 deviceId = oldDesc->getDeviceId(); 541 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc); 542 } 543 544 if (ioDesc->getDeviceId() != AUDIO_PORT_HANDLE_NONE) { 545 deviceId = ioDesc->getDeviceId(); 546 if (event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED) { 547 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle); 548 if (it != mAudioDeviceCallbacks.end()) { 549 callbacks = it->second; 550 } 551 } 552 } 553 ALOGV("ioConfigChanged() new %s %s %d samplingRate %u, format %#x channel mask %#x " 554 "frameCount %zu deviceId %d", 555 event == AUDIO_OUTPUT_OPENED || event == AUDIO_OUTPUT_REGISTERED ? 556 "output" : "input", 557 event == AUDIO_OUTPUT_OPENED || event == AUDIO_INPUT_OPENED ? 558 "opened" : "registered", 559 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, ioDesc->mChannelMask, 560 ioDesc->mFrameCount, ioDesc->getDeviceId()); 561 } break; 562 case AUDIO_OUTPUT_CLOSED: 563 case AUDIO_INPUT_CLOSED: { 564 if (getIoDescriptor_l(ioDesc->mIoHandle) == 0) { 565 ALOGW("ioConfigChanged() closing unknown %s %d", 566 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle); 567 break; 568 } 569 ALOGV("ioConfigChanged() %s %d closed", 570 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle); 571 572 mIoDescriptors.removeItem(ioDesc->mIoHandle); 573 mAudioDeviceCallbacks.erase(ioDesc->mIoHandle); 574 } break; 575 576 case AUDIO_OUTPUT_CONFIG_CHANGED: 577 case AUDIO_INPUT_CONFIG_CHANGED: { 578 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); 579 if (oldDesc == 0) { 580 ALOGW("ioConfigChanged() modifying unknown output! %d", ioDesc->mIoHandle); 581 break; 582 } 583 584 deviceId = oldDesc->getDeviceId(); 585 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc); 586 587 if (deviceId != ioDesc->getDeviceId()) { 588 deviceId = ioDesc->getDeviceId(); 589 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle); 590 if (it != mAudioDeviceCallbacks.end()) { 591 callbacks = it->second; 592 } 593 } 594 ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x " 595 "channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d", 596 event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input", 597 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, 598 ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->mFrameCountHAL, 599 ioDesc->getDeviceId()); 600 601 } break; 602 case AUDIO_CLIENT_STARTED: { 603 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); 604 if (oldDesc == 0) { 605 ALOGW("ioConfigChanged() start client on unknown io! %d", ioDesc->mIoHandle); 606 break; 607 } 608 ALOGV("ioConfigChanged() AUDIO_CLIENT_STARTED io %d port %d num callbacks %zu", 609 ioDesc->mIoHandle, ioDesc->mPortId, mAudioDeviceCallbacks.size()); 610 oldDesc->mPatch = ioDesc->mPatch; 611 auto it = mAudioDeviceCallbacks.find(ioDesc->mIoHandle); 612 if (it != mAudioDeviceCallbacks.end()) { 613 auto cbks = it->second; 614 auto it2 = cbks.find(ioDesc->mPortId); 615 if (it2 != cbks.end()) { 616 callbacks.emplace(ioDesc->mPortId, it2->second); 617 deviceId = oldDesc->getDeviceId(); 618 } 619 } 620 } break; 621 } 622 623 for (auto wpCbk : callbacks) { 624 sp<AudioDeviceCallback> spCbk = wpCbk.second.promote(); 625 if (spCbk != nullptr) { 626 callbacksToCall.push_back(spCbk); 627 } 628 } 629 } 630 631 // Callbacks must be called without mLock held. May lead to dead lock if calling for 632 // example getRoutedDevice that updates the device and tries to acquire mLock. 633 for (auto cb : callbacksToCall) { 634 // If callbacksToCall is not empty, it implies ioDesc->mIoHandle and deviceId are valid 635 cb->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId); 636 } 637 } 638 639 status_t AudioSystem::AudioFlingerClient::getInputBufferSize( 640 uint32_t sampleRate, audio_format_t format, 641 audio_channel_mask_t channelMask, size_t* buffSize) 642 { 643 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 644 if (af == 0) { 645 return PERMISSION_DENIED; 646 } 647 Mutex::Autolock _l(mLock); 648 // Do we have a stale mInBuffSize or are we requesting the input buffer size for new values 649 if ((mInBuffSize == 0) || (sampleRate != mInSamplingRate) || (format != mInFormat) 650 || (channelMask != mInChannelMask)) { 651 size_t inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask); 652 if (inBuffSize == 0) { 653 ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %#x", 654 sampleRate, format, channelMask); 655 return BAD_VALUE; 656 } 657 // A benign race is possible here: we could overwrite a fresher cache entry 658 // save the request params 659 mInSamplingRate = sampleRate; 660 mInFormat = format; 661 mInChannelMask = channelMask; 662 663 mInBuffSize = inBuffSize; 664 } 665 666 *buffSize = mInBuffSize; 667 668 return NO_ERROR; 669 } 670 671 sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle) 672 { 673 sp<AudioIoDescriptor> desc; 674 ssize_t index = mIoDescriptors.indexOfKey(ioHandle); 675 if (index >= 0) { 676 desc = mIoDescriptors.valueAt(index); 677 } 678 return desc; 679 } 680 681 sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) 682 { 683 Mutex::Autolock _l(mLock); 684 return getIoDescriptor_l(ioHandle); 685 } 686 687 status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback( 688 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo, 689 audio_port_handle_t portId) 690 { 691 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId); 692 Mutex::Autolock _l(mLock); 693 auto& callbacks = mAudioDeviceCallbacks.emplace(audioIo, std::map<audio_port_handle_t, wp<AudioDeviceCallback>>()).first->second; 694 auto result = callbacks.try_emplace(portId, callback); 695 if (!result.second) { 696 return INVALID_OPERATION; 697 } 698 return NO_ERROR; 699 } 700 701 status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback( 702 const wp<AudioDeviceCallback>& callback __unused, audio_io_handle_t audioIo, 703 audio_port_handle_t portId) 704 { 705 ALOGV("%s audioIo %d portId %d", __func__, audioIo, portId); 706 Mutex::Autolock _l(mLock); 707 auto it = mAudioDeviceCallbacks.find(audioIo); 708 if (it == mAudioDeviceCallbacks.end()) { 709 return INVALID_OPERATION; 710 } 711 if (it->second.erase(portId) == 0) { 712 return INVALID_OPERATION; 713 } 714 if (it->second.size() == 0) { 715 mAudioDeviceCallbacks.erase(audioIo); 716 } 717 return NO_ERROR; 718 } 719 720 /* static */ void AudioSystem::setErrorCallback(audio_error_callback cb) 721 { 722 Mutex::Autolock _l(gLock); 723 gAudioErrorCallback = cb; 724 } 725 726 /*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) 727 { 728 Mutex::Autolock _l(gLock); 729 gDynPolicyCallback = cb; 730 } 731 732 /*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb) 733 { 734 Mutex::Autolock _l(gLock); 735 gRecordConfigCallback = cb; 736 } 737 738 // client singleton for AudioPolicyService binder interface 739 // protected by gLockAPS 740 sp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 741 sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 742 743 744 // establish binder interface to AudioPolicy service 745 const sp<IAudioPolicyService> AudioSystem::get_audio_policy_service() 746 { 747 sp<IAudioPolicyService> ap; 748 sp<AudioPolicyServiceClient> apc; 749 { 750 Mutex::Autolock _l(gLockAPS); 751 if (gAudioPolicyService == 0) { 752 sp<IServiceManager> sm = defaultServiceManager(); 753 sp<IBinder> binder; 754 do { 755 binder = sm->getService(String16("media.audio_policy")); 756 if (binder != 0) 757 break; 758 ALOGW("AudioPolicyService not published, waiting..."); 759 usleep(500000); // 0.5 s 760 } while (true); 761 if (gAudioPolicyServiceClient == NULL) { 762 gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 763 } 764 binder->linkToDeath(gAudioPolicyServiceClient); 765 gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 766 LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0); 767 apc = gAudioPolicyServiceClient; 768 // Make sure callbacks can be received by gAudioPolicyServiceClient 769 ProcessState::self()->startThreadPool(); 770 } 771 ap = gAudioPolicyService; 772 } 773 if (apc != 0) { 774 int64_t token = IPCThreadState::self()->clearCallingIdentity(); 775 ap->registerClient(apc); 776 ap->setAudioPortCallbacksEnabled(apc->isAudioPortCbEnabled()); 777 ap->setAudioVolumeGroupCallbacksEnabled(apc->isAudioVolumeGroupCbEnabled()); 778 IPCThreadState::self()->restoreCallingIdentity(token); 779 } 780 781 return ap; 782 } 783 784 // --------------------------------------------------------------------------- 785 786 status_t AudioSystem::setDeviceConnectionState(audio_devices_t device, 787 audio_policy_dev_state_t state, 788 const char *device_address, 789 const char *device_name, 790 audio_format_t encodedFormat) 791 { 792 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 793 const char *address = ""; 794 const char *name = ""; 795 796 if (aps == 0) return PERMISSION_DENIED; 797 798 if (device_address != NULL) { 799 address = device_address; 800 } 801 if (device_name != NULL) { 802 name = device_name; 803 } 804 return aps->setDeviceConnectionState(device, state, address, name, encodedFormat); 805 } 806 807 audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device, 808 const char *device_address) 809 { 810 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 811 if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 812 813 return aps->getDeviceConnectionState(device, device_address); 814 } 815 816 status_t AudioSystem::handleDeviceConfigChange(audio_devices_t device, 817 const char *device_address, 818 const char *device_name, 819 audio_format_t encodedFormat) 820 { 821 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 822 const char *address = ""; 823 const char *name = ""; 824 825 if (aps == 0) return PERMISSION_DENIED; 826 827 if (device_address != NULL) { 828 address = device_address; 829 } 830 if (device_name != NULL) { 831 name = device_name; 832 } 833 return aps->handleDeviceConfigChange(device, address, name, encodedFormat); 834 } 835 836 status_t AudioSystem::setPhoneState(audio_mode_t state) 837 { 838 if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE; 839 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 840 if (aps == 0) return PERMISSION_DENIED; 841 842 return aps->setPhoneState(state); 843 } 844 845 status_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 846 { 847 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 848 if (aps == 0) return PERMISSION_DENIED; 849 return aps->setForceUse(usage, config); 850 } 851 852 audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) 853 { 854 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 855 if (aps == 0) return AUDIO_POLICY_FORCE_NONE; 856 return aps->getForceUse(usage); 857 } 858 859 860 audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream) 861 { 862 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 863 if (aps == 0) return 0; 864 return aps->getOutput(stream); 865 } 866 867 status_t AudioSystem::getOutputForAttr(audio_attributes_t *attr, 868 audio_io_handle_t *output, 869 audio_session_t session, 870 audio_stream_type_t *stream, 871 pid_t pid, 872 uid_t uid, 873 const audio_config_t *config, 874 audio_output_flags_t flags, 875 audio_port_handle_t *selectedDeviceId, 876 audio_port_handle_t *portId, 877 std::vector<audio_io_handle_t> *secondaryOutputs) 878 { 879 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 880 if (aps == 0) return NO_INIT; 881 return aps->getOutputForAttr(attr, output, session, stream, pid, uid, 882 config, 883 flags, selectedDeviceId, portId, secondaryOutputs); 884 } 885 886 status_t AudioSystem::startOutput(audio_port_handle_t portId) 887 { 888 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 889 if (aps == 0) return PERMISSION_DENIED; 890 return aps->startOutput(portId); 891 } 892 893 status_t AudioSystem::stopOutput(audio_port_handle_t portId) 894 { 895 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 896 if (aps == 0) return PERMISSION_DENIED; 897 return aps->stopOutput(portId); 898 } 899 900 void AudioSystem::releaseOutput(audio_port_handle_t portId) 901 { 902 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 903 if (aps == 0) return; 904 aps->releaseOutput(portId); 905 } 906 907 status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr, 908 audio_io_handle_t *input, 909 audio_unique_id_t riid, 910 audio_session_t session, 911 pid_t pid, 912 uid_t uid, 913 const String16& opPackageName, 914 const audio_config_base_t *config, 915 audio_input_flags_t flags, 916 audio_port_handle_t *selectedDeviceId, 917 audio_port_handle_t *portId) 918 { 919 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 920 if (aps == 0) return NO_INIT; 921 return aps->getInputForAttr( 922 attr, input, riid, session, pid, uid, opPackageName, 923 config, flags, selectedDeviceId, portId); 924 } 925 926 status_t AudioSystem::startInput(audio_port_handle_t portId) 927 { 928 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 929 if (aps == 0) return PERMISSION_DENIED; 930 return aps->startInput(portId); 931 } 932 933 status_t AudioSystem::stopInput(audio_port_handle_t portId) 934 { 935 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 936 if (aps == 0) return PERMISSION_DENIED; 937 return aps->stopInput(portId); 938 } 939 940 void AudioSystem::releaseInput(audio_port_handle_t portId) 941 { 942 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 943 if (aps == 0) return; 944 aps->releaseInput(portId); 945 } 946 947 status_t AudioSystem::initStreamVolume(audio_stream_type_t stream, 948 int indexMin, 949 int indexMax) 950 { 951 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 952 if (aps == 0) return PERMISSION_DENIED; 953 return aps->initStreamVolume(stream, indexMin, indexMax); 954 } 955 956 status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, 957 int index, 958 audio_devices_t device) 959 { 960 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 961 if (aps == 0) return PERMISSION_DENIED; 962 return aps->setStreamVolumeIndex(stream, index, device); 963 } 964 965 status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream, 966 int *index, 967 audio_devices_t device) 968 { 969 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 970 if (aps == 0) return PERMISSION_DENIED; 971 return aps->getStreamVolumeIndex(stream, index, device); 972 } 973 974 status_t AudioSystem::setVolumeIndexForAttributes(const audio_attributes_t &attr, 975 int index, 976 audio_devices_t device) 977 { 978 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 979 if (aps == 0) return PERMISSION_DENIED; 980 return aps->setVolumeIndexForAttributes(attr, index, device); 981 } 982 983 status_t AudioSystem::getVolumeIndexForAttributes(const audio_attributes_t &attr, 984 int &index, 985 audio_devices_t device) 986 { 987 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 988 if (aps == 0) return PERMISSION_DENIED; 989 return aps->getVolumeIndexForAttributes(attr, index, device); 990 } 991 992 status_t AudioSystem::getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index) 993 { 994 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 995 if (aps == 0) return PERMISSION_DENIED; 996 return aps->getMaxVolumeIndexForAttributes(attr, index); 997 } 998 999 status_t AudioSystem::getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index) 1000 { 1001 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1002 if (aps == 0) return PERMISSION_DENIED; 1003 return aps->getMinVolumeIndexForAttributes(attr, index); 1004 } 1005 1006 uint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) 1007 { 1008 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1009 if (aps == 0) return PRODUCT_STRATEGY_NONE; 1010 return aps->getStrategyForStream(stream); 1011 } 1012 1013 audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) 1014 { 1015 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1016 if (aps == 0) return AUDIO_DEVICE_NONE; 1017 return aps->getDevicesForStream(stream); 1018 } 1019 1020 audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc) 1021 { 1022 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1023 // FIXME change return type to status_t, and return PERMISSION_DENIED here 1024 if (aps == 0) return AUDIO_IO_HANDLE_NONE; 1025 return aps->getOutputForEffect(desc); 1026 } 1027 1028 status_t AudioSystem::registerEffect(const effect_descriptor_t *desc, 1029 audio_io_handle_t io, 1030 uint32_t strategy, 1031 audio_session_t session, 1032 int id) 1033 { 1034 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1035 if (aps == 0) return PERMISSION_DENIED; 1036 return aps->registerEffect(desc, io, strategy, session, id); 1037 } 1038 1039 status_t AudioSystem::unregisterEffect(int id) 1040 { 1041 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1042 if (aps == 0) return PERMISSION_DENIED; 1043 return aps->unregisterEffect(id); 1044 } 1045 1046 status_t AudioSystem::setEffectEnabled(int id, bool enabled) 1047 { 1048 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1049 if (aps == 0) return PERMISSION_DENIED; 1050 return aps->setEffectEnabled(id, enabled); 1051 } 1052 1053 status_t AudioSystem::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) 1054 { 1055 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1056 if (aps == 0) return PERMISSION_DENIED; 1057 return aps->moveEffectsToIo(ids, io); 1058 } 1059 1060 status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) 1061 { 1062 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1063 if (aps == 0) return PERMISSION_DENIED; 1064 if (state == NULL) return BAD_VALUE; 1065 *state = aps->isStreamActive(stream, inPastMs); 1066 return NO_ERROR; 1067 } 1068 1069 status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state, 1070 uint32_t inPastMs) 1071 { 1072 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1073 if (aps == 0) return PERMISSION_DENIED; 1074 if (state == NULL) return BAD_VALUE; 1075 *state = aps->isStreamActiveRemotely(stream, inPastMs); 1076 return NO_ERROR; 1077 } 1078 1079 status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state) 1080 { 1081 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1082 if (aps == 0) return PERMISSION_DENIED; 1083 if (state == NULL) return BAD_VALUE; 1084 *state = aps->isSourceActive(stream); 1085 return NO_ERROR; 1086 } 1087 1088 uint32_t AudioSystem::getPrimaryOutputSamplingRate() 1089 { 1090 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1091 if (af == 0) return 0; 1092 return af->getPrimaryOutputSamplingRate(); 1093 } 1094 1095 size_t AudioSystem::getPrimaryOutputFrameCount() 1096 { 1097 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1098 if (af == 0) return 0; 1099 return af->getPrimaryOutputFrameCount(); 1100 } 1101 1102 status_t AudioSystem::setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) 1103 { 1104 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1105 if (af == 0) return PERMISSION_DENIED; 1106 return af->setLowRamDevice(isLowRamDevice, totalMemory); 1107 } 1108 1109 void AudioSystem::clearAudioConfigCache() 1110 { 1111 // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances 1112 ALOGV("clearAudioConfigCache()"); 1113 { 1114 Mutex::Autolock _l(gLock); 1115 if (gAudioFlingerClient != 0) { 1116 gAudioFlingerClient->clearIoCache(); 1117 } 1118 gAudioFlinger.clear(); 1119 } 1120 { 1121 Mutex::Autolock _l(gLockAPS); 1122 gAudioPolicyService.clear(); 1123 } 1124 } 1125 1126 status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) { 1127 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1128 if (aps == nullptr) return PERMISSION_DENIED; 1129 return aps->setAllowedCapturePolicy(uid, flags); 1130 } 1131 1132 bool AudioSystem::isOffloadSupported(const audio_offload_info_t& info) 1133 { 1134 ALOGV("isOffloadSupported()"); 1135 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1136 if (aps == 0) return false; 1137 return aps->isOffloadSupported(info); 1138 } 1139 1140 status_t AudioSystem::listAudioPorts(audio_port_role_t role, 1141 audio_port_type_t type, 1142 unsigned int *num_ports, 1143 struct audio_port *ports, 1144 unsigned int *generation) 1145 { 1146 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1147 if (aps == 0) return PERMISSION_DENIED; 1148 return aps->listAudioPorts(role, type, num_ports, ports, generation); 1149 } 1150 1151 status_t AudioSystem::getAudioPort(struct audio_port *port) 1152 { 1153 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1154 if (aps == 0) return PERMISSION_DENIED; 1155 return aps->getAudioPort(port); 1156 } 1157 1158 status_t AudioSystem::createAudioPatch(const struct audio_patch *patch, 1159 audio_patch_handle_t *handle) 1160 { 1161 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1162 if (aps == 0) return PERMISSION_DENIED; 1163 return aps->createAudioPatch(patch, handle); 1164 } 1165 1166 status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle) 1167 { 1168 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1169 if (aps == 0) return PERMISSION_DENIED; 1170 return aps->releaseAudioPatch(handle); 1171 } 1172 1173 status_t AudioSystem::listAudioPatches(unsigned int *num_patches, 1174 struct audio_patch *patches, 1175 unsigned int *generation) 1176 { 1177 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1178 if (aps == 0) return PERMISSION_DENIED; 1179 return aps->listAudioPatches(num_patches, patches, generation); 1180 } 1181 1182 status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config) 1183 { 1184 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1185 if (aps == 0) return PERMISSION_DENIED; 1186 return aps->setAudioPortConfig(config); 1187 } 1188 1189 status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback) 1190 { 1191 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1192 if (aps == 0) return PERMISSION_DENIED; 1193 1194 Mutex::Autolock _l(gLockAPS); 1195 if (gAudioPolicyServiceClient == 0) { 1196 return NO_INIT; 1197 } 1198 int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback); 1199 if (ret == 1) { 1200 aps->setAudioPortCallbacksEnabled(true); 1201 } 1202 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1203 } 1204 1205 /*static*/ 1206 status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callback) 1207 { 1208 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1209 if (aps == 0) return PERMISSION_DENIED; 1210 1211 Mutex::Autolock _l(gLockAPS); 1212 if (gAudioPolicyServiceClient == 0) { 1213 return NO_INIT; 1214 } 1215 int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback); 1216 if (ret == 0) { 1217 aps->setAudioPortCallbacksEnabled(false); 1218 } 1219 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1220 } 1221 1222 status_t AudioSystem::addAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) 1223 { 1224 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1225 if (aps == 0) return PERMISSION_DENIED; 1226 1227 Mutex::Autolock _l(gLockAPS); 1228 if (gAudioPolicyServiceClient == 0) { 1229 return NO_INIT; 1230 } 1231 int ret = gAudioPolicyServiceClient->addAudioVolumeGroupCallback(callback); 1232 if (ret == 1) { 1233 aps->setAudioVolumeGroupCallbacksEnabled(true); 1234 } 1235 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1236 } 1237 1238 status_t AudioSystem::removeAudioVolumeGroupCallback(const sp<AudioVolumeGroupCallback>& callback) 1239 { 1240 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1241 if (aps == 0) return PERMISSION_DENIED; 1242 1243 Mutex::Autolock _l(gLockAPS); 1244 if (gAudioPolicyServiceClient == 0) { 1245 return NO_INIT; 1246 } 1247 int ret = gAudioPolicyServiceClient->removeAudioVolumeGroupCallback(callback); 1248 if (ret == 0) { 1249 aps->setAudioVolumeGroupCallbacksEnabled(false); 1250 } 1251 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1252 } 1253 1254 status_t AudioSystem::addAudioDeviceCallback( 1255 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo, 1256 audio_port_handle_t portId) 1257 { 1258 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 1259 if (afc == 0) { 1260 return NO_INIT; 1261 } 1262 status_t status = afc->addAudioDeviceCallback(callback, audioIo, portId); 1263 if (status == NO_ERROR) { 1264 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1265 if (af != 0) { 1266 af->registerClient(afc); 1267 } 1268 } 1269 return status; 1270 } 1271 1272 status_t AudioSystem::removeAudioDeviceCallback( 1273 const wp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo, 1274 audio_port_handle_t portId) 1275 { 1276 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 1277 if (afc == 0) { 1278 return NO_INIT; 1279 } 1280 return afc->removeAudioDeviceCallback(callback, audioIo, portId); 1281 } 1282 1283 audio_port_handle_t AudioSystem::getDeviceIdForIo(audio_io_handle_t audioIo) 1284 { 1285 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1286 if (af == 0) return PERMISSION_DENIED; 1287 const sp<AudioIoDescriptor> desc = getIoDescriptor(audioIo); 1288 if (desc == 0) { 1289 return AUDIO_PORT_HANDLE_NONE; 1290 } 1291 return desc->getDeviceId(); 1292 } 1293 1294 status_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session, 1295 audio_io_handle_t *ioHandle, 1296 audio_devices_t *device) 1297 { 1298 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1299 if (aps == 0) return PERMISSION_DENIED; 1300 return aps->acquireSoundTriggerSession(session, ioHandle, device); 1301 } 1302 1303 status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) 1304 { 1305 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1306 if (aps == 0) return PERMISSION_DENIED; 1307 return aps->releaseSoundTriggerSession(session); 1308 } 1309 1310 audio_mode_t AudioSystem::getPhoneState() 1311 { 1312 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1313 if (aps == 0) return AUDIO_MODE_INVALID; 1314 return aps->getPhoneState(); 1315 } 1316 1317 status_t AudioSystem::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 1318 { 1319 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1320 if (aps == 0) return PERMISSION_DENIED; 1321 return aps->registerPolicyMixes(mixes, registration); 1322 } 1323 1324 status_t AudioSystem::setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices) 1325 { 1326 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1327 if (aps == 0) return PERMISSION_DENIED; 1328 return aps->setUidDeviceAffinities(uid, devices); 1329 } 1330 1331 status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) { 1332 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1333 if (aps == 0) return PERMISSION_DENIED; 1334 return aps->removeUidDeviceAffinities(uid); 1335 } 1336 1337 status_t AudioSystem::startAudioSource(const struct audio_port_config *source, 1338 const audio_attributes_t *attributes, 1339 audio_port_handle_t *portId) 1340 { 1341 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1342 if (aps == 0) return PERMISSION_DENIED; 1343 return aps->startAudioSource(source, attributes, portId); 1344 } 1345 1346 status_t AudioSystem::stopAudioSource(audio_port_handle_t portId) 1347 { 1348 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1349 if (aps == 0) return PERMISSION_DENIED; 1350 return aps->stopAudioSource(portId); 1351 } 1352 1353 status_t AudioSystem::setMasterMono(bool mono) 1354 { 1355 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1356 if (aps == 0) return PERMISSION_DENIED; 1357 return aps->setMasterMono(mono); 1358 } 1359 1360 status_t AudioSystem::getMasterMono(bool *mono) 1361 { 1362 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1363 if (aps == 0) return PERMISSION_DENIED; 1364 return aps->getMasterMono(mono); 1365 } 1366 1367 status_t AudioSystem::setMasterBalance(float balance) 1368 { 1369 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1370 if (af == 0) return PERMISSION_DENIED; 1371 return af->setMasterBalance(balance); 1372 } 1373 1374 status_t AudioSystem::getMasterBalance(float *balance) 1375 { 1376 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1377 if (af == 0) return PERMISSION_DENIED; 1378 return af->getMasterBalance(balance); 1379 } 1380 1381 float AudioSystem::getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) 1382 { 1383 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1384 if (aps == 0) return NAN; 1385 return aps->getStreamVolumeDB(stream, index, device); 1386 } 1387 1388 status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfo> *microphones) 1389 { 1390 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1391 if (af == 0) return PERMISSION_DENIED; 1392 return af->getMicrophones(microphones); 1393 } 1394 1395 status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats, 1396 audio_format_t *surroundFormats, 1397 bool *surroundFormatsEnabled, 1398 bool reported) 1399 { 1400 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1401 if (aps == 0) return PERMISSION_DENIED; 1402 return aps->getSurroundFormats( 1403 numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported); 1404 } 1405 1406 status_t AudioSystem::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) 1407 { 1408 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1409 if (aps == 0) return PERMISSION_DENIED; 1410 return aps->setSurroundFormatEnabled(audioFormat, enabled); 1411 } 1412 1413 status_t AudioSystem::setAssistantUid(uid_t uid) 1414 { 1415 const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1416 if (aps == 0) return PERMISSION_DENIED; 1417 1418 return aps->setAssistantUid(uid); 1419 } 1420 1421 status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids) 1422 { 1423 const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1424 if (aps == 0) return PERMISSION_DENIED; 1425 1426 return aps->setA11yServicesUids(uids); 1427 } 1428 1429 bool AudioSystem::isHapticPlaybackSupported() 1430 { 1431 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1432 if (aps == 0) return false; 1433 return aps->isHapticPlaybackSupported(); 1434 } 1435 1436 status_t AudioSystem::getHwOffloadEncodingFormatsSupportedForA2DP( 1437 std::vector<audio_format_t> *formats) { 1438 const sp <IAudioPolicyService> 1439 & aps = AudioSystem::get_audio_policy_service(); 1440 if (aps == 0) return PERMISSION_DENIED; 1441 return aps->getHwOffloadEncodingFormatsSupportedForA2DP(formats); 1442 } 1443 1444 status_t AudioSystem::listAudioProductStrategies(AudioProductStrategyVector &strategies) 1445 { 1446 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1447 if (aps == 0) return PERMISSION_DENIED; 1448 return aps->listAudioProductStrategies(strategies); 1449 } 1450 1451 audio_attributes_t AudioSystem::streamTypeToAttributes(audio_stream_type_t stream) 1452 { 1453 AudioProductStrategyVector strategies; 1454 listAudioProductStrategies(strategies); 1455 for (const auto &strategy : strategies) { 1456 auto attrVect = strategy.getAudioAttributes(); 1457 auto iter = std::find_if(begin(attrVect), end(attrVect), [&stream](const auto &attributes) { 1458 return attributes.getStreamType() == stream; }); 1459 if (iter != end(attrVect)) { 1460 return iter->getAttributes(); 1461 } 1462 } 1463 ALOGE("invalid stream type %s when converting to attributes", toString(stream).c_str()); 1464 return AUDIO_ATTRIBUTES_INITIALIZER; 1465 } 1466 1467 audio_stream_type_t AudioSystem::attributesToStreamType(const audio_attributes_t &attr) 1468 { 1469 product_strategy_t psId; 1470 status_t ret = AudioSystem::getProductStrategyFromAudioAttributes(AudioAttributes(attr), psId); 1471 if (ret != NO_ERROR) { 1472 ALOGE("no strategy found for attributes %s", toString(attr).c_str()); 1473 return AUDIO_STREAM_MUSIC; 1474 } 1475 AudioProductStrategyVector strategies; 1476 listAudioProductStrategies(strategies); 1477 for (const auto &strategy : strategies) { 1478 if (strategy.getId() == psId) { 1479 auto attrVect = strategy.getAudioAttributes(); 1480 auto iter = std::find_if(begin(attrVect), end(attrVect), [&attr](const auto &refAttr) { 1481 return AudioProductStrategy::attributesMatches( 1482 refAttr.getAttributes(), attr); }); 1483 if (iter != end(attrVect)) { 1484 return iter->getStreamType(); 1485 } 1486 } 1487 } 1488 ALOGE("invalid attributes %s when converting to stream", toString(attr).c_str()); 1489 return AUDIO_STREAM_MUSIC; 1490 } 1491 1492 status_t AudioSystem::getProductStrategyFromAudioAttributes(const AudioAttributes &aa, 1493 product_strategy_t &productStrategy) 1494 { 1495 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1496 if (aps == 0) return PERMISSION_DENIED; 1497 return aps->getProductStrategyFromAudioAttributes(aa,productStrategy); 1498 } 1499 1500 status_t AudioSystem::listAudioVolumeGroups(AudioVolumeGroupVector &groups) 1501 { 1502 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1503 if (aps == 0) return PERMISSION_DENIED; 1504 return aps->listAudioVolumeGroups(groups); 1505 } 1506 1507 status_t AudioSystem::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa, 1508 volume_group_t &volumeGroup) 1509 { 1510 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1511 if (aps == 0) return PERMISSION_DENIED; 1512 return aps->getVolumeGroupFromAudioAttributes(aa, volumeGroup); 1513 } 1514 1515 status_t AudioSystem::setRttEnabled(bool enabled) 1516 { 1517 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1518 if (aps == 0) return PERMISSION_DENIED; 1519 return aps->setRttEnabled(enabled); 1520 } 1521 1522 // --------------------------------------------------------------------------- 1523 1524 int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( 1525 const sp<AudioPortCallback>& callback) 1526 { 1527 Mutex::Autolock _l(mLock); 1528 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1529 if (mAudioPortCallbacks[i] == callback) { 1530 return -1; 1531 } 1532 } 1533 mAudioPortCallbacks.add(callback); 1534 return mAudioPortCallbacks.size(); 1535 } 1536 1537 int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( 1538 const sp<AudioPortCallback>& callback) 1539 { 1540 Mutex::Autolock _l(mLock); 1541 size_t i; 1542 for (i = 0; i < mAudioPortCallbacks.size(); i++) { 1543 if (mAudioPortCallbacks[i] == callback) { 1544 break; 1545 } 1546 } 1547 if (i == mAudioPortCallbacks.size()) { 1548 return -1; 1549 } 1550 mAudioPortCallbacks.removeAt(i); 1551 return mAudioPortCallbacks.size(); 1552 } 1553 1554 1555 void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() 1556 { 1557 Mutex::Autolock _l(mLock); 1558 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1559 mAudioPortCallbacks[i]->onAudioPortListUpdate(); 1560 } 1561 } 1562 1563 void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() 1564 { 1565 Mutex::Autolock _l(mLock); 1566 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1567 mAudioPortCallbacks[i]->onAudioPatchListUpdate(); 1568 } 1569 } 1570 1571 // ---------------------------------------------------------------------------- 1572 int AudioSystem::AudioPolicyServiceClient::addAudioVolumeGroupCallback( 1573 const sp<AudioVolumeGroupCallback>& callback) 1574 { 1575 Mutex::Autolock _l(mLock); 1576 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) { 1577 if (mAudioVolumeGroupCallback[i] == callback) { 1578 return -1; 1579 } 1580 } 1581 mAudioVolumeGroupCallback.add(callback); 1582 return mAudioVolumeGroupCallback.size(); 1583 } 1584 1585 int AudioSystem::AudioPolicyServiceClient::removeAudioVolumeGroupCallback( 1586 const sp<AudioVolumeGroupCallback>& callback) 1587 { 1588 Mutex::Autolock _l(mLock); 1589 size_t i; 1590 for (i = 0; i < mAudioVolumeGroupCallback.size(); i++) { 1591 if (mAudioVolumeGroupCallback[i] == callback) { 1592 break; 1593 } 1594 } 1595 if (i == mAudioVolumeGroupCallback.size()) { 1596 return -1; 1597 } 1598 mAudioVolumeGroupCallback.removeAt(i); 1599 return mAudioVolumeGroupCallback.size(); 1600 } 1601 1602 void AudioSystem::AudioPolicyServiceClient::onAudioVolumeGroupChanged(volume_group_t group, 1603 int flags) 1604 { 1605 Mutex::Autolock _l(mLock); 1606 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) { 1607 mAudioVolumeGroupCallback[i]->onAudioVolumeGroupChanged(group, flags); 1608 } 1609 } 1610 // ---------------------------------------------------------------------------- 1611 1612 void AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate( 1613 String8 regId, int32_t state) 1614 { 1615 ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.string(), state); 1616 dynamic_policy_callback cb = NULL; 1617 { 1618 Mutex::Autolock _l(AudioSystem::gLock); 1619 cb = gDynPolicyCallback; 1620 } 1621 1622 if (cb != NULL) { 1623 cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regId, state); 1624 } 1625 } 1626 1627 void AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate( 1628 int event, 1629 const record_client_info_t *clientInfo, 1630 const audio_config_base_t *clientConfig, 1631 std::vector<effect_descriptor_t> clientEffects, 1632 const audio_config_base_t *deviceConfig, 1633 std::vector<effect_descriptor_t> effects, 1634 audio_patch_handle_t patchHandle, 1635 audio_source_t source) { 1636 record_config_callback cb = NULL; 1637 { 1638 Mutex::Autolock _l(AudioSystem::gLock); 1639 cb = gRecordConfigCallback; 1640 } 1641 1642 if (cb != NULL) { 1643 cb(event, clientInfo, clientConfig, clientEffects, 1644 deviceConfig, effects, patchHandle, source); 1645 } 1646 } 1647 1648 void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) 1649 { 1650 { 1651 Mutex::Autolock _l(mLock); 1652 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1653 mAudioPortCallbacks[i]->onServiceDied(); 1654 } 1655 for (size_t i = 0; i < mAudioVolumeGroupCallback.size(); i++) { 1656 mAudioVolumeGroupCallback[i]->onServiceDied(); 1657 } 1658 } 1659 { 1660 Mutex::Autolock _l(gLockAPS); 1661 AudioSystem::gAudioPolicyService.clear(); 1662 } 1663 1664 ALOGW("AudioPolicyService server died!"); 1665 } 1666 1667 } // namespace android 1668