AudioSystem.cpp revision eeecb980ff4c202d0a3c4b0bfe040dce2f73336d
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 <media/AudioSystem.h> 23#include <media/IAudioFlinger.h> 24#include <media/IAudioPolicyService.h> 25#include <math.h> 26 27#include <system/audio.h> 28 29// ---------------------------------------------------------------------------- 30 31namespace android { 32 33// client singleton for AudioFlinger binder interface 34Mutex AudioSystem::gLock; 35Mutex AudioSystem::gLockAPS; 36sp<IAudioFlinger> AudioSystem::gAudioFlinger; 37sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; 38audio_error_callback AudioSystem::gAudioErrorCallback = NULL; 39dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL; 40record_config_callback AudioSystem::gRecordConfigCallback = NULL; 41 42 43// establish binder interface to AudioFlinger service 44const sp<IAudioFlinger> AudioSystem::get_audio_flinger() 45{ 46 sp<IAudioFlinger> af; 47 sp<AudioFlingerClient> afc; 48 { 49 Mutex::Autolock _l(gLock); 50 if (gAudioFlinger == 0) { 51 sp<IServiceManager> sm = defaultServiceManager(); 52 sp<IBinder> binder; 53 do { 54 binder = sm->getService(String16("media.audio_flinger")); 55 if (binder != 0) 56 break; 57 ALOGW("AudioFlinger not published, waiting..."); 58 usleep(500000); // 0.5 s 59 } while (true); 60 if (gAudioFlingerClient == NULL) { 61 gAudioFlingerClient = new AudioFlingerClient(); 62 } else { 63 if (gAudioErrorCallback) { 64 gAudioErrorCallback(NO_ERROR); 65 } 66 } 67 binder->linkToDeath(gAudioFlingerClient); 68 gAudioFlinger = interface_cast<IAudioFlinger>(binder); 69 LOG_ALWAYS_FATAL_IF(gAudioFlinger == 0); 70 afc = gAudioFlingerClient; 71 } 72 af = gAudioFlinger; 73 } 74 if (afc != 0) { 75 af->registerClient(afc); 76 } 77 return af; 78} 79 80const sp<AudioSystem::AudioFlingerClient> AudioSystem::getAudioFlingerClient() 81{ 82 // calling get_audio_flinger() will initialize gAudioFlingerClient if needed 83 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 84 if (af == 0) return 0; 85 Mutex::Autolock _l(gLock); 86 return gAudioFlingerClient; 87} 88 89sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) 90{ 91 sp<AudioIoDescriptor> desc; 92 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 93 if (afc != 0) { 94 desc = afc->getIoDescriptor(ioHandle); 95 } 96 return desc; 97} 98 99/* static */ status_t AudioSystem::checkAudioFlinger() 100{ 101 if (defaultServiceManager()->checkService(String16("media.audio_flinger")) != 0) { 102 return NO_ERROR; 103 } 104 return DEAD_OBJECT; 105} 106 107status_t AudioSystem::muteMicrophone(bool state) 108{ 109 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 110 if (af == 0) return PERMISSION_DENIED; 111 return af->setMicMute(state); 112} 113 114status_t AudioSystem::isMicrophoneMuted(bool* state) 115{ 116 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 117 if (af == 0) return PERMISSION_DENIED; 118 *state = af->getMicMute(); 119 return NO_ERROR; 120} 121 122status_t AudioSystem::setMasterVolume(float value) 123{ 124 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 125 if (af == 0) return PERMISSION_DENIED; 126 af->setMasterVolume(value); 127 return NO_ERROR; 128} 129 130status_t AudioSystem::setMasterMute(bool mute) 131{ 132 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 133 if (af == 0) return PERMISSION_DENIED; 134 af->setMasterMute(mute); 135 return NO_ERROR; 136} 137 138status_t AudioSystem::getMasterVolume(float* volume) 139{ 140 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 141 if (af == 0) return PERMISSION_DENIED; 142 *volume = af->masterVolume(); 143 return NO_ERROR; 144} 145 146status_t AudioSystem::getMasterMute(bool* mute) 147{ 148 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 149 if (af == 0) return PERMISSION_DENIED; 150 *mute = af->masterMute(); 151 return NO_ERROR; 152} 153 154status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value, 155 audio_io_handle_t output) 156{ 157 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 158 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 159 if (af == 0) return PERMISSION_DENIED; 160 af->setStreamVolume(stream, value, output); 161 return NO_ERROR; 162} 163 164status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) 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->setStreamMute(stream, mute); 170 return NO_ERROR; 171} 172 173status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume, 174 audio_io_handle_t output) 175{ 176 if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; 177 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 178 if (af == 0) return PERMISSION_DENIED; 179 *volume = af->streamVolume(stream, output); 180 return NO_ERROR; 181} 182 183status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute) 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 *mute = af->streamMute(stream); 189 return NO_ERROR; 190} 191 192status_t AudioSystem::setMode(audio_mode_t mode) 193{ 194 if (uint32_t(mode) >= AUDIO_MODE_CNT) return BAD_VALUE; 195 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 196 if (af == 0) return PERMISSION_DENIED; 197 return af->setMode(mode); 198} 199 200status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 201{ 202 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 203 if (af == 0) return PERMISSION_DENIED; 204 return af->setParameters(ioHandle, keyValuePairs); 205} 206 207String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys) 208{ 209 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 210 String8 result = String8(""); 211 if (af == 0) return result; 212 213 result = af->getParameters(ioHandle, keys); 214 return result; 215} 216 217status_t AudioSystem::setParameters(const String8& keyValuePairs) 218{ 219 return setParameters(AUDIO_IO_HANDLE_NONE, keyValuePairs); 220} 221 222String8 AudioSystem::getParameters(const String8& keys) 223{ 224 return getParameters(AUDIO_IO_HANDLE_NONE, keys); 225} 226 227// convert volume steps to natural log scale 228 229// change this value to change volume scaling 230static const float dBPerStep = 0.5f; 231// shouldn't need to touch these 232static const float dBConvert = -dBPerStep * 2.302585093f / 20.0f; 233static const float dBConvertInverse = 1.0f / dBConvert; 234 235float AudioSystem::linearToLog(int volume) 236{ 237 // float v = volume ? exp(float(100 - volume) * dBConvert) : 0; 238 // ALOGD("linearToLog(%d)=%f", volume, v); 239 // return v; 240 return volume ? exp(float(100 - volume) * dBConvert) : 0; 241} 242 243int AudioSystem::logToLinear(float volume) 244{ 245 // int v = volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 246 // ALOGD("logTolinear(%d)=%f", v, volume); 247 // return v; 248 return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; 249} 250 251status_t AudioSystem::getOutputSamplingRate(uint32_t* samplingRate, audio_stream_type_t streamType) 252{ 253 audio_io_handle_t output; 254 255 if (streamType == AUDIO_STREAM_DEFAULT) { 256 streamType = AUDIO_STREAM_MUSIC; 257 } 258 259 output = getOutput(streamType); 260 if (output == 0) { 261 return PERMISSION_DENIED; 262 } 263 264 return getSamplingRate(output, samplingRate); 265} 266 267status_t AudioSystem::getSamplingRate(audio_io_handle_t output, 268 uint32_t* samplingRate) 269{ 270 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 271 if (af == 0) return PERMISSION_DENIED; 272 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output); 273 if (outputDesc == 0) { 274 ALOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output); 275 *samplingRate = af->sampleRate(output); 276 } else { 277 ALOGV("getOutputSamplingRate() reading from output desc"); 278 *samplingRate = outputDesc->mSamplingRate; 279 } 280 if (*samplingRate == 0) { 281 ALOGE("AudioSystem::getSamplingRate failed for output %d", output); 282 return BAD_VALUE; 283 } 284 285 ALOGV("getSamplingRate() output %d, sampling rate %u", output, *samplingRate); 286 287 return NO_ERROR; 288} 289 290status_t AudioSystem::getOutputFrameCount(size_t* frameCount, audio_stream_type_t streamType) 291{ 292 audio_io_handle_t output; 293 294 if (streamType == AUDIO_STREAM_DEFAULT) { 295 streamType = AUDIO_STREAM_MUSIC; 296 } 297 298 output = getOutput(streamType); 299 if (output == AUDIO_IO_HANDLE_NONE) { 300 return PERMISSION_DENIED; 301 } 302 303 return getFrameCount(output, frameCount); 304} 305 306status_t AudioSystem::getFrameCount(audio_io_handle_t output, 307 size_t* frameCount) 308{ 309 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 310 if (af == 0) return PERMISSION_DENIED; 311 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output); 312 if (outputDesc == 0) { 313 *frameCount = af->frameCount(output); 314 } else { 315 *frameCount = outputDesc->mFrameCount; 316 } 317 if (*frameCount == 0) { 318 ALOGE("AudioSystem::getFrameCount failed for output %d", output); 319 return BAD_VALUE; 320 } 321 322 ALOGV("getFrameCount() output %d, frameCount %zu", output, *frameCount); 323 324 return NO_ERROR; 325} 326 327status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) 328{ 329 audio_io_handle_t output; 330 331 if (streamType == AUDIO_STREAM_DEFAULT) { 332 streamType = AUDIO_STREAM_MUSIC; 333 } 334 335 output = getOutput(streamType); 336 if (output == AUDIO_IO_HANDLE_NONE) { 337 return PERMISSION_DENIED; 338 } 339 340 return getLatency(output, latency); 341} 342 343status_t AudioSystem::getLatency(audio_io_handle_t output, 344 uint32_t* latency) 345{ 346 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 347 if (af == 0) return PERMISSION_DENIED; 348 sp<AudioIoDescriptor> outputDesc = getIoDescriptor(output); 349 if (outputDesc == 0) { 350 *latency = af->latency(output); 351 } else { 352 *latency = outputDesc->mLatency; 353 } 354 355 ALOGV("getLatency() output %d, latency %d", output, *latency); 356 357 return NO_ERROR; 358} 359 360status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, audio_format_t format, 361 audio_channel_mask_t channelMask, size_t* buffSize) 362{ 363 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 364 if (afc == 0) { 365 return NO_INIT; 366 } 367 return afc->getInputBufferSize(sampleRate, format, channelMask, buffSize); 368} 369 370status_t AudioSystem::setVoiceVolume(float value) 371{ 372 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 373 if (af == 0) return PERMISSION_DENIED; 374 return af->setVoiceVolume(value); 375} 376 377status_t AudioSystem::getRenderPosition(audio_io_handle_t output, uint32_t *halFrames, 378 uint32_t *dspFrames) 379{ 380 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 381 if (af == 0) return PERMISSION_DENIED; 382 383 return af->getRenderPosition(halFrames, dspFrames, output); 384} 385 386uint32_t AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) 387{ 388 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 389 uint32_t result = 0; 390 if (af == 0) return result; 391 if (ioHandle == AUDIO_IO_HANDLE_NONE) return result; 392 393 result = af->getInputFramesLost(ioHandle); 394 return result; 395} 396 397audio_unique_id_t AudioSystem::newAudioUniqueId(audio_unique_id_use_t use) 398{ 399 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 400 if (af == 0) return AUDIO_UNIQUE_ID_ALLOCATE; 401 return af->newAudioUniqueId(use); 402} 403 404void AudioSystem::acquireAudioSessionId(int audioSession, pid_t pid) 405{ 406 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 407 if (af != 0) { 408 af->acquireAudioSessionId(audioSession, pid); 409 } 410} 411 412void AudioSystem::releaseAudioSessionId(int audioSession, pid_t pid) 413{ 414 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 415 if (af != 0) { 416 af->releaseAudioSessionId(audioSession, pid); 417 } 418} 419 420audio_hw_sync_t AudioSystem::getAudioHwSyncForSession(audio_session_t sessionId) 421{ 422 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 423 if (af == 0) return AUDIO_HW_SYNC_INVALID; 424 return af->getAudioHwSyncForSession(sessionId); 425} 426 427status_t AudioSystem::systemReady() 428{ 429 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 430 if (af == 0) return NO_INIT; 431 return af->systemReady(); 432} 433 434// --------------------------------------------------------------------------- 435 436 437void AudioSystem::AudioFlingerClient::clearIoCache() 438{ 439 Mutex::Autolock _l(mLock); 440 mIoDescriptors.clear(); 441 mInBuffSize = 0; 442 mInSamplingRate = 0; 443 mInFormat = AUDIO_FORMAT_DEFAULT; 444 mInChannelMask = AUDIO_CHANNEL_NONE; 445} 446 447void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused) 448{ 449 audio_error_callback cb = NULL; 450 { 451 Mutex::Autolock _l(AudioSystem::gLock); 452 AudioSystem::gAudioFlinger.clear(); 453 cb = gAudioErrorCallback; 454 } 455 456 // clear output handles and stream to output map caches 457 clearIoCache(); 458 459 if (cb) { 460 cb(DEAD_OBJECT); 461 } 462 ALOGW("AudioFlinger server died!"); 463} 464 465void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event event, 466 const sp<AudioIoDescriptor>& ioDesc) { 467 ALOGV("ioConfigChanged() event %d", event); 468 469 if (ioDesc == 0 || ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return; 470 471 audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE; 472 Vector < sp<AudioDeviceCallback> > callbacks; 473 474 { 475 Mutex::Autolock _l(mLock); 476 477 switch (event) { 478 case AUDIO_OUTPUT_OPENED: 479 case AUDIO_INPUT_OPENED: { 480 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); 481 if (oldDesc == 0) { 482 mIoDescriptors.add(ioDesc->mIoHandle, ioDesc); 483 } else { 484 deviceId = oldDesc->getDeviceId(); 485 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc); 486 } 487 488 if (ioDesc->getDeviceId() != AUDIO_PORT_HANDLE_NONE) { 489 deviceId = ioDesc->getDeviceId(); 490 ssize_t ioIndex = mAudioDeviceCallbacks.indexOfKey(ioDesc->mIoHandle); 491 if (ioIndex >= 0) { 492 callbacks = mAudioDeviceCallbacks.valueAt(ioIndex); 493 } 494 } 495 ALOGV("ioConfigChanged() new %s opened %d samplingRate %u, format %#x channel mask %#x " 496 "frameCount %zu deviceId %d", event == AUDIO_OUTPUT_OPENED ? "output" : "input", 497 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, ioDesc->mChannelMask, 498 ioDesc->mFrameCount, ioDesc->getDeviceId()); 499 } break; 500 case AUDIO_OUTPUT_CLOSED: 501 case AUDIO_INPUT_CLOSED: { 502 if (getIoDescriptor_l(ioDesc->mIoHandle) == 0) { 503 ALOGW("ioConfigChanged() closing unknown %s %d", 504 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle); 505 break; 506 } 507 ALOGV("ioConfigChanged() %s %d closed", 508 event == AUDIO_OUTPUT_CLOSED ? "output" : "input", ioDesc->mIoHandle); 509 510 mIoDescriptors.removeItem(ioDesc->mIoHandle); 511 mAudioDeviceCallbacks.removeItem(ioDesc->mIoHandle); 512 } break; 513 514 case AUDIO_OUTPUT_CONFIG_CHANGED: 515 case AUDIO_INPUT_CONFIG_CHANGED: { 516 sp<AudioIoDescriptor> oldDesc = getIoDescriptor_l(ioDesc->mIoHandle); 517 if (oldDesc == 0) { 518 ALOGW("ioConfigChanged() modifying unknown output! %d", ioDesc->mIoHandle); 519 break; 520 } 521 522 deviceId = oldDesc->getDeviceId(); 523 mIoDescriptors.replaceValueFor(ioDesc->mIoHandle, ioDesc); 524 525 if (deviceId != ioDesc->getDeviceId()) { 526 deviceId = ioDesc->getDeviceId(); 527 ssize_t ioIndex = mAudioDeviceCallbacks.indexOfKey(ioDesc->mIoHandle); 528 if (ioIndex >= 0) { 529 callbacks = mAudioDeviceCallbacks.valueAt(ioIndex); 530 } 531 } 532 ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x " 533 "channel mask %#x frameCount %zu deviceId %d", 534 event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input", 535 ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, 536 ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->getDeviceId()); 537 538 } break; 539 } 540 } 541 // callbacks.size() != 0 => ioDesc->mIoHandle and deviceId are valid 542 for (size_t i = 0; i < callbacks.size(); i++) { 543 callbacks[i]->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId); 544 } 545} 546 547status_t AudioSystem::AudioFlingerClient::getInputBufferSize( 548 uint32_t sampleRate, audio_format_t format, 549 audio_channel_mask_t channelMask, size_t* buffSize) 550{ 551 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 552 if (af == 0) { 553 return PERMISSION_DENIED; 554 } 555 Mutex::Autolock _l(mLock); 556 // Do we have a stale mInBuffSize or are we requesting the input buffer size for new values 557 if ((mInBuffSize == 0) || (sampleRate != mInSamplingRate) || (format != mInFormat) 558 || (channelMask != mInChannelMask)) { 559 size_t inBuffSize = af->getInputBufferSize(sampleRate, format, channelMask); 560 if (inBuffSize == 0) { 561 ALOGE("AudioSystem::getInputBufferSize failed sampleRate %d format %#x channelMask %x", 562 sampleRate, format, channelMask); 563 return BAD_VALUE; 564 } 565 // A benign race is possible here: we could overwrite a fresher cache entry 566 // save the request params 567 mInSamplingRate = sampleRate; 568 mInFormat = format; 569 mInChannelMask = channelMask; 570 571 mInBuffSize = inBuffSize; 572 } 573 574 *buffSize = mInBuffSize; 575 576 return NO_ERROR; 577} 578 579sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor_l(audio_io_handle_t ioHandle) 580{ 581 sp<AudioIoDescriptor> desc; 582 ssize_t index = mIoDescriptors.indexOfKey(ioHandle); 583 if (index >= 0) { 584 desc = mIoDescriptors.valueAt(index); 585 } 586 return desc; 587} 588 589sp<AudioIoDescriptor> AudioSystem::AudioFlingerClient::getIoDescriptor(audio_io_handle_t ioHandle) 590{ 591 Mutex::Autolock _l(mLock); 592 return getIoDescriptor_l(ioHandle); 593} 594 595status_t AudioSystem::AudioFlingerClient::addAudioDeviceCallback( 596 const sp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo) 597{ 598 Mutex::Autolock _l(mLock); 599 Vector < sp<AudioDeviceCallback> > callbacks; 600 ssize_t ioIndex = mAudioDeviceCallbacks.indexOfKey(audioIo); 601 if (ioIndex >= 0) { 602 callbacks = mAudioDeviceCallbacks.valueAt(ioIndex); 603 } 604 605 for (size_t cbIndex = 0; cbIndex < callbacks.size(); cbIndex++) { 606 if (callbacks[cbIndex] == callback) { 607 return INVALID_OPERATION; 608 } 609 } 610 callbacks.add(callback); 611 612 mAudioDeviceCallbacks.replaceValueFor(audioIo, callbacks); 613 return NO_ERROR; 614} 615 616status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback( 617 const sp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo) 618{ 619 Mutex::Autolock _l(mLock); 620 ssize_t ioIndex = mAudioDeviceCallbacks.indexOfKey(audioIo); 621 if (ioIndex < 0) { 622 return INVALID_OPERATION; 623 } 624 Vector < sp<AudioDeviceCallback> > callbacks = mAudioDeviceCallbacks.valueAt(ioIndex); 625 626 size_t cbIndex; 627 for (cbIndex = 0; cbIndex < callbacks.size(); cbIndex++) { 628 if (callbacks[cbIndex] == callback) { 629 break; 630 } 631 } 632 if (cbIndex == callbacks.size()) { 633 return INVALID_OPERATION; 634 } 635 callbacks.removeAt(cbIndex); 636 if (callbacks.size() != 0) { 637 mAudioDeviceCallbacks.replaceValueFor(audioIo, callbacks); 638 } else { 639 mAudioDeviceCallbacks.removeItem(audioIo); 640 } 641 return NO_ERROR; 642} 643 644/* static */ void AudioSystem::setErrorCallback(audio_error_callback cb) 645{ 646 Mutex::Autolock _l(gLock); 647 gAudioErrorCallback = cb; 648} 649 650/*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) 651{ 652 Mutex::Autolock _l(gLock); 653 gDynPolicyCallback = cb; 654} 655 656/*static*/ void AudioSystem::setRecordConfigCallback(record_config_callback cb) 657{ 658 Mutex::Autolock _l(gLock); 659 gRecordConfigCallback = cb; 660} 661 662// client singleton for AudioPolicyService binder interface 663// protected by gLockAPS 664sp<IAudioPolicyService> AudioSystem::gAudioPolicyService; 665sp<AudioSystem::AudioPolicyServiceClient> AudioSystem::gAudioPolicyServiceClient; 666 667 668// establish binder interface to AudioPolicy service 669const sp<IAudioPolicyService> AudioSystem::get_audio_policy_service() 670{ 671 sp<IAudioPolicyService> ap; 672 sp<AudioPolicyServiceClient> apc; 673 { 674 Mutex::Autolock _l(gLockAPS); 675 if (gAudioPolicyService == 0) { 676 sp<IServiceManager> sm = defaultServiceManager(); 677 sp<IBinder> binder; 678 do { 679 binder = sm->getService(String16("media.audio_policy")); 680 if (binder != 0) 681 break; 682 ALOGW("AudioPolicyService not published, waiting..."); 683 usleep(500000); // 0.5 s 684 } while (true); 685 if (gAudioPolicyServiceClient == NULL) { 686 gAudioPolicyServiceClient = new AudioPolicyServiceClient(); 687 } 688 binder->linkToDeath(gAudioPolicyServiceClient); 689 gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); 690 LOG_ALWAYS_FATAL_IF(gAudioPolicyService == 0); 691 apc = gAudioPolicyServiceClient; 692 } 693 ap = gAudioPolicyService; 694 } 695 if (apc != 0) { 696 ap->registerClient(apc); 697 } 698 699 return ap; 700} 701 702// --------------------------------------------------------------------------- 703 704status_t AudioSystem::setDeviceConnectionState(audio_devices_t device, 705 audio_policy_dev_state_t state, 706 const char *device_address, 707 const char *device_name) 708{ 709 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 710 const char *address = ""; 711 const char *name = ""; 712 713 if (aps == 0) return PERMISSION_DENIED; 714 715 if (device_address != NULL) { 716 address = device_address; 717 } 718 if (device_name != NULL) { 719 name = device_name; 720 } 721 return aps->setDeviceConnectionState(device, state, address, name); 722} 723 724audio_policy_dev_state_t AudioSystem::getDeviceConnectionState(audio_devices_t device, 725 const char *device_address) 726{ 727 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 728 if (aps == 0) return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 729 730 return aps->getDeviceConnectionState(device, device_address); 731} 732 733status_t AudioSystem::setPhoneState(audio_mode_t state) 734{ 735 if (uint32_t(state) >= AUDIO_MODE_CNT) return BAD_VALUE; 736 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 737 if (aps == 0) return PERMISSION_DENIED; 738 739 return aps->setPhoneState(state); 740} 741 742status_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 743{ 744 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 745 if (aps == 0) return PERMISSION_DENIED; 746 return aps->setForceUse(usage, config); 747} 748 749audio_policy_forced_cfg_t AudioSystem::getForceUse(audio_policy_force_use_t usage) 750{ 751 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 752 if (aps == 0) return AUDIO_POLICY_FORCE_NONE; 753 return aps->getForceUse(usage); 754} 755 756 757audio_io_handle_t AudioSystem::getOutput(audio_stream_type_t stream, 758 uint32_t samplingRate, 759 audio_format_t format, 760 audio_channel_mask_t channelMask, 761 audio_output_flags_t flags, 762 const audio_offload_info_t *offloadInfo) 763{ 764 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 765 if (aps == 0) return 0; 766 return aps->getOutput(stream, samplingRate, format, channelMask, flags, offloadInfo); 767} 768 769status_t AudioSystem::getOutputForAttr(const audio_attributes_t *attr, 770 audio_io_handle_t *output, 771 audio_session_t session, 772 audio_stream_type_t *stream, 773 uid_t uid, 774 uint32_t samplingRate, 775 audio_format_t format, 776 audio_channel_mask_t channelMask, 777 audio_output_flags_t flags, 778 audio_port_handle_t selectedDeviceId, 779 const audio_offload_info_t *offloadInfo) 780{ 781 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 782 if (aps == 0) return NO_INIT; 783 return aps->getOutputForAttr(attr, output, session, stream, uid, 784 samplingRate, format, channelMask, 785 flags, selectedDeviceId, offloadInfo); 786} 787 788status_t AudioSystem::startOutput(audio_io_handle_t output, 789 audio_stream_type_t stream, 790 audio_session_t session) 791{ 792 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 793 if (aps == 0) return PERMISSION_DENIED; 794 return aps->startOutput(output, stream, session); 795} 796 797status_t AudioSystem::stopOutput(audio_io_handle_t output, 798 audio_stream_type_t stream, 799 audio_session_t session) 800{ 801 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 802 if (aps == 0) return PERMISSION_DENIED; 803 return aps->stopOutput(output, stream, session); 804} 805 806void AudioSystem::releaseOutput(audio_io_handle_t output, 807 audio_stream_type_t stream, 808 audio_session_t session) 809{ 810 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 811 if (aps == 0) return; 812 aps->releaseOutput(output, stream, session); 813} 814 815status_t AudioSystem::getInputForAttr(const audio_attributes_t *attr, 816 audio_io_handle_t *input, 817 audio_session_t session, 818 uid_t uid, 819 uint32_t samplingRate, 820 audio_format_t format, 821 audio_channel_mask_t channelMask, 822 audio_input_flags_t flags, 823 audio_port_handle_t selectedDeviceId) 824{ 825 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 826 if (aps == 0) return NO_INIT; 827 return aps->getInputForAttr( 828 attr, input, session, uid, samplingRate, format, channelMask, flags, selectedDeviceId); 829} 830 831status_t AudioSystem::startInput(audio_io_handle_t input, 832 audio_session_t session) 833{ 834 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 835 if (aps == 0) return PERMISSION_DENIED; 836 return aps->startInput(input, session); 837} 838 839status_t AudioSystem::stopInput(audio_io_handle_t input, 840 audio_session_t session) 841{ 842 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 843 if (aps == 0) return PERMISSION_DENIED; 844 return aps->stopInput(input, session); 845} 846 847void AudioSystem::releaseInput(audio_io_handle_t input, 848 audio_session_t session) 849{ 850 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 851 if (aps == 0) return; 852 aps->releaseInput(input, session); 853} 854 855status_t AudioSystem::initStreamVolume(audio_stream_type_t stream, 856 int indexMin, 857 int indexMax) 858{ 859 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 860 if (aps == 0) return PERMISSION_DENIED; 861 return aps->initStreamVolume(stream, indexMin, indexMax); 862} 863 864status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, 865 int index, 866 audio_devices_t device) 867{ 868 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 869 if (aps == 0) return PERMISSION_DENIED; 870 return aps->setStreamVolumeIndex(stream, index, device); 871} 872 873status_t AudioSystem::getStreamVolumeIndex(audio_stream_type_t stream, 874 int *index, 875 audio_devices_t device) 876{ 877 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 878 if (aps == 0) return PERMISSION_DENIED; 879 return aps->getStreamVolumeIndex(stream, index, device); 880} 881 882uint32_t AudioSystem::getStrategyForStream(audio_stream_type_t stream) 883{ 884 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 885 if (aps == 0) return 0; 886 return aps->getStrategyForStream(stream); 887} 888 889audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) 890{ 891 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 892 if (aps == 0) return AUDIO_DEVICE_NONE; 893 return aps->getDevicesForStream(stream); 894} 895 896audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc) 897{ 898 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 899 // FIXME change return type to status_t, and return PERMISSION_DENIED here 900 if (aps == 0) return AUDIO_IO_HANDLE_NONE; 901 return aps->getOutputForEffect(desc); 902} 903 904status_t AudioSystem::registerEffect(const effect_descriptor_t *desc, 905 audio_io_handle_t io, 906 uint32_t strategy, 907 int session, 908 int id) 909{ 910 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 911 if (aps == 0) return PERMISSION_DENIED; 912 return aps->registerEffect(desc, io, strategy, session, id); 913} 914 915status_t AudioSystem::unregisterEffect(int id) 916{ 917 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 918 if (aps == 0) return PERMISSION_DENIED; 919 return aps->unregisterEffect(id); 920} 921 922status_t AudioSystem::setEffectEnabled(int id, bool enabled) 923{ 924 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 925 if (aps == 0) return PERMISSION_DENIED; 926 return aps->setEffectEnabled(id, enabled); 927} 928 929status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) 930{ 931 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 932 if (aps == 0) return PERMISSION_DENIED; 933 if (state == NULL) return BAD_VALUE; 934 *state = aps->isStreamActive(stream, inPastMs); 935 return NO_ERROR; 936} 937 938status_t AudioSystem::isStreamActiveRemotely(audio_stream_type_t stream, bool* state, 939 uint32_t inPastMs) 940{ 941 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 942 if (aps == 0) return PERMISSION_DENIED; 943 if (state == NULL) return BAD_VALUE; 944 *state = aps->isStreamActiveRemotely(stream, inPastMs); 945 return NO_ERROR; 946} 947 948status_t AudioSystem::isSourceActive(audio_source_t stream, bool* state) 949{ 950 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 951 if (aps == 0) return PERMISSION_DENIED; 952 if (state == NULL) return BAD_VALUE; 953 *state = aps->isSourceActive(stream); 954 return NO_ERROR; 955} 956 957uint32_t AudioSystem::getPrimaryOutputSamplingRate() 958{ 959 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 960 if (af == 0) return 0; 961 return af->getPrimaryOutputSamplingRate(); 962} 963 964size_t AudioSystem::getPrimaryOutputFrameCount() 965{ 966 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 967 if (af == 0) return 0; 968 return af->getPrimaryOutputFrameCount(); 969} 970 971status_t AudioSystem::setLowRamDevice(bool isLowRamDevice) 972{ 973 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 974 if (af == 0) return PERMISSION_DENIED; 975 return af->setLowRamDevice(isLowRamDevice); 976} 977 978void AudioSystem::clearAudioConfigCache() 979{ 980 // called by restoreTrack_l(), which needs new IAudioFlinger and IAudioPolicyService instances 981 ALOGV("clearAudioConfigCache()"); 982 { 983 Mutex::Autolock _l(gLock); 984 if (gAudioFlingerClient != 0) { 985 gAudioFlingerClient->clearIoCache(); 986 } 987 gAudioFlinger.clear(); 988 } 989 { 990 Mutex::Autolock _l(gLockAPS); 991 gAudioPolicyService.clear(); 992 } 993} 994 995bool AudioSystem::isOffloadSupported(const audio_offload_info_t& info) 996{ 997 ALOGV("isOffloadSupported()"); 998 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 999 if (aps == 0) return false; 1000 return aps->isOffloadSupported(info); 1001} 1002 1003status_t AudioSystem::listAudioPorts(audio_port_role_t role, 1004 audio_port_type_t type, 1005 unsigned int *num_ports, 1006 struct audio_port *ports, 1007 unsigned int *generation) 1008{ 1009 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1010 if (aps == 0) return PERMISSION_DENIED; 1011 return aps->listAudioPorts(role, type, num_ports, ports, generation); 1012} 1013 1014status_t AudioSystem::getAudioPort(struct audio_port *port) 1015{ 1016 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1017 if (aps == 0) return PERMISSION_DENIED; 1018 return aps->getAudioPort(port); 1019} 1020 1021status_t AudioSystem::createAudioPatch(const struct audio_patch *patch, 1022 audio_patch_handle_t *handle) 1023{ 1024 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1025 if (aps == 0) return PERMISSION_DENIED; 1026 return aps->createAudioPatch(patch, handle); 1027} 1028 1029status_t AudioSystem::releaseAudioPatch(audio_patch_handle_t handle) 1030{ 1031 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1032 if (aps == 0) return PERMISSION_DENIED; 1033 return aps->releaseAudioPatch(handle); 1034} 1035 1036status_t AudioSystem::listAudioPatches(unsigned int *num_patches, 1037 struct audio_patch *patches, 1038 unsigned int *generation) 1039{ 1040 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1041 if (aps == 0) return PERMISSION_DENIED; 1042 return aps->listAudioPatches(num_patches, patches, generation); 1043} 1044 1045status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config) 1046{ 1047 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1048 if (aps == 0) return PERMISSION_DENIED; 1049 return aps->setAudioPortConfig(config); 1050} 1051 1052status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback) 1053{ 1054 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1055 if (aps == 0) return PERMISSION_DENIED; 1056 1057 Mutex::Autolock _l(gLockAPS); 1058 if (gAudioPolicyServiceClient == 0) { 1059 return NO_INIT; 1060 } 1061 int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback); 1062 if (ret == 1) { 1063 aps->setAudioPortCallbacksEnabled(true); 1064 } 1065 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1066} 1067 1068/*static*/ 1069status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callback) 1070{ 1071 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1072 if (aps == 0) return PERMISSION_DENIED; 1073 1074 Mutex::Autolock _l(gLockAPS); 1075 if (gAudioPolicyServiceClient == 0) { 1076 return NO_INIT; 1077 } 1078 int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback); 1079 if (ret == 0) { 1080 aps->setAudioPortCallbacksEnabled(false); 1081 } 1082 return (ret < 0) ? INVALID_OPERATION : NO_ERROR; 1083} 1084 1085status_t AudioSystem::addAudioDeviceCallback( 1086 const sp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo) 1087{ 1088 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 1089 if (afc == 0) { 1090 return NO_INIT; 1091 } 1092 status_t status = afc->addAudioDeviceCallback(callback, audioIo); 1093 if (status == NO_ERROR) { 1094 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1095 if (af != 0) { 1096 af->registerClient(afc); 1097 } 1098 } 1099 return status; 1100} 1101 1102status_t AudioSystem::removeAudioDeviceCallback( 1103 const sp<AudioDeviceCallback>& callback, audio_io_handle_t audioIo) 1104{ 1105 const sp<AudioFlingerClient> afc = getAudioFlingerClient(); 1106 if (afc == 0) { 1107 return NO_INIT; 1108 } 1109 return afc->removeAudioDeviceCallback(callback, audioIo); 1110} 1111 1112audio_port_handle_t AudioSystem::getDeviceIdForIo(audio_io_handle_t audioIo) 1113{ 1114 const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); 1115 if (af == 0) return PERMISSION_DENIED; 1116 const sp<AudioIoDescriptor> desc = getIoDescriptor(audioIo); 1117 if (desc == 0) { 1118 return AUDIO_PORT_HANDLE_NONE; 1119 } 1120 return desc->getDeviceId(); 1121} 1122 1123status_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session, 1124 audio_io_handle_t *ioHandle, 1125 audio_devices_t *device) 1126{ 1127 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1128 if (aps == 0) return PERMISSION_DENIED; 1129 return aps->acquireSoundTriggerSession(session, ioHandle, device); 1130} 1131 1132status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session) 1133{ 1134 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1135 if (aps == 0) return PERMISSION_DENIED; 1136 return aps->releaseSoundTriggerSession(session); 1137} 1138 1139audio_mode_t AudioSystem::getPhoneState() 1140{ 1141 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1142 if (aps == 0) return AUDIO_MODE_INVALID; 1143 return aps->getPhoneState(); 1144} 1145 1146status_t AudioSystem::registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 1147{ 1148 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1149 if (aps == 0) return PERMISSION_DENIED; 1150 return aps->registerPolicyMixes(mixes, registration); 1151} 1152 1153status_t AudioSystem::startAudioSource(const struct audio_port_config *source, 1154 const audio_attributes_t *attributes, 1155 audio_io_handle_t *handle) 1156{ 1157 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1158 if (aps == 0) return PERMISSION_DENIED; 1159 return aps->startAudioSource(source, attributes, handle); 1160} 1161 1162status_t AudioSystem::stopAudioSource(audio_io_handle_t handle) 1163{ 1164 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1165 if (aps == 0) return PERMISSION_DENIED; 1166 return aps->stopAudioSource(handle); 1167} 1168 1169status_t AudioSystem::setMasterMono(bool mono) 1170{ 1171 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1172 if (aps == 0) return PERMISSION_DENIED; 1173 return aps->setMasterMono(mono); 1174} 1175 1176status_t AudioSystem::getMasterMono(bool *mono) 1177{ 1178 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 1179 if (aps == 0) return PERMISSION_DENIED; 1180 return aps->getMasterMono(mono); 1181} 1182 1183// --------------------------------------------------------------------------- 1184 1185int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( 1186 const sp<AudioPortCallback>& callback) 1187{ 1188 Mutex::Autolock _l(mLock); 1189 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1190 if (mAudioPortCallbacks[i] == callback) { 1191 return -1; 1192 } 1193 } 1194 mAudioPortCallbacks.add(callback); 1195 return mAudioPortCallbacks.size(); 1196} 1197 1198int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( 1199 const sp<AudioPortCallback>& callback) 1200{ 1201 Mutex::Autolock _l(mLock); 1202 size_t i; 1203 for (i = 0; i < mAudioPortCallbacks.size(); i++) { 1204 if (mAudioPortCallbacks[i] == callback) { 1205 break; 1206 } 1207 } 1208 if (i == mAudioPortCallbacks.size()) { 1209 return -1; 1210 } 1211 mAudioPortCallbacks.removeAt(i); 1212 return mAudioPortCallbacks.size(); 1213} 1214 1215 1216void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() 1217{ 1218 Mutex::Autolock _l(mLock); 1219 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1220 mAudioPortCallbacks[i]->onAudioPortListUpdate(); 1221 } 1222} 1223 1224void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() 1225{ 1226 Mutex::Autolock _l(mLock); 1227 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1228 mAudioPortCallbacks[i]->onAudioPatchListUpdate(); 1229 } 1230} 1231 1232void AudioSystem::AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate( 1233 String8 regId, int32_t state) 1234{ 1235 ALOGV("AudioPolicyServiceClient::onDynamicPolicyMixStateUpdate(%s, %d)", regId.string(), state); 1236 dynamic_policy_callback cb = NULL; 1237 { 1238 Mutex::Autolock _l(AudioSystem::gLock); 1239 cb = gDynPolicyCallback; 1240 } 1241 1242 if (cb != NULL) { 1243 cb(DYNAMIC_POLICY_EVENT_MIX_STATE_UPDATE, regId, state); 1244 } 1245} 1246 1247void AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate( 1248 int event, audio_session_t session, audio_source_t source, 1249 const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig, 1250 audio_patch_handle_t patchHandle) { 1251 record_config_callback cb = NULL; 1252 { 1253 Mutex::Autolock _l(AudioSystem::gLock); 1254 cb = gRecordConfigCallback; 1255 } 1256 1257 if (cb != NULL) { 1258 cb(event, session, source, clientConfig, deviceConfig, patchHandle); 1259 } 1260} 1261 1262void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) 1263{ 1264 { 1265 Mutex::Autolock _l(mLock); 1266 for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { 1267 mAudioPortCallbacks[i]->onServiceDied(); 1268 } 1269 } 1270 { 1271 Mutex::Autolock _l(gLockAPS); 1272 AudioSystem::gAudioPolicyService.clear(); 1273 } 1274 1275 ALOGW("AudioPolicyService server died!"); 1276} 1277 1278} // namespace android 1279