1 /* 2 ** Copyright 2010, 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 #include <math.h> 18 19 //#define LOG_NDEBUG 0 20 #define LOG_TAG "AudioHardware" 21 22 #include <utils/Log.h> 23 #include <utils/String8.h> 24 25 #include <stdio.h> 26 #include <unistd.h> 27 #include <sys/ioctl.h> 28 #include <sys/types.h> 29 #include <sys/stat.h> 30 #include <sys/resource.h> 31 #include <dlfcn.h> 32 #include <fcntl.h> 33 34 #include "AudioHardware.h" 35 #include <media/AudioRecord.h> 36 #include <audio_effects/effect_aec.h> 37 38 extern "C" { 39 #include <tinyalsa/asoundlib.h> 40 } 41 42 43 namespace android_audio_legacy { 44 45 const uint32_t AudioHardware::inputConfigTable[][AudioHardware::INPUT_CONFIG_CNT] = { 46 {8000, 4}, 47 {11025, 4}, 48 {16000, 2}, 49 {22050, 2}, 50 {32000, 1}, 51 {44100, 1} 52 }; 53 54 // trace driver operations for dump 55 // 56 #define DRIVER_TRACE 57 58 enum { 59 DRV_NONE, 60 DRV_PCM_OPEN, 61 DRV_PCM_CLOSE, 62 DRV_PCM_WRITE, 63 DRV_PCM_READ, 64 DRV_MIXER_OPEN, 65 DRV_MIXER_CLOSE, 66 DRV_MIXER_GET, 67 DRV_MIXER_SEL 68 }; 69 70 #ifdef DRIVER_TRACE 71 #define TRACE_DRIVER_IN(op) mDriverOp = op; 72 #define TRACE_DRIVER_OUT mDriverOp = DRV_NONE; 73 #else 74 #define TRACE_DRIVER_IN(op) 75 #define TRACE_DRIVER_OUT 76 #endif 77 78 // ---------------------------------------------------------------------------- 79 80 const char *AudioHardware::inputPathNameDefault = "Default"; 81 const char *AudioHardware::inputPathNameCamcorder = "Camcorder"; 82 const char *AudioHardware::inputPathNameVoiceRecognition = "Voice Recognition"; 83 84 AudioHardware::AudioHardware() : 85 mInit(false), 86 mMicMute(false), 87 mPcm(NULL), 88 mMixer(NULL), 89 mPcmOpenCnt(0), 90 mMixerOpenCnt(0), 91 mInCallAudioMode(false), 92 mVoiceVol(1.0f), 93 mInputSource(AUDIO_SOURCE_DEFAULT), 94 mBluetoothNrec(true), 95 mTTYMode(TTY_MODE_OFF), 96 mSecRilLibHandle(NULL), 97 mRilClient(0), 98 mActivatedCP(false), 99 mEchoReference(NULL), 100 mDriverOp(DRV_NONE) 101 { 102 loadRILD(); 103 mInit = true; 104 } 105 106 AudioHardware::~AudioHardware() 107 { 108 for (size_t index = 0; index < mInputs.size(); index++) { 109 closeInputStream(mInputs[index].get()); 110 } 111 mInputs.clear(); 112 closeOutputStream((AudioStreamOut*)mOutput.get()); 113 114 if (mMixer) { 115 TRACE_DRIVER_IN(DRV_MIXER_CLOSE) 116 mixer_close(mMixer); 117 TRACE_DRIVER_OUT 118 } 119 if (mPcm) { 120 TRACE_DRIVER_IN(DRV_PCM_CLOSE) 121 pcm_close(mPcm); 122 TRACE_DRIVER_OUT 123 } 124 125 if (mSecRilLibHandle) { 126 if (disconnectRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS) 127 LOGE("Disconnect_RILD() error"); 128 129 if (closeClientRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS) 130 LOGE("CloseClient_RILD() error"); 131 132 mRilClient = 0; 133 134 dlclose(mSecRilLibHandle); 135 mSecRilLibHandle = NULL; 136 } 137 138 mInit = false; 139 } 140 141 status_t AudioHardware::initCheck() 142 { 143 return mInit ? NO_ERROR : NO_INIT; 144 } 145 146 void AudioHardware::loadRILD(void) 147 { 148 mSecRilLibHandle = dlopen("libsecril-client.so", RTLD_NOW); 149 150 if (mSecRilLibHandle) { 151 LOGV("libsecril-client.so is loaded"); 152 153 openClientRILD = (HRilClient (*)(void)) 154 dlsym(mSecRilLibHandle, "OpenClient_RILD"); 155 disconnectRILD = (int (*)(HRilClient)) 156 dlsym(mSecRilLibHandle, "Disconnect_RILD"); 157 closeClientRILD = (int (*)(HRilClient)) 158 dlsym(mSecRilLibHandle, "CloseClient_RILD"); 159 isConnectedRILD = (int (*)(HRilClient)) 160 dlsym(mSecRilLibHandle, "isConnected_RILD"); 161 connectRILD = (int (*)(HRilClient)) 162 dlsym(mSecRilLibHandle, "Connect_RILD"); 163 setCallVolume = (int (*)(HRilClient, SoundType, int)) 164 dlsym(mSecRilLibHandle, "SetCallVolume"); 165 setCallAudioPath = (int (*)(HRilClient, AudioPath)) 166 dlsym(mSecRilLibHandle, "SetCallAudioPath"); 167 setCallClockSync = (int (*)(HRilClient, SoundClockCondition)) 168 dlsym(mSecRilLibHandle, "SetCallClockSync"); 169 170 if (!openClientRILD || !disconnectRILD || !closeClientRILD || 171 !isConnectedRILD || !connectRILD || 172 !setCallVolume || !setCallAudioPath || !setCallClockSync) { 173 LOGE("Can't load all functions from libsecril-client.so"); 174 175 dlclose(mSecRilLibHandle); 176 mSecRilLibHandle = NULL; 177 } else { 178 mRilClient = openClientRILD(); 179 if (!mRilClient) { 180 LOGE("OpenClient_RILD() error"); 181 182 dlclose(mSecRilLibHandle); 183 mSecRilLibHandle = NULL; 184 } 185 } 186 } else { 187 LOGE("Can't load libsecril-client.so"); 188 } 189 } 190 191 status_t AudioHardware::connectRILDIfRequired(void) 192 { 193 if (!mSecRilLibHandle) { 194 LOGE("connectIfRequired() lib is not loaded"); 195 return INVALID_OPERATION; 196 } 197 198 if (isConnectedRILD(mRilClient)) { 199 return OK; 200 } 201 202 if (connectRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS) { 203 LOGE("Connect_RILD() error"); 204 return INVALID_OPERATION; 205 } 206 207 return OK; 208 } 209 210 AudioStreamOut* AudioHardware::openOutputStream( 211 uint32_t devices, int *format, uint32_t *channels, 212 uint32_t *sampleRate, status_t *status) 213 { 214 sp <AudioStreamOutALSA> out; 215 status_t rc; 216 217 { // scope for the lock 218 Mutex::Autolock lock(mLock); 219 220 // only one output stream allowed 221 if (mOutput != 0) { 222 if (status) { 223 *status = INVALID_OPERATION; 224 } 225 return NULL; 226 } 227 228 out = new AudioStreamOutALSA(); 229 230 rc = out->set(this, devices, format, channels, sampleRate); 231 if (rc == NO_ERROR) { 232 mOutput = out; 233 } 234 } 235 236 if (rc != NO_ERROR) { 237 if (out != 0) { 238 out.clear(); 239 } 240 } 241 if (status) { 242 *status = rc; 243 } 244 245 return out.get(); 246 } 247 248 void AudioHardware::closeOutputStream(AudioStreamOut* out) { 249 sp <AudioStreamOutALSA> spOut; 250 sp<AudioStreamInALSA> spIn; 251 { 252 Mutex::Autolock lock(mLock); 253 if (mOutput == 0 || mOutput.get() != out) { 254 LOGW("Attempt to close invalid output stream"); 255 return; 256 } 257 spOut = mOutput; 258 mOutput.clear(); 259 if (mEchoReference != NULL) { 260 spIn = getActiveInput_l(); 261 } 262 } 263 if (spIn != 0) { 264 // this will safely release the echo reference by calling releaseEchoReference() 265 // after placing the active input in standby 266 spIn->standby(); 267 } 268 269 spOut.clear(); 270 } 271 272 AudioStreamIn* AudioHardware::openInputStream( 273 uint32_t devices, int *format, uint32_t *channels, 274 uint32_t *sampleRate, status_t *status, 275 AudioSystem::audio_in_acoustics acoustic_flags) 276 { 277 // check for valid input source 278 if (!AudioSystem::isInputDevice((AudioSystem::audio_devices)devices)) { 279 if (status) { 280 *status = BAD_VALUE; 281 } 282 return NULL; 283 } 284 285 status_t rc = NO_ERROR; 286 sp <AudioStreamInALSA> in; 287 288 { // scope for the lock 289 Mutex::Autolock lock(mLock); 290 291 in = new AudioStreamInALSA(); 292 rc = in->set(this, devices, format, channels, sampleRate, acoustic_flags); 293 if (rc == NO_ERROR) { 294 mInputs.add(in); 295 } 296 } 297 298 if (rc != NO_ERROR) { 299 if (in != 0) { 300 in.clear(); 301 } 302 } 303 if (status) { 304 *status = rc; 305 } 306 307 LOGV("AudioHardware::openInputStream()%p", in.get()); 308 return in.get(); 309 } 310 311 void AudioHardware::closeInputStream(AudioStreamIn* in) { 312 313 sp<AudioStreamInALSA> spIn; 314 { 315 Mutex::Autolock lock(mLock); 316 317 ssize_t index = mInputs.indexOf((AudioStreamInALSA *)in); 318 if (index < 0) { 319 LOGW("Attempt to close invalid input stream"); 320 return; 321 } 322 spIn = mInputs[index]; 323 mInputs.removeAt(index); 324 } 325 LOGV("AudioHardware::closeInputStream()%p", in); 326 spIn.clear(); 327 } 328 329 330 status_t AudioHardware::setMode(int mode) 331 { 332 sp<AudioStreamOutALSA> spOut; 333 sp<AudioStreamInALSA> spIn; 334 status_t status; 335 336 // Mutex acquisition order is always out -> in -> hw 337 AutoMutex lock(mLock); 338 339 spOut = mOutput; 340 while (spOut != 0) { 341 if (!spOut->checkStandby()) { 342 int cnt = spOut->prepareLock(); 343 mLock.unlock(); 344 spOut->lock(); 345 mLock.lock(); 346 // make sure that another thread did not change output state while the 347 // mutex is released 348 if ((spOut == mOutput) && (cnt == spOut->standbyCnt())) { 349 break; 350 } 351 spOut->unlock(); 352 spOut = mOutput; 353 } else { 354 spOut.clear(); 355 } 356 } 357 // spOut is not 0 here only if the output is active 358 359 spIn = getActiveInput_l(); 360 while (spIn != 0) { 361 int cnt = spIn->prepareLock(); 362 mLock.unlock(); 363 spIn->lock(); 364 mLock.lock(); 365 // make sure that another thread did not change input state while the 366 // mutex is released 367 if ((spIn == getActiveInput_l()) && (cnt == spIn->standbyCnt())) { 368 break; 369 } 370 spIn->unlock(); 371 spIn = getActiveInput_l(); 372 } 373 // spIn is not 0 here only if the input is active 374 375 int prevMode = mMode; 376 status = AudioHardwareBase::setMode(mode); 377 LOGV("setMode() : new %d, old %d", mMode, prevMode); 378 if (status == NO_ERROR) { 379 bool modeNeedsCPActive = mMode == AudioSystem::MODE_IN_CALL || 380 mMode == AudioSystem::MODE_RINGTONE; 381 // activate call clock in radio when entering in call or ringtone mode 382 if (modeNeedsCPActive) 383 { 384 if ((!mActivatedCP) && (mSecRilLibHandle) && (connectRILDIfRequired() == OK)) { 385 setCallClockSync(mRilClient, SOUND_CLOCK_START); 386 mActivatedCP = true; 387 } 388 } 389 390 if (mMode == AudioSystem::MODE_IN_CALL && !mInCallAudioMode) { 391 if (spOut != 0) { 392 LOGV("setMode() in call force output standby"); 393 spOut->doStandby_l(); 394 } 395 if (spIn != 0) { 396 LOGV("setMode() in call force input standby"); 397 spIn->doStandby_l(); 398 } 399 400 LOGV("setMode() openPcmOut_l()"); 401 openPcmOut_l(); 402 openMixer_l(); 403 setInputSource_l(AUDIO_SOURCE_DEFAULT); 404 setVoiceVolume_l(mVoiceVol); 405 mInCallAudioMode = true; 406 } 407 if (mMode != AudioSystem::MODE_IN_CALL && mInCallAudioMode) { 408 setInputSource_l(mInputSource); 409 if (mMixer != NULL) { 410 TRACE_DRIVER_IN(DRV_MIXER_GET) 411 struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Playback Path"); 412 TRACE_DRIVER_OUT 413 if (ctl != NULL) { 414 LOGV("setMode() reset Playback Path to RCV"); 415 TRACE_DRIVER_IN(DRV_MIXER_SEL) 416 mixer_ctl_set_enum_by_string(ctl, "RCV"); 417 TRACE_DRIVER_OUT 418 } 419 } 420 LOGV("setMode() closePcmOut_l()"); 421 closeMixer_l(); 422 closePcmOut_l(); 423 424 if (spOut != 0) { 425 LOGV("setMode() off call force output standby"); 426 spOut->doStandby_l(); 427 } 428 if (spIn != 0) { 429 LOGV("setMode() off call force input standby"); 430 spIn->doStandby_l(); 431 } 432 433 mInCallAudioMode = false; 434 } 435 436 if (!modeNeedsCPActive) { 437 if(mActivatedCP) 438 mActivatedCP = false; 439 } 440 } 441 442 if (spIn != 0) { 443 spIn->unlock(); 444 } 445 if (spOut != 0) { 446 spOut->unlock(); 447 } 448 449 return status; 450 } 451 452 status_t AudioHardware::setMicMute(bool state) 453 { 454 LOGV("setMicMute(%d) mMicMute %d", state, mMicMute); 455 sp<AudioStreamInALSA> spIn; 456 { 457 AutoMutex lock(mLock); 458 if (mMicMute != state) { 459 mMicMute = state; 460 // in call mute is handled by RIL 461 if (mMode != AudioSystem::MODE_IN_CALL) { 462 spIn = getActiveInput_l(); 463 } 464 } 465 } 466 467 if (spIn != 0) { 468 spIn->standby(); 469 } 470 471 return NO_ERROR; 472 } 473 474 status_t AudioHardware::getMicMute(bool* state) 475 { 476 *state = mMicMute; 477 return NO_ERROR; 478 } 479 480 status_t AudioHardware::setParameters(const String8& keyValuePairs) 481 { 482 AudioParameter param = AudioParameter(keyValuePairs); 483 String8 value; 484 String8 key; 485 const char BT_NREC_KEY[] = "bt_headset_nrec"; 486 const char BT_NREC_VALUE_ON[] = "on"; 487 const char TTY_MODE_KEY[] = "tty_mode"; 488 const char TTY_MODE_VALUE_OFF[] = "tty_off"; 489 const char TTY_MODE_VALUE_VCO[] = "tty_vco"; 490 const char TTY_MODE_VALUE_HCO[] = "tty_hco"; 491 const char TTY_MODE_VALUE_FULL[] = "tty_full"; 492 493 key = String8(BT_NREC_KEY); 494 if (param.get(key, value) == NO_ERROR) { 495 if (value == BT_NREC_VALUE_ON) { 496 mBluetoothNrec = true; 497 } else { 498 mBluetoothNrec = false; 499 LOGD("Turning noise reduction and echo cancellation off for BT " 500 "headset"); 501 } 502 param.remove(String8(BT_NREC_KEY)); 503 } 504 505 key = String8(TTY_MODE_KEY); 506 if (param.get(key, value) == NO_ERROR) { 507 int ttyMode; 508 if (value == TTY_MODE_VALUE_OFF) { 509 ttyMode = TTY_MODE_OFF; 510 } else if (value == TTY_MODE_VALUE_VCO) { 511 ttyMode = TTY_MODE_VCO; 512 } else if (value == TTY_MODE_VALUE_HCO) { 513 ttyMode = TTY_MODE_HCO; 514 } else if (value == TTY_MODE_VALUE_FULL) { 515 ttyMode = TTY_MODE_FULL; 516 } else { 517 return BAD_VALUE; 518 } 519 520 if (ttyMode != mTTYMode) { 521 LOGV("new tty mode %d", ttyMode); 522 mTTYMode = ttyMode; 523 if (mOutput != 0 && mMode == AudioSystem::MODE_IN_CALL) { 524 setIncallPath_l(mOutput->device()); 525 } 526 } 527 param.remove(String8(TTY_MODE_KEY)); 528 } 529 530 return NO_ERROR; 531 } 532 533 String8 AudioHardware::getParameters(const String8& keys) 534 { 535 AudioParameter request = AudioParameter(keys); 536 AudioParameter reply = AudioParameter(); 537 538 LOGV("getParameters() %s", keys.string()); 539 540 return reply.toString(); 541 } 542 543 size_t AudioHardware::getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 544 { 545 if (format != AudioSystem::PCM_16_BIT) { 546 LOGW("getInputBufferSize bad format: %d", format); 547 return 0; 548 } 549 if (channelCount < 1 || channelCount > 2) { 550 LOGW("getInputBufferSize bad channel count: %d", channelCount); 551 return 0; 552 } 553 554 if (sampleRate != getInputSampleRate(sampleRate)) { 555 LOGW("getInputBufferSize bad sample rate: %d", sampleRate); 556 return 0; 557 } 558 559 return AudioStreamInALSA::getBufferSize(sampleRate, channelCount); 560 } 561 562 status_t AudioHardware::setVoiceVolume(float volume) 563 { 564 AutoMutex lock(mLock); 565 566 setVoiceVolume_l(volume); 567 568 return NO_ERROR; 569 } 570 571 void AudioHardware::setVoiceVolume_l(float volume) 572 { 573 LOGD("### setVoiceVolume_l"); 574 575 mVoiceVol = volume; 576 577 if ( (AudioSystem::MODE_IN_CALL == mMode) && (mSecRilLibHandle) && 578 (connectRILDIfRequired() == OK) ) { 579 580 uint32_t device = AudioSystem::DEVICE_OUT_EARPIECE; 581 if (mOutput != 0) { 582 device = mOutput->device(); 583 } 584 int int_volume = (int)(volume * 5); 585 SoundType type; 586 587 LOGD("### route(%d) call volume(%f)", device, volume); 588 switch (device) { 589 case AudioSystem::DEVICE_OUT_EARPIECE: 590 LOGD("### earpiece call volume"); 591 type = SOUND_TYPE_VOICE; 592 break; 593 594 case AudioSystem::DEVICE_OUT_SPEAKER: 595 LOGD("### speaker call volume"); 596 type = SOUND_TYPE_SPEAKER; 597 break; 598 599 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO: 600 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET: 601 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT: 602 LOGD("### bluetooth call volume"); 603 type = SOUND_TYPE_BTVOICE; 604 break; 605 606 case AudioSystem::DEVICE_OUT_WIRED_HEADSET: 607 case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE: // Use receive path with 3 pole headset. 608 LOGD("### headset call volume"); 609 type = SOUND_TYPE_HEADSET; 610 break; 611 612 default: 613 LOGW("### Call volume setting error!!!0x%08x \n", device); 614 type = SOUND_TYPE_VOICE; 615 break; 616 } 617 setCallVolume(mRilClient, type, int_volume); 618 } 619 620 } 621 622 status_t AudioHardware::setMasterVolume(float volume) 623 { 624 LOGV("Set master volume to %f.\n", volume); 625 // We return an error code here to let the audioflinger do in-software 626 // volume on top of the maximum volume that we set through the SND API. 627 // return error - software mixer will handle it 628 return -1; 629 } 630 631 static const int kDumpLockRetries = 50; 632 static const int kDumpLockSleep = 20000; 633 634 static bool tryLock(Mutex& mutex) 635 { 636 bool locked = false; 637 for (int i = 0; i < kDumpLockRetries; ++i) { 638 if (mutex.tryLock() == NO_ERROR) { 639 locked = true; 640 break; 641 } 642 usleep(kDumpLockSleep); 643 } 644 return locked; 645 } 646 647 status_t AudioHardware::dump(int fd, const Vector<String16>& args) 648 { 649 const size_t SIZE = 256; 650 char buffer[SIZE]; 651 String8 result; 652 653 bool locked = tryLock(mLock); 654 if (!locked) { 655 snprintf(buffer, SIZE, "\n\tAudioHardware maybe deadlocked\n"); 656 } else { 657 mLock.unlock(); 658 } 659 660 snprintf(buffer, SIZE, "\tInit %s\n", (mInit) ? "OK" : "Failed"); 661 result.append(buffer); 662 snprintf(buffer, SIZE, "\tMic Mute %s\n", (mMicMute) ? "ON" : "OFF"); 663 result.append(buffer); 664 snprintf(buffer, SIZE, "\tmPcm: %p\n", mPcm); 665 result.append(buffer); 666 snprintf(buffer, SIZE, "\tmPcmOpenCnt: %d\n", mPcmOpenCnt); 667 result.append(buffer); 668 snprintf(buffer, SIZE, "\tmMixer: %p\n", mMixer); 669 result.append(buffer); 670 snprintf(buffer, SIZE, "\tmMixerOpenCnt: %d\n", mMixerOpenCnt); 671 result.append(buffer); 672 snprintf(buffer, SIZE, "\tIn Call Audio Mode %s\n", 673 (mInCallAudioMode) ? "ON" : "OFF"); 674 result.append(buffer); 675 snprintf(buffer, SIZE, "\tInput source %d\n", mInputSource); 676 result.append(buffer); 677 snprintf(buffer, SIZE, "\tmSecRilLibHandle: %p\n", mSecRilLibHandle); 678 result.append(buffer); 679 snprintf(buffer, SIZE, "\tmRilClient: %p\n", mRilClient); 680 result.append(buffer); 681 snprintf(buffer, SIZE, "\tCP %s\n", 682 (mActivatedCP) ? "Activated" : "Deactivated"); 683 result.append(buffer); 684 snprintf(buffer, SIZE, "\tmDriverOp: %d\n", mDriverOp); 685 result.append(buffer); 686 687 snprintf(buffer, SIZE, "\n\tmOutput %p dump:\n", mOutput.get()); 688 result.append(buffer); 689 write(fd, result.string(), result.size()); 690 if (mOutput != 0) { 691 mOutput->dump(fd, args); 692 } 693 694 snprintf(buffer, SIZE, "\n\t%d inputs opened:\n", mInputs.size()); 695 write(fd, buffer, strlen(buffer)); 696 for (size_t i = 0; i < mInputs.size(); i++) { 697 snprintf(buffer, SIZE, "\t- input %d dump:\n", i); 698 write(fd, buffer, strlen(buffer)); 699 mInputs[i]->dump(fd, args); 700 } 701 702 return NO_ERROR; 703 } 704 705 status_t AudioHardware::setIncallPath_l(uint32_t device) 706 { 707 LOGV("setIncallPath_l: device %x", device); 708 709 // Setup sound path for CP clocking 710 if ((mSecRilLibHandle) && 711 (connectRILDIfRequired() == OK)) { 712 713 if (mMode == AudioSystem::MODE_IN_CALL) { 714 LOGD("### incall mode route (%d)", device); 715 AudioPath path; 716 switch(device){ 717 case AudioSystem::DEVICE_OUT_EARPIECE: 718 LOGD("### incall mode earpiece route"); 719 path = SOUND_AUDIO_PATH_HANDSET; 720 break; 721 722 case AudioSystem::DEVICE_OUT_SPEAKER: 723 LOGD("### incall mode speaker route"); 724 path = SOUND_AUDIO_PATH_SPEAKER; 725 break; 726 727 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO: 728 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET: 729 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT: 730 LOGD("### incall mode bluetooth route %s NR", mBluetoothNrec ? "" : "NO"); 731 if (mBluetoothNrec) { 732 path = SOUND_AUDIO_PATH_BLUETOOTH; 733 } else { 734 path = SOUND_AUDIO_PATH_BLUETOOTH_NO_NR; 735 } 736 break; 737 738 case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE : 739 LOGD("### incall mode headphone route"); 740 path = SOUND_AUDIO_PATH_HEADPHONE; 741 break; 742 case AudioSystem::DEVICE_OUT_WIRED_HEADSET : 743 LOGD("### incall mode headset route"); 744 path = SOUND_AUDIO_PATH_HEADSET; 745 break; 746 default: 747 LOGW("### incall mode Error!! route = [%d]", device); 748 path = SOUND_AUDIO_PATH_HANDSET; 749 break; 750 } 751 752 setCallAudioPath(mRilClient, path); 753 754 if (mMixer != NULL) { 755 TRACE_DRIVER_IN(DRV_MIXER_GET) 756 struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Voice Call Path"); 757 TRACE_DRIVER_OUT 758 LOGE_IF(ctl == NULL, "setIncallPath_l() could not get mixer ctl"); 759 if (ctl != NULL) { 760 LOGV("setIncallPath_l() Voice Call Path, (%x)", device); 761 TRACE_DRIVER_IN(DRV_MIXER_SEL) 762 mixer_ctl_set_enum_by_string(ctl, getVoiceRouteFromDevice(device)); 763 TRACE_DRIVER_OUT 764 } 765 } 766 } 767 } 768 return NO_ERROR; 769 } 770 771 struct pcm *AudioHardware::openPcmOut_l() 772 { 773 LOGD("openPcmOut_l() mPcmOpenCnt: %d", mPcmOpenCnt); 774 if (mPcmOpenCnt++ == 0) { 775 if (mPcm != NULL) { 776 LOGE("openPcmOut_l() mPcmOpenCnt == 0 and mPcm == %p\n", mPcm); 777 mPcmOpenCnt--; 778 return NULL; 779 } 780 unsigned flags = PCM_OUT; 781 782 struct pcm_config config = { 783 channels : 2, 784 rate : AUDIO_HW_OUT_SAMPLERATE, 785 period_size : AUDIO_HW_OUT_PERIOD_SZ, 786 period_count : AUDIO_HW_OUT_PERIOD_CNT, 787 format : PCM_FORMAT_S16_LE, 788 start_threshold : 0, 789 stop_threshold : 0, 790 silence_threshold : 0, 791 }; 792 793 TRACE_DRIVER_IN(DRV_PCM_OPEN) 794 mPcm = pcm_open(0, 0, flags, &config); 795 TRACE_DRIVER_OUT 796 if (!pcm_is_ready(mPcm)) { 797 LOGE("openPcmOut_l() cannot open pcm_out driver: %s\n", pcm_get_error(mPcm)); 798 TRACE_DRIVER_IN(DRV_PCM_CLOSE) 799 pcm_close(mPcm); 800 TRACE_DRIVER_OUT 801 mPcmOpenCnt--; 802 mPcm = NULL; 803 } 804 } 805 return mPcm; 806 } 807 808 void AudioHardware::closePcmOut_l() 809 { 810 LOGD("closePcmOut_l() mPcmOpenCnt: %d", mPcmOpenCnt); 811 if (mPcmOpenCnt == 0) { 812 LOGE("closePcmOut_l() mPcmOpenCnt == 0"); 813 return; 814 } 815 816 if (--mPcmOpenCnt == 0) { 817 TRACE_DRIVER_IN(DRV_PCM_CLOSE) 818 pcm_close(mPcm); 819 TRACE_DRIVER_OUT 820 mPcm = NULL; 821 } 822 } 823 824 struct mixer *AudioHardware::openMixer_l() 825 { 826 LOGV("openMixer_l() mMixerOpenCnt: %d", mMixerOpenCnt); 827 if (mMixerOpenCnt++ == 0) { 828 if (mMixer != NULL) { 829 LOGE("openMixer_l() mMixerOpenCnt == 0 and mMixer == %p\n", mMixer); 830 mMixerOpenCnt--; 831 return NULL; 832 } 833 TRACE_DRIVER_IN(DRV_MIXER_OPEN) 834 mMixer = mixer_open(0); 835 TRACE_DRIVER_OUT 836 if (mMixer == NULL) { 837 LOGE("openMixer_l() cannot open mixer"); 838 mMixerOpenCnt--; 839 return NULL; 840 } 841 } 842 return mMixer; 843 } 844 845 void AudioHardware::closeMixer_l() 846 { 847 LOGV("closeMixer_l() mMixerOpenCnt: %d", mMixerOpenCnt); 848 if (mMixerOpenCnt == 0) { 849 LOGE("closeMixer_l() mMixerOpenCnt == 0"); 850 return; 851 } 852 853 if (--mMixerOpenCnt == 0) { 854 TRACE_DRIVER_IN(DRV_MIXER_CLOSE) 855 mixer_close(mMixer); 856 TRACE_DRIVER_OUT 857 mMixer = NULL; 858 } 859 } 860 861 const char *AudioHardware::getOutputRouteFromDevice(uint32_t device) 862 { 863 switch (device) { 864 case AudioSystem::DEVICE_OUT_EARPIECE: 865 return "RCV"; 866 case AudioSystem::DEVICE_OUT_SPEAKER: 867 if (mMode == AudioSystem::MODE_RINGTONE) return "RING_SPK"; 868 else return "SPK"; 869 case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE: 870 if (mMode == AudioSystem::MODE_RINGTONE) return "RING_NO_MIC"; 871 else return "HP_NO_MIC"; 872 case AudioSystem::DEVICE_OUT_WIRED_HEADSET: 873 if (mMode == AudioSystem::MODE_RINGTONE) return "RING_HP"; 874 else return "HP"; 875 case (AudioSystem::DEVICE_OUT_SPEAKER|AudioSystem::DEVICE_OUT_WIRED_HEADPHONE): 876 case (AudioSystem::DEVICE_OUT_SPEAKER|AudioSystem::DEVICE_OUT_WIRED_HEADSET): 877 if (mMode == AudioSystem::MODE_RINGTONE) return "RING_SPK_HP"; 878 else return "SPK_HP"; 879 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO: 880 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET: 881 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT: 882 return "BT"; 883 default: 884 return "OFF"; 885 } 886 } 887 888 const char *AudioHardware::getVoiceRouteFromDevice(uint32_t device) 889 { 890 switch (device) { 891 case AudioSystem::DEVICE_OUT_EARPIECE: 892 return "RCV"; 893 case AudioSystem::DEVICE_OUT_SPEAKER: 894 return "SPK"; 895 case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE: 896 case AudioSystem::DEVICE_OUT_WIRED_HEADSET: 897 switch (mTTYMode) { 898 case TTY_MODE_VCO: 899 return "TTY_VCO"; 900 case TTY_MODE_HCO: 901 return "TTY_HCO"; 902 case TTY_MODE_FULL: 903 return "TTY_FULL"; 904 case TTY_MODE_OFF: 905 default: 906 if (device == AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) { 907 return "HP_NO_MIC"; 908 } else { 909 return "HP"; 910 } 911 } 912 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO: 913 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET: 914 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT: 915 return "BT"; 916 default: 917 return "OFF"; 918 } 919 } 920 921 const char *AudioHardware::getInputRouteFromDevice(uint32_t device) 922 { 923 if (mMicMute) { 924 return "MIC OFF"; 925 } 926 927 switch (device) { 928 case AudioSystem::DEVICE_IN_BUILTIN_MIC: 929 return "Main Mic"; 930 case AudioSystem::DEVICE_IN_WIRED_HEADSET: 931 return "Hands Free Mic"; 932 case AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET: 933 return "BT Sco Mic"; 934 default: 935 return "MIC OFF"; 936 } 937 } 938 939 uint32_t AudioHardware::getInputSampleRate(uint32_t sampleRate) 940 { 941 size_t i; 942 uint32_t prevDelta; 943 uint32_t delta; 944 size_t size = sizeof(inputConfigTable)/sizeof(uint32_t)/INPUT_CONFIG_CNT; 945 946 for (i = 0, prevDelta = 0xFFFFFFFF; i < size; i++, prevDelta = delta) { 947 delta = abs(sampleRate - inputConfigTable[i][INPUT_CONFIG_SAMPLE_RATE]); 948 if (delta > prevDelta) break; 949 } 950 // i is always > 0 here 951 return inputConfigTable[i-1][INPUT_CONFIG_SAMPLE_RATE]; 952 } 953 954 // getActiveInput_l() must be called with mLock held 955 sp <AudioHardware::AudioStreamInALSA> AudioHardware::getActiveInput_l() 956 { 957 sp< AudioHardware::AudioStreamInALSA> spIn; 958 959 for (size_t i = 0; i < mInputs.size(); i++) { 960 // return first input found not being in standby mode 961 // as only one input can be in this state 962 if (!mInputs[i]->checkStandby()) { 963 spIn = mInputs[i]; 964 break; 965 } 966 } 967 968 return spIn; 969 } 970 971 status_t AudioHardware::setInputSource_l(audio_source source) 972 { 973 LOGV("setInputSource_l(%d)", source); 974 if (source != mInputSource) { 975 if ((source == AUDIO_SOURCE_DEFAULT) || (mMode != AudioSystem::MODE_IN_CALL)) { 976 if (mMixer) { 977 TRACE_DRIVER_IN(DRV_MIXER_GET) 978 struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Input Source"); 979 TRACE_DRIVER_OUT 980 if (ctl == NULL) { 981 return NO_INIT; 982 } 983 const char* sourceName; 984 switch (source) { 985 case AUDIO_SOURCE_DEFAULT: // intended fall-through 986 case AUDIO_SOURCE_MIC: // intended fall-through 987 case AUDIO_SOURCE_VOICE_COMMUNICATION: 988 sourceName = inputPathNameDefault; 989 break; 990 case AUDIO_SOURCE_CAMCORDER: 991 sourceName = inputPathNameCamcorder; 992 break; 993 case AUDIO_SOURCE_VOICE_RECOGNITION: 994 sourceName = inputPathNameVoiceRecognition; 995 break; 996 case AUDIO_SOURCE_VOICE_UPLINK: // intended fall-through 997 case AUDIO_SOURCE_VOICE_DOWNLINK: // intended fall-through 998 case AUDIO_SOURCE_VOICE_CALL: // intended fall-through 999 default: 1000 return NO_INIT; 1001 } 1002 LOGV("mixer_ctl_set_enum_by_string, Input Source, (%s)", sourceName); 1003 TRACE_DRIVER_IN(DRV_MIXER_SEL) 1004 mixer_ctl_set_enum_by_string(ctl, sourceName); 1005 TRACE_DRIVER_OUT 1006 } 1007 } 1008 mInputSource = source; 1009 } 1010 1011 return NO_ERROR; 1012 } 1013 1014 struct echo_reference_itfe *AudioHardware::getEchoReference(audio_format_t format, 1015 uint32_t channelCount, 1016 uint32_t samplingRate) 1017 { 1018 LOGV("AudioHardware::getEchoReference %p", mEchoReference); 1019 releaseEchoReference(mEchoReference); 1020 if (mOutput != NULL) { 1021 uint32_t wrChannelCount = popcount(mOutput->channels()); 1022 uint32_t wrSampleRate = mOutput->sampleRate(); 1023 1024 int status = create_echo_reference(AUDIO_FORMAT_PCM_16_BIT, 1025 channelCount, 1026 samplingRate, 1027 AUDIO_FORMAT_PCM_16_BIT, 1028 wrChannelCount, 1029 wrSampleRate, 1030 &mEchoReference); 1031 if (status == 0) { 1032 mOutput->addEchoReference(mEchoReference); 1033 } 1034 } 1035 return mEchoReference; 1036 } 1037 1038 void AudioHardware::releaseEchoReference(struct echo_reference_itfe *reference) 1039 { 1040 LOGV("AudioHardware::releaseEchoReference %p", mEchoReference); 1041 if (mEchoReference != NULL && reference == mEchoReference) { 1042 if (mOutput != NULL) { 1043 mOutput->removeEchoReference(reference); 1044 } 1045 release_echo_reference(mEchoReference); 1046 mEchoReference = NULL; 1047 } 1048 } 1049 1050 1051 //------------------------------------------------------------------------------ 1052 // AudioStreamOutALSA 1053 //------------------------------------------------------------------------------ 1054 1055 AudioHardware::AudioStreamOutALSA::AudioStreamOutALSA() : 1056 mHardware(0), mPcm(0), mMixer(0), mRouteCtl(0), 1057 mStandby(true), mDevices(0), mChannels(AUDIO_HW_OUT_CHANNELS), 1058 mSampleRate(AUDIO_HW_OUT_SAMPLERATE), mBufferSize(AUDIO_HW_OUT_PERIOD_BYTES), 1059 mDriverOp(DRV_NONE), mStandbyCnt(0), mSleepReq(false), mEchoReference(NULL) 1060 { 1061 } 1062 1063 status_t AudioHardware::AudioStreamOutALSA::set( 1064 AudioHardware* hw, uint32_t devices, int *pFormat, 1065 uint32_t *pChannels, uint32_t *pRate) 1066 { 1067 int lFormat = pFormat ? *pFormat : 0; 1068 uint32_t lChannels = pChannels ? *pChannels : 0; 1069 uint32_t lRate = pRate ? *pRate : 0; 1070 1071 mHardware = hw; 1072 mDevices = devices; 1073 1074 // fix up defaults 1075 if (lFormat == 0) lFormat = format(); 1076 if (lChannels == 0) lChannels = channels(); 1077 if (lRate == 0) lRate = sampleRate(); 1078 1079 // check values 1080 if ((lFormat != format()) || 1081 (lChannels != channels()) || 1082 (lRate != sampleRate())) { 1083 if (pFormat) *pFormat = format(); 1084 if (pChannels) *pChannels = channels(); 1085 if (pRate) *pRate = sampleRate(); 1086 return BAD_VALUE; 1087 } 1088 1089 if (pFormat) *pFormat = lFormat; 1090 if (pChannels) *pChannels = lChannels; 1091 if (pRate) *pRate = lRate; 1092 1093 mChannels = lChannels; 1094 mSampleRate = lRate; 1095 mBufferSize = AUDIO_HW_OUT_PERIOD_BYTES; 1096 1097 return NO_ERROR; 1098 } 1099 1100 AudioHardware::AudioStreamOutALSA::~AudioStreamOutALSA() 1101 { 1102 standby(); 1103 } 1104 1105 int AudioHardware::AudioStreamOutALSA::getPlaybackDelay(size_t frames, 1106 struct echo_reference_buffer *buffer) 1107 { 1108 size_t kernelFr; 1109 1110 int rc = pcm_get_htimestamp(mPcm, &kernelFr, &buffer->time_stamp); 1111 if (rc < 0) { 1112 buffer->time_stamp.tv_sec = 0; 1113 buffer->time_stamp.tv_nsec = 0; 1114 buffer->delay_ns = 0; 1115 LOGV("getPlaybackDelay(): pcm_get_htimestamp error, setting playbackTimestamp to 0"); 1116 return rc; 1117 } 1118 1119 kernelFr = pcm_get_buffer_size(mPcm) - kernelFr; 1120 1121 // adjust render time stamp with delay added by current driver buffer. 1122 // Add the duration of current frame as we want the render time of the last 1123 // sample being written. 1124 long delayNs = (long)(((int64_t)(kernelFr + frames)* 1000000000) /AUDIO_HW_OUT_SAMPLERATE); 1125 1126 LOGV("AudioStreamOutALSA::getPlaybackDelay delayNs: [%ld], "\ 1127 "kernelFr:[%d], frames:[%d], buffSize:[%d], time_stamp:[%ld].[%ld]", 1128 delayNs, (int)kernelFr, (int)frames, pcm_get_buffer_size(mPcm), 1129 (long)buffer->time_stamp.tv_sec, buffer->time_stamp.tv_nsec); 1130 1131 buffer->delay_ns = delayNs; 1132 1133 return 0; 1134 } 1135 1136 ssize_t AudioHardware::AudioStreamOutALSA::write(const void* buffer, size_t bytes) 1137 { 1138 LOGV("-----AudioStreamInALSA::write(%p, %d) START", buffer, (int)bytes); 1139 status_t status = NO_INIT; 1140 const uint8_t* p = static_cast<const uint8_t*>(buffer); 1141 int ret; 1142 1143 if (mHardware == NULL) return NO_INIT; 1144 1145 if (mSleepReq) { 1146 // 10ms are always shorter than the time to reconfigure the audio path 1147 // which is the only condition when mSleepReq would be true. 1148 usleep(10000); 1149 } 1150 1151 { // scope for the lock 1152 1153 AutoMutex lock(mLock); 1154 1155 if (mStandby) { 1156 AutoMutex hwLock(mHardware->lock()); 1157 1158 LOGD("AudioHardware pcm playback is exiting standby."); 1159 sp<AudioStreamInALSA> spIn = mHardware->getActiveInput_l(); 1160 while (spIn != 0) { 1161 int cnt = spIn->prepareLock(); 1162 mHardware->lock().unlock(); 1163 // Mutex acquisition order is always out -> in -> hw 1164 spIn->lock(); 1165 mHardware->lock().lock(); 1166 // make sure that another thread did not change input state 1167 // while the mutex is released 1168 if ((spIn == mHardware->getActiveInput_l()) && 1169 (cnt == spIn->standbyCnt())) { 1170 LOGV("AudioStreamOutALSA::write() force input standby"); 1171 spIn->close_l(); 1172 break; 1173 } 1174 spIn->unlock(); 1175 spIn = mHardware->getActiveInput_l(); 1176 } 1177 // spIn is not 0 here only if the input was active and has been 1178 // closed above 1179 1180 // open output before input 1181 open_l(); 1182 1183 if (spIn != 0) { 1184 if (spIn->open_l() != NO_ERROR) { 1185 spIn->doStandby_l(); 1186 } 1187 spIn->unlock(); 1188 } 1189 if (mPcm == NULL) { 1190 goto Error; 1191 } 1192 mStandby = false; 1193 } 1194 1195 if (mEchoReference != NULL) { 1196 struct echo_reference_buffer b; 1197 b.raw = (void *)buffer; 1198 b.frame_count = bytes / frameSize(); 1199 1200 getPlaybackDelay(bytes / frameSize(), &b); 1201 mEchoReference->write(mEchoReference, &b); 1202 } 1203 1204 TRACE_DRIVER_IN(DRV_PCM_WRITE) 1205 ret = pcm_write(mPcm,(void*) p, bytes); 1206 TRACE_DRIVER_OUT 1207 1208 if (ret == 0) { 1209 LOGV("-----AudioStreamInALSA::write(%p, %d) END", buffer, (int)bytes); 1210 return bytes; 1211 } 1212 LOGW("write error: %d", errno); 1213 status = -errno; 1214 } 1215 Error: 1216 standby(); 1217 1218 // Simulate audio output timing in case of error 1219 usleep((((bytes * 1000) / frameSize()) * 1000) / sampleRate()); 1220 LOGE("AudioStreamOutALSA::write END WITH ERROR !!!!!!!!!(%p, %u)", buffer, bytes); 1221 return status; 1222 } 1223 1224 status_t AudioHardware::AudioStreamOutALSA::standby() 1225 { 1226 if (mHardware == NULL) return NO_INIT; 1227 1228 mSleepReq = true; 1229 { 1230 AutoMutex lock(mLock); 1231 mSleepReq = false; 1232 1233 { // scope for the AudioHardware lock 1234 AutoMutex hwLock(mHardware->lock()); 1235 1236 doStandby_l(); 1237 } 1238 } 1239 1240 return NO_ERROR; 1241 } 1242 1243 void AudioHardware::AudioStreamOutALSA::doStandby_l() 1244 { 1245 mStandbyCnt++; 1246 1247 if (!mStandby) { 1248 LOGD("AudioHardware pcm playback is going to standby."); 1249 // stop echo reference capture 1250 if (mEchoReference != NULL) { 1251 mEchoReference->write(mEchoReference, NULL); 1252 } 1253 mStandby = true; 1254 } 1255 1256 close_l(); 1257 } 1258 1259 void AudioHardware::AudioStreamOutALSA::close_l() 1260 { 1261 if (mMixer) { 1262 mHardware->closeMixer_l(); 1263 mMixer = NULL; 1264 mRouteCtl = NULL; 1265 } 1266 if (mPcm) { 1267 mHardware->closePcmOut_l(); 1268 mPcm = NULL; 1269 } 1270 } 1271 1272 status_t AudioHardware::AudioStreamOutALSA::open_l() 1273 { 1274 LOGV("open pcm_out driver"); 1275 mPcm = mHardware->openPcmOut_l(); 1276 if (mPcm == NULL) { 1277 return NO_INIT; 1278 } 1279 1280 mMixer = mHardware->openMixer_l(); 1281 if (mMixer) { 1282 LOGV("open playback normal"); 1283 TRACE_DRIVER_IN(DRV_MIXER_GET) 1284 mRouteCtl = mixer_get_ctl_by_name(mMixer, "Playback Path"); 1285 TRACE_DRIVER_OUT 1286 } 1287 if (mHardware->mode() != AudioSystem::MODE_IN_CALL) { 1288 const char *route = mHardware->getOutputRouteFromDevice(mDevices); 1289 LOGV("write() wakeup setting route %s", route); 1290 if (mRouteCtl) { 1291 TRACE_DRIVER_IN(DRV_MIXER_SEL) 1292 mixer_ctl_set_enum_by_string(mRouteCtl, route); 1293 TRACE_DRIVER_OUT 1294 } 1295 } 1296 return NO_ERROR; 1297 } 1298 1299 status_t AudioHardware::AudioStreamOutALSA::dump(int fd, const Vector<String16>& args) 1300 { 1301 const size_t SIZE = 256; 1302 char buffer[SIZE]; 1303 String8 result; 1304 1305 bool locked = tryLock(mLock); 1306 if (!locked) { 1307 snprintf(buffer, SIZE, "\n\t\tAudioStreamOutALSA maybe deadlocked\n"); 1308 } else { 1309 mLock.unlock(); 1310 } 1311 1312 snprintf(buffer, SIZE, "\t\tmHardware: %p\n", mHardware); 1313 result.append(buffer); 1314 snprintf(buffer, SIZE, "\t\tmPcm: %p\n", mPcm); 1315 result.append(buffer); 1316 snprintf(buffer, SIZE, "\t\tmMixer: %p\n", mMixer); 1317 result.append(buffer); 1318 snprintf(buffer, SIZE, "\t\tmRouteCtl: %p\n", mRouteCtl); 1319 result.append(buffer); 1320 snprintf(buffer, SIZE, "\t\tStandby %s\n", (mStandby) ? "ON" : "OFF"); 1321 result.append(buffer); 1322 snprintf(buffer, SIZE, "\t\tmDevices: 0x%08x\n", mDevices); 1323 result.append(buffer); 1324 snprintf(buffer, SIZE, "\t\tmChannels: 0x%08x\n", mChannels); 1325 result.append(buffer); 1326 snprintf(buffer, SIZE, "\t\tmSampleRate: %d\n", mSampleRate); 1327 result.append(buffer); 1328 snprintf(buffer, SIZE, "\t\tmBufferSize: %d\n", mBufferSize); 1329 result.append(buffer); 1330 snprintf(buffer, SIZE, "\t\tmDriverOp: %d\n", mDriverOp); 1331 result.append(buffer); 1332 1333 ::write(fd, result.string(), result.size()); 1334 1335 return NO_ERROR; 1336 } 1337 1338 bool AudioHardware::AudioStreamOutALSA::checkStandby() 1339 { 1340 return mStandby; 1341 } 1342 1343 status_t AudioHardware::AudioStreamOutALSA::setParameters(const String8& keyValuePairs) 1344 { 1345 AudioParameter param = AudioParameter(keyValuePairs); 1346 status_t status = NO_ERROR; 1347 int device; 1348 LOGD("AudioStreamOutALSA::setParameters() %s", keyValuePairs.string()); 1349 1350 if (mHardware == NULL) return NO_INIT; 1351 1352 mSleepReq = true; 1353 { 1354 AutoMutex lock(mLock); 1355 mSleepReq = false; 1356 if (param.getInt(String8(AudioParameter::keyRouting), device) == NO_ERROR) 1357 { 1358 if (device != 0) { 1359 AutoMutex hwLock(mHardware->lock()); 1360 1361 if (mDevices != (uint32_t)device) { 1362 mDevices = (uint32_t)device; 1363 if (mHardware->mode() != AudioSystem::MODE_IN_CALL) { 1364 doStandby_l(); 1365 } 1366 } 1367 if (mHardware->mode() == AudioSystem::MODE_IN_CALL) { 1368 mHardware->setIncallPath_l(device); 1369 } 1370 } 1371 param.remove(String8(AudioParameter::keyRouting)); 1372 } 1373 } 1374 1375 if (param.size()) { 1376 status = BAD_VALUE; 1377 } 1378 1379 1380 return status; 1381 1382 } 1383 1384 String8 AudioHardware::AudioStreamOutALSA::getParameters(const String8& keys) 1385 { 1386 AudioParameter param = AudioParameter(keys); 1387 String8 value; 1388 String8 key = String8(AudioParameter::keyRouting); 1389 1390 if (param.get(key, value) == NO_ERROR) { 1391 param.addInt(key, (int)mDevices); 1392 } 1393 1394 LOGV("AudioStreamOutALSA::getParameters() %s", param.toString().string()); 1395 return param.toString(); 1396 } 1397 1398 status_t AudioHardware::AudioStreamOutALSA::getRenderPosition(uint32_t *dspFrames) 1399 { 1400 //TODO 1401 return INVALID_OPERATION; 1402 } 1403 1404 int AudioHardware::AudioStreamOutALSA::prepareLock() 1405 { 1406 // request sleep next time write() is called so that caller can acquire 1407 // mLock 1408 mSleepReq = true; 1409 return mStandbyCnt; 1410 } 1411 1412 void AudioHardware::AudioStreamOutALSA::lock() 1413 { 1414 mLock.lock(); 1415 mSleepReq = false; 1416 } 1417 1418 void AudioHardware::AudioStreamOutALSA::unlock() { 1419 mLock.unlock(); 1420 } 1421 1422 void AudioHardware::AudioStreamOutALSA::addEchoReference(struct echo_reference_itfe *reference) 1423 { 1424 LOGV("AudioStreamOutALSA::addEchoReference %p", mEchoReference); 1425 if (mEchoReference == NULL) { 1426 mEchoReference = reference; 1427 } 1428 } 1429 1430 void AudioHardware::AudioStreamOutALSA::removeEchoReference(struct echo_reference_itfe *reference) 1431 { 1432 LOGV("AudioStreamOutALSA::removeEchoReference %p", mEchoReference); 1433 if (mEchoReference == reference) { 1434 mEchoReference->write(mEchoReference, NULL); 1435 mEchoReference = NULL; 1436 } 1437 } 1438 1439 1440 //------------------------------------------------------------------------------ 1441 // AudioStreamInALSA 1442 //------------------------------------------------------------------------------ 1443 1444 AudioHardware::AudioStreamInALSA::AudioStreamInALSA() : 1445 mHardware(0), mPcm(0), mMixer(0), mRouteCtl(0), 1446 mStandby(true), mDevices(0), mChannels(AUDIO_HW_IN_CHANNELS), mChannelCount(1), 1447 mSampleRate(AUDIO_HW_IN_SAMPLERATE), mBufferSize(AUDIO_HW_IN_PERIOD_BYTES), 1448 mDownSampler(NULL), mReadStatus(NO_ERROR), mInputBuf(NULL), 1449 mDriverOp(DRV_NONE), mStandbyCnt(0), mSleepReq(false), 1450 mProcBuf(NULL), mProcBufSize(0), mRefBuf(NULL), mRefBufSize(0), 1451 mEchoReference(NULL), mNeedEchoReference(false) 1452 { 1453 } 1454 1455 status_t AudioHardware::AudioStreamInALSA::set( 1456 AudioHardware* hw, uint32_t devices, int *pFormat, 1457 uint32_t *pChannels, uint32_t *pRate, AudioSystem::audio_in_acoustics acoustics) 1458 { 1459 if (pFormat == 0 || *pFormat != AUDIO_HW_IN_FORMAT) { 1460 *pFormat = AUDIO_HW_IN_FORMAT; 1461 return BAD_VALUE; 1462 } 1463 if (pRate == 0) { 1464 return BAD_VALUE; 1465 } 1466 uint32_t rate = AudioHardware::getInputSampleRate(*pRate); 1467 if (rate != *pRate) { 1468 *pRate = rate; 1469 return BAD_VALUE; 1470 } 1471 1472 if (pChannels == 0 || (*pChannels != AudioSystem::CHANNEL_IN_MONO && 1473 *pChannels != AudioSystem::CHANNEL_IN_STEREO)) { 1474 *pChannels = AUDIO_HW_IN_CHANNELS; 1475 return BAD_VALUE; 1476 } 1477 1478 mHardware = hw; 1479 1480 LOGV("AudioStreamInALSA::set(%d, %d, %u)", *pFormat, *pChannels, *pRate); 1481 1482 mBufferSize = getBufferSize(*pRate, AudioSystem::popCount(*pChannels)); 1483 mDevices = devices; 1484 mChannels = *pChannels; 1485 mChannelCount = AudioSystem::popCount(mChannels); 1486 mSampleRate = rate; 1487 if (mSampleRate != AUDIO_HW_OUT_SAMPLERATE) { 1488 mBufferProvider.mProvider.get_next_buffer = getNextBufferStatic; 1489 mBufferProvider.mProvider.release_buffer = releaseBufferStatic; 1490 mBufferProvider.mInputStream = this; 1491 int status = create_resampler(AUDIO_HW_OUT_SAMPLERATE, 1492 mSampleRate, 1493 mChannelCount, 1494 RESAMPLER_QUALITY_VOIP, 1495 &mBufferProvider.mProvider, 1496 &mDownSampler); 1497 if (status != 0) { 1498 LOGW("AudioStreamInALSA::set() downsampler init failed: %d", status); 1499 mDownSampler = NULL; 1500 return status; 1501 } 1502 } 1503 mInputBuf = new int16_t[AUDIO_HW_IN_PERIOD_SZ * mChannelCount]; 1504 1505 return NO_ERROR; 1506 } 1507 1508 AudioHardware::AudioStreamInALSA::~AudioStreamInALSA() 1509 { 1510 standby(); 1511 1512 if (mDownSampler != NULL) { 1513 release_resampler(mDownSampler); 1514 } 1515 delete[] mInputBuf; 1516 delete[] mProcBuf; 1517 } 1518 1519 // readFrames() reads frames from kernel driver, down samples to capture rate if necessary 1520 // and output the number of frames requested to the buffer specified 1521 ssize_t AudioHardware::AudioStreamInALSA::readFrames(void* buffer, ssize_t frames) 1522 { 1523 ssize_t framesWr = 0; 1524 while (framesWr < frames) { 1525 size_t framesRd = frames - framesWr; 1526 if (mDownSampler != NULL) { 1527 mDownSampler->resample_from_provider(mDownSampler, 1528 (int16_t *)((char *)buffer + framesWr * frameSize()), 1529 &framesRd); 1530 } else { 1531 struct resampler_buffer buf = { 1532 { raw : NULL, }, 1533 frame_count : framesRd, 1534 }; 1535 getNextBuffer(&buf); 1536 if (buf.raw != NULL) { 1537 memcpy((char *)buffer + framesWr * frameSize(), 1538 buf.raw, 1539 buf.frame_count * frameSize()); 1540 framesRd = buf.frame_count; 1541 } 1542 releaseBuffer(&buf); 1543 } 1544 // mReadStatus is updated by getNextBuffer() also called by 1545 // mDownSampler->resample_from_provider() 1546 if (mReadStatus != 0) { 1547 return mReadStatus; 1548 } 1549 framesWr += framesRd; 1550 } 1551 return framesWr; 1552 } 1553 1554 // processFrames() reads frames from kernel driver (via readFrames()), calls the active 1555 // audio pre processings and output the number of frames requested to the buffer specified 1556 ssize_t AudioHardware::AudioStreamInALSA::processFrames(void* buffer, ssize_t frames) 1557 { 1558 ssize_t framesWr = 0; 1559 while (framesWr < frames) { 1560 // first reload enough frames at the end of process input buffer 1561 if (mProcFramesIn < (size_t)frames) { 1562 // expand process input buffer if necessary 1563 if (mProcBufSize < (size_t)frames) { 1564 mProcBufSize = (size_t)frames; 1565 mProcBuf = (int16_t *)realloc(mProcBuf, 1566 mProcBufSize * mChannelCount * sizeof(int16_t)); 1567 LOGV("processFrames(): mProcBuf %p size extended to %d frames", 1568 mProcBuf, mProcBufSize); 1569 } 1570 ssize_t framesRd = readFrames(mProcBuf + mProcFramesIn * mChannelCount, 1571 frames - mProcFramesIn); 1572 if (framesRd < 0) { 1573 framesWr = framesRd; 1574 break; 1575 } 1576 mProcFramesIn += framesRd; 1577 } 1578 1579 if (mEchoReference != NULL) { 1580 pushEchoReference(mProcFramesIn); 1581 } 1582 1583 //inBuf.frameCount and outBuf.frameCount indicate respectively the maximum number of frames 1584 //to be consumed and produced by process() 1585 audio_buffer_t inBuf = { 1586 mProcFramesIn, 1587 {mProcBuf} 1588 }; 1589 audio_buffer_t outBuf = { 1590 frames - framesWr, 1591 {(int16_t *)buffer + framesWr * mChannelCount} 1592 }; 1593 1594 for (size_t i = 0; i < mPreprocessors.size(); i++) { 1595 (*mPreprocessors[i])->process(mPreprocessors[i], 1596 &inBuf, 1597 &outBuf); 1598 } 1599 1600 // process() has updated the number of frames consumed and produced in 1601 // inBuf.frameCount and outBuf.frameCount respectively 1602 // move remaining frames to the beginning of mProcBuf 1603 mProcFramesIn -= inBuf.frameCount; 1604 if (mProcFramesIn) { 1605 memcpy(mProcBuf, 1606 mProcBuf + inBuf.frameCount * mChannelCount, 1607 mProcFramesIn * mChannelCount * sizeof(int16_t)); 1608 } 1609 1610 // if not enough frames were passed to process(), read more and retry. 1611 if (outBuf.frameCount == 0) { 1612 continue; 1613 } 1614 framesWr += outBuf.frameCount; 1615 } 1616 return framesWr; 1617 } 1618 1619 int32_t AudioHardware::AudioStreamInALSA::updateEchoReference(size_t frames) 1620 { 1621 struct echo_reference_buffer b; 1622 b.delay_ns = 0; 1623 1624 LOGV("updateEchoReference1 START, frames = [%d], mRefFramesIn = [%d], b.frame_count = [%d]", 1625 frames, mRefFramesIn, frames - mRefFramesIn); 1626 if (mRefFramesIn < frames) { 1627 if (mRefBufSize < frames) { 1628 mRefBufSize = frames; 1629 mRefBuf = (int16_t *)realloc(mRefBuf, 1630 mRefBufSize * mChannelCount * sizeof(int16_t)); 1631 } 1632 1633 b.frame_count = frames - mRefFramesIn; 1634 b.raw = (void *)(mRefBuf + mRefFramesIn * mChannelCount); 1635 1636 getCaptureDelay(frames, &b); 1637 1638 if (mEchoReference->read(mEchoReference, &b) == NO_ERROR) 1639 { 1640 mRefFramesIn += b.frame_count; 1641 LOGV("updateEchoReference2: mRefFramesIn:[%d], mRefBufSize:[%d], "\ 1642 "frames:[%d], b.frame_count:[%d]", mRefFramesIn, mRefBufSize,frames,b.frame_count); 1643 } 1644 1645 }else{ 1646 LOGV("updateEchoReference3: NOT enough frames to read ref buffer"); 1647 } 1648 return b.delay_ns; 1649 } 1650 1651 void AudioHardware::AudioStreamInALSA::pushEchoReference(size_t frames) 1652 { 1653 // read frames from echo reference buffer and update echo delay 1654 // mRefFramesIn is updated with frames available in mRefBuf 1655 int32_t delayUs = (int32_t)(updateEchoReference(frames)/1000); 1656 1657 if (mRefFramesIn < frames) { 1658 frames = mRefFramesIn; 1659 } 1660 1661 audio_buffer_t refBuf = { 1662 frames, 1663 {mRefBuf} 1664 }; 1665 1666 for (size_t i = 0; i < mPreprocessors.size(); i++) { 1667 if ((*mPreprocessors[i])->process_reverse == NULL) { 1668 continue; 1669 } 1670 (*mPreprocessors[i])->process_reverse(mPreprocessors[i], 1671 &refBuf, 1672 NULL); 1673 setPreProcessorEchoDelay(mPreprocessors[i], delayUs); 1674 } 1675 1676 mRefFramesIn -= refBuf.frameCount; 1677 if (mRefFramesIn) { 1678 LOGV("pushEchoReference5: shifting mRefBuf down by = %d frames", mRefFramesIn); 1679 memcpy(mRefBuf, 1680 mRefBuf + refBuf.frameCount * mChannelCount, 1681 mRefFramesIn * mChannelCount * sizeof(int16_t)); 1682 } 1683 } 1684 1685 status_t AudioHardware::AudioStreamInALSA::setPreProcessorEchoDelay(effect_handle_t handle, 1686 int32_t delayUs) 1687 { 1688 uint32_t buf[sizeof(effect_param_t) / sizeof(uint32_t) + 2]; 1689 effect_param_t *param = (effect_param_t *)buf; 1690 1691 param->psize = sizeof(uint32_t); 1692 param->vsize = sizeof(uint32_t); 1693 *(uint32_t *)param->data = AEC_PARAM_ECHO_DELAY; 1694 *((int32_t *)param->data + 1) = delayUs; 1695 1696 LOGV("setPreProcessorEchoDelay: %d us", delayUs); 1697 1698 return setPreprocessorParam(handle, param); 1699 } 1700 1701 status_t AudioHardware::AudioStreamInALSA::setPreprocessorParam(effect_handle_t handle, 1702 effect_param_t *param) 1703 { 1704 uint32_t size = sizeof(int); 1705 uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize; 1706 1707 status_t status = (*handle)->command(handle, 1708 EFFECT_CMD_SET_PARAM, 1709 sizeof (effect_param_t) + psize, 1710 param, 1711 &size, 1712 ¶m->status); 1713 if (status == NO_ERROR) { 1714 status = param->status; 1715 } 1716 return status; 1717 } 1718 1719 void AudioHardware::AudioStreamInALSA::getCaptureDelay(size_t frames, 1720 struct echo_reference_buffer *buffer) 1721 { 1722 1723 // read frames available in kernel driver buffer 1724 size_t kernelFr; 1725 struct timespec tstamp; 1726 1727 if (pcm_get_htimestamp(mPcm, &kernelFr, &tstamp) < 0) { 1728 buffer->time_stamp.tv_sec = 0; 1729 buffer->time_stamp.tv_nsec = 0; 1730 buffer->delay_ns = 0; 1731 LOGW("read getCaptureDelay(): pcm_htimestamp error"); 1732 return; 1733 } 1734 1735 // read frames available in audio HAL input buffer 1736 // add number of frames being read as we want the capture time of first sample in current 1737 // buffer 1738 long bufDelay = (long)(((int64_t)(mInputFramesIn + mProcFramesIn) * 1000000000) 1739 / AUDIO_HW_IN_SAMPLERATE); 1740 // add delay introduced by resampler 1741 long rsmpDelay = 0; 1742 if (mDownSampler) { 1743 rsmpDelay = mDownSampler->delay_ns(mDownSampler); 1744 } 1745 1746 long kernelDelay = (long)(((int64_t)kernelFr * 1000000000) / AUDIO_HW_IN_SAMPLERATE); 1747 1748 // correct capture time stamp 1749 long delayNs = kernelDelay + bufDelay + rsmpDelay; 1750 1751 buffer->time_stamp = tstamp; 1752 buffer->delay_ns = delayNs; 1753 LOGV("AudioStreamInALSA::getCaptureDelay TimeStamp = [%ld].[%ld], delayCaptureNs: [%d],"\ 1754 " kernelDelay:[%ld], bufDelay:[%ld], rsmpDelay:[%ld], kernelFr:[%d], "\ 1755 "mInputFramesIn:[%d], mProcFramesIn:[%d], frames:[%d]", 1756 buffer->time_stamp.tv_sec , buffer->time_stamp.tv_nsec, buffer->delay_ns, 1757 kernelDelay, bufDelay, rsmpDelay, kernelFr, mInputFramesIn, mProcFramesIn, frames); 1758 1759 } 1760 1761 ssize_t AudioHardware::AudioStreamInALSA::read(void* buffer, ssize_t bytes) 1762 { 1763 LOGV("-----AudioStreamInALSA::read(%p, %d) START", buffer, (int)bytes); 1764 status_t status = NO_INIT; 1765 1766 if (mHardware == NULL) return NO_INIT; 1767 1768 if (mSleepReq) { 1769 // 10ms are always shorter than the time to reconfigure the audio path 1770 // which is the only condition when mSleepReq would be true. 1771 usleep(10000); 1772 } 1773 1774 { // scope for the lock 1775 AutoMutex lock(mLock); 1776 1777 if (mStandby) { 1778 AutoMutex hwLock(mHardware->lock()); 1779 1780 LOGD("AudioHardware pcm capture is exiting standby."); 1781 sp<AudioStreamOutALSA> spOut = mHardware->output(); 1782 while (spOut != 0) { 1783 spOut->prepareLock(); 1784 mHardware->lock().unlock(); 1785 mLock.unlock(); 1786 // Mutex acquisition order is always out -> in -> hw 1787 spOut->lock(); 1788 mLock.lock(); 1789 mHardware->lock().lock(); 1790 // make sure that another thread did not change output state 1791 // while the mutex is released 1792 if (spOut == mHardware->output()) { 1793 break; 1794 } 1795 spOut->unlock(); 1796 spOut = mHardware->output(); 1797 } 1798 // open output before input 1799 if (spOut != 0) { 1800 if (!spOut->checkStandby()) { 1801 LOGV("AudioStreamInALSA::read() force output standby"); 1802 spOut->close_l(); 1803 if (spOut->open_l() != NO_ERROR) { 1804 spOut->doStandby_l(); 1805 } 1806 } 1807 LOGV("AudioStreamInALSA exit standby mNeedEchoReference %d mEchoReference %p", 1808 mNeedEchoReference, mEchoReference); 1809 if (mNeedEchoReference && mEchoReference == NULL) { 1810 mEchoReference = mHardware->getEchoReference(AUDIO_FORMAT_PCM_16_BIT, 1811 mChannelCount, 1812 mSampleRate); 1813 } 1814 spOut->unlock(); 1815 } 1816 1817 open_l(); 1818 1819 if (mPcm == NULL) { 1820 goto Error; 1821 } 1822 mStandby = false; 1823 } 1824 1825 size_t framesRq = bytes / mChannelCount/sizeof(int16_t); 1826 ssize_t framesRd; 1827 1828 if (mPreprocessors.size() == 0) { 1829 framesRd = readFrames(buffer, framesRq); 1830 } else { 1831 framesRd = processFrames(buffer, framesRq); 1832 } 1833 1834 if (framesRd >= 0) { 1835 LOGV("-----AudioStreamInALSA::read(%p, %d) END", buffer, (int)bytes); 1836 return framesRd * mChannelCount * sizeof(int16_t); 1837 } 1838 1839 LOGW("read error: %d", (int)framesRd); 1840 status = framesRd; 1841 } 1842 1843 Error: 1844 1845 standby(); 1846 1847 // Simulate audio output timing in case of error 1848 usleep((((bytes * 1000) / frameSize()) * 1000) / sampleRate()); 1849 LOGE("-----AudioStreamInALSA::read(%p, %d) END ERROR", buffer, (int)bytes); 1850 return status; 1851 } 1852 1853 status_t AudioHardware::AudioStreamInALSA::standby() 1854 { 1855 if (mHardware == NULL) return NO_INIT; 1856 1857 mSleepReq = true; 1858 { 1859 AutoMutex lock(mLock); 1860 mSleepReq = false; 1861 1862 { // scope for AudioHardware lock 1863 AutoMutex hwLock(mHardware->lock()); 1864 1865 doStandby_l(); 1866 } 1867 } 1868 return NO_ERROR; 1869 } 1870 1871 void AudioHardware::AudioStreamInALSA::doStandby_l() 1872 { 1873 mStandbyCnt++; 1874 1875 if (!mStandby) { 1876 LOGD("AudioHardware pcm capture is going to standby."); 1877 if (mEchoReference != NULL) { 1878 // stop reading from echo reference 1879 mEchoReference->read(mEchoReference, NULL); 1880 // Mutex acquisition order is always out -> in -> hw 1881 sp<AudioStreamOutALSA> spOut = mHardware->output(); 1882 if (spOut != 0) { 1883 spOut->prepareLock(); 1884 mHardware->lock().unlock(); 1885 mLock.unlock(); 1886 spOut->lock(); 1887 mLock.lock(); 1888 mHardware->lock().lock(); 1889 mHardware->releaseEchoReference(mEchoReference); 1890 spOut->unlock(); 1891 } 1892 mEchoReference = NULL; 1893 } 1894 1895 mStandby = true; 1896 } 1897 close_l(); 1898 } 1899 1900 void AudioHardware::AudioStreamInALSA::close_l() 1901 { 1902 if (mMixer) { 1903 mHardware->closeMixer_l(); 1904 mMixer = NULL; 1905 mRouteCtl = NULL; 1906 } 1907 1908 if (mPcm) { 1909 TRACE_DRIVER_IN(DRV_PCM_CLOSE) 1910 pcm_close(mPcm); 1911 TRACE_DRIVER_OUT 1912 mPcm = NULL; 1913 } 1914 1915 delete[] mProcBuf; 1916 mProcBuf = NULL; 1917 mProcBufSize = 0; 1918 delete[] mRefBuf; 1919 mRefBuf = NULL; 1920 mRefBufSize = 0; 1921 } 1922 1923 status_t AudioHardware::AudioStreamInALSA::open_l() 1924 { 1925 unsigned flags = PCM_IN; 1926 1927 struct pcm_config config = { 1928 channels : mChannelCount, 1929 rate : AUDIO_HW_IN_SAMPLERATE, 1930 period_size : AUDIO_HW_IN_PERIOD_SZ, 1931 period_count : AUDIO_HW_IN_PERIOD_CNT, 1932 format : PCM_FORMAT_S16_LE, 1933 start_threshold : 0, 1934 stop_threshold : 0, 1935 silence_threshold : 0, 1936 }; 1937 1938 LOGV("open pcm_in driver"); 1939 TRACE_DRIVER_IN(DRV_PCM_OPEN) 1940 mPcm = pcm_open(0, 0, flags, &config); 1941 TRACE_DRIVER_OUT 1942 if (!pcm_is_ready(mPcm)) { 1943 LOGE("cannot open pcm_in driver: %s\n", pcm_get_error(mPcm)); 1944 TRACE_DRIVER_IN(DRV_PCM_CLOSE) 1945 pcm_close(mPcm); 1946 TRACE_DRIVER_OUT 1947 mPcm = NULL; 1948 return NO_INIT; 1949 } 1950 1951 if (mDownSampler != NULL) { 1952 mDownSampler->reset(mDownSampler); 1953 } 1954 mInputFramesIn = 0; 1955 1956 mProcBufSize = 0; 1957 mProcFramesIn = 0; 1958 mRefBufSize = 0; 1959 mRefFramesIn = 0; 1960 1961 mMixer = mHardware->openMixer_l(); 1962 if (mMixer) { 1963 TRACE_DRIVER_IN(DRV_MIXER_GET) 1964 mRouteCtl = mixer_get_ctl_by_name(mMixer, "Capture MIC Path"); 1965 TRACE_DRIVER_OUT 1966 } 1967 1968 if (mHardware->mode() != AudioSystem::MODE_IN_CALL) { 1969 const char *route = mHardware->getInputRouteFromDevice(mDevices); 1970 LOGV("read() wakeup setting route %s", route); 1971 if (mRouteCtl) { 1972 TRACE_DRIVER_IN(DRV_MIXER_SEL) 1973 mixer_ctl_set_enum_by_string(mRouteCtl, route); 1974 TRACE_DRIVER_OUT 1975 } 1976 } 1977 1978 return NO_ERROR; 1979 } 1980 1981 status_t AudioHardware::AudioStreamInALSA::dump(int fd, const Vector<String16>& args) 1982 { 1983 const size_t SIZE = 256; 1984 char buffer[SIZE]; 1985 String8 result; 1986 1987 bool locked = tryLock(mLock); 1988 if (!locked) { 1989 snprintf(buffer, SIZE, "\n\t\tAudioStreamInALSA maybe deadlocked\n"); 1990 } else { 1991 mLock.unlock(); 1992 } 1993 1994 snprintf(buffer, SIZE, "\t\tmHardware: %p\n", mHardware); 1995 result.append(buffer); 1996 snprintf(buffer, SIZE, "\t\tmPcm: %p\n", mPcm); 1997 result.append(buffer); 1998 snprintf(buffer, SIZE, "\t\tmMixer: %p\n", mMixer); 1999 result.append(buffer); 2000 snprintf(buffer, SIZE, "\t\tStandby %s\n", (mStandby) ? "ON" : "OFF"); 2001 result.append(buffer); 2002 snprintf(buffer, SIZE, "\t\tmDevices: 0x%08x\n", mDevices); 2003 result.append(buffer); 2004 snprintf(buffer, SIZE, "\t\tmChannels: 0x%08x\n", mChannels); 2005 result.append(buffer); 2006 snprintf(buffer, SIZE, "\t\tmSampleRate: %d\n", mSampleRate); 2007 result.append(buffer); 2008 snprintf(buffer, SIZE, "\t\tmBufferSize: %d\n", mBufferSize); 2009 result.append(buffer); 2010 snprintf(buffer, SIZE, "\t\tmDriverOp: %d\n", mDriverOp); 2011 result.append(buffer); 2012 write(fd, result.string(), result.size()); 2013 2014 return NO_ERROR; 2015 } 2016 2017 bool AudioHardware::AudioStreamInALSA::checkStandby() 2018 { 2019 return mStandby; 2020 } 2021 2022 status_t AudioHardware::AudioStreamInALSA::setParameters(const String8& keyValuePairs) 2023 { 2024 AudioParameter param = AudioParameter(keyValuePairs); 2025 status_t status = NO_ERROR; 2026 int value; 2027 2028 LOGD("AudioStreamInALSA::setParameters() %s", keyValuePairs.string()); 2029 2030 if (mHardware == NULL) return NO_INIT; 2031 2032 mSleepReq = true; 2033 { 2034 AutoMutex lock(mLock); 2035 mSleepReq = false; 2036 2037 if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR) { 2038 AutoMutex hwLock(mHardware->lock()); 2039 2040 mHardware->openMixer_l(); 2041 mHardware->setInputSource_l((audio_source)value); 2042 mHardware->closeMixer_l(); 2043 2044 param.remove(String8(AudioParameter::keyInputSource)); 2045 } 2046 2047 if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) 2048 { 2049 if (value != 0) { 2050 AutoMutex hwLock(mHardware->lock()); 2051 2052 if (mDevices != (uint32_t)value) { 2053 mDevices = (uint32_t)value; 2054 if (mHardware->mode() != AudioSystem::MODE_IN_CALL) { 2055 doStandby_l(); 2056 } 2057 } 2058 } 2059 param.remove(String8(AudioParameter::keyRouting)); 2060 } 2061 } 2062 2063 2064 if (param.size()) { 2065 status = BAD_VALUE; 2066 } 2067 2068 return status; 2069 2070 } 2071 2072 String8 AudioHardware::AudioStreamInALSA::getParameters(const String8& keys) 2073 { 2074 AudioParameter param = AudioParameter(keys); 2075 String8 value; 2076 String8 key = String8(AudioParameter::keyRouting); 2077 2078 if (param.get(key, value) == NO_ERROR) { 2079 param.addInt(key, (int)mDevices); 2080 } 2081 2082 LOGV("AudioStreamInALSA::getParameters() %s", param.toString().string()); 2083 return param.toString(); 2084 } 2085 2086 status_t AudioHardware::AudioStreamInALSA::addAudioEffect(effect_handle_t effect) 2087 { 2088 LOGV("AudioStreamInALSA::addAudioEffect() %p", effect); 2089 2090 effect_descriptor_t desc; 2091 status_t status = (*effect)->get_descriptor(effect, &desc); 2092 if (status == 0) { 2093 if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) { 2094 LOGV("AudioStreamInALSA::addAudioEffect() mNeedEchoReference true"); 2095 mNeedEchoReference = true; 2096 standby(); 2097 } 2098 LOGV("AudioStreamInALSA::addAudioEffect() name %s", desc.name); 2099 } else { 2100 LOGV("AudioStreamInALSA::addAudioEffect() get_descriptor() error"); 2101 } 2102 2103 AutoMutex lock(mLock); 2104 mPreprocessors.add(effect); 2105 return NO_ERROR; 2106 } 2107 2108 status_t AudioHardware::AudioStreamInALSA::removeAudioEffect(effect_handle_t effect) 2109 { 2110 status_t status = INVALID_OPERATION; 2111 LOGV("AudioStreamInALSA::removeAudioEffect() %p", effect); 2112 { 2113 AutoMutex lock(mLock); 2114 for (size_t i = 0; i < mPreprocessors.size(); i++) { 2115 if (mPreprocessors[i] == effect) { 2116 mPreprocessors.removeAt(i); 2117 status = NO_ERROR; 2118 break; 2119 } 2120 } 2121 } 2122 2123 if (status == NO_ERROR) { 2124 effect_descriptor_t desc; 2125 if ((*effect)->get_descriptor(effect, &desc) == 0) { 2126 if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) { 2127 LOGV("AudioStreamInALSA::removeAudioEffect() mNeedEchoReference false"); 2128 mNeedEchoReference = false; 2129 standby(); 2130 } 2131 } 2132 } 2133 2134 return status; 2135 } 2136 2137 extern "C" { 2138 int AudioHardware::AudioStreamInALSA::getNextBufferStatic( 2139 struct resampler_buffer_provider *provider, 2140 struct resampler_buffer* buffer) 2141 { 2142 ResamplerBufferProvider *bufferProvider = (ResamplerBufferProvider *)provider; 2143 return bufferProvider->mInputStream->getNextBuffer(buffer); 2144 } 2145 2146 void AudioHardware::AudioStreamInALSA::releaseBufferStatic( 2147 struct resampler_buffer_provider *provider, 2148 struct resampler_buffer* buffer) 2149 { 2150 ResamplerBufferProvider *bufferProvider = (ResamplerBufferProvider *)provider; 2151 return bufferProvider->mInputStream->releaseBuffer(buffer); 2152 } 2153 2154 }; // extern "C" 2155 2156 status_t AudioHardware::AudioStreamInALSA::getNextBuffer(struct resampler_buffer *buffer) 2157 { 2158 if (mPcm == NULL) { 2159 buffer->raw = NULL; 2160 buffer->frame_count = 0; 2161 mReadStatus = NO_INIT; 2162 return NO_INIT; 2163 } 2164 2165 if (mInputFramesIn == 0) { 2166 TRACE_DRIVER_IN(DRV_PCM_READ) 2167 mReadStatus = pcm_read(mPcm,(void*) mInputBuf, AUDIO_HW_IN_PERIOD_SZ * frameSize()); 2168 TRACE_DRIVER_OUT 2169 if (mReadStatus != 0) { 2170 buffer->raw = NULL; 2171 buffer->frame_count = 0; 2172 return mReadStatus; 2173 } 2174 mInputFramesIn = AUDIO_HW_IN_PERIOD_SZ; 2175 } 2176 2177 buffer->frame_count = (buffer->frame_count > mInputFramesIn) ? mInputFramesIn:buffer->frame_count; 2178 buffer->i16 = mInputBuf + (AUDIO_HW_IN_PERIOD_SZ - mInputFramesIn) * mChannelCount; 2179 2180 return mReadStatus; 2181 } 2182 2183 void AudioHardware::AudioStreamInALSA::releaseBuffer(struct resampler_buffer *buffer) 2184 { 2185 mInputFramesIn -= buffer->frame_count; 2186 } 2187 2188 size_t AudioHardware::AudioStreamInALSA::getBufferSize(uint32_t sampleRate, int channelCount) 2189 { 2190 size_t i; 2191 size_t size = sizeof(inputConfigTable)/sizeof(uint32_t)/INPUT_CONFIG_CNT; 2192 2193 for (i = 0; i < size; i++) { 2194 if (sampleRate == inputConfigTable[i][INPUT_CONFIG_SAMPLE_RATE]) { 2195 return (AUDIO_HW_IN_PERIOD_SZ*channelCount*sizeof(int16_t)) / 2196 inputConfigTable[i][INPUT_CONFIG_BUFFER_RATIO]; 2197 } 2198 } 2199 // this should never happen as getBufferSize() is always called after getInputSampleRate() 2200 // that checks for valid sampling rates. 2201 LOGE("AudioStreamInALSA::getBufferSize() invalid sampling rate %d", sampleRate); 2202 return 0; 2203 } 2204 2205 int AudioHardware::AudioStreamInALSA::prepareLock() 2206 { 2207 // request sleep next time read() is called so that caller can acquire 2208 // mLock 2209 mSleepReq = true; 2210 return mStandbyCnt; 2211 } 2212 2213 void AudioHardware::AudioStreamInALSA::lock() 2214 { 2215 mLock.lock(); 2216 mSleepReq = false; 2217 } 2218 2219 void AudioHardware::AudioStreamInALSA::unlock() { 2220 mLock.unlock(); 2221 } 2222 2223 //------------------------------------------------------------------------------ 2224 // Factory 2225 //------------------------------------------------------------------------------ 2226 2227 extern "C" AudioHardwareInterface* createAudioHardware(void) { 2228 return new AudioHardware(); 2229 } 2230 2231 }; // namespace android 2232