1 /* 2 ** 3 ** Copyright 2008, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 //#define LOG_NDEBUG 0 19 #define LOG_TAG "AudioRecord" 20 21 #include <inttypes.h> 22 #include <android-base/macros.h> 23 #include <sys/resource.h> 24 25 #include <audiomanager/AudioManager.h> 26 #include <audiomanager/IAudioManager.h> 27 #include <binder/Binder.h> 28 #include <binder/IPCThreadState.h> 29 #include <binder/IServiceManager.h> 30 #include <media/AudioRecord.h> 31 #include <utils/Log.h> 32 #include <private/media/AudioTrackShared.h> 33 #include <processgroup/sched_policy.h> 34 #include <media/IAudioFlinger.h> 35 #include <media/MediaAnalyticsItem.h> 36 #include <media/TypeConverter.h> 37 38 #define WAIT_PERIOD_MS 10 39 40 namespace android { 41 // --------------------------------------------------------------------------- 42 43 // static 44 status_t AudioRecord::getMinFrameCount( 45 size_t* frameCount, 46 uint32_t sampleRate, 47 audio_format_t format, 48 audio_channel_mask_t channelMask) 49 { 50 if (frameCount == NULL) { 51 return BAD_VALUE; 52 } 53 54 size_t size; 55 status_t status = AudioSystem::getInputBufferSize(sampleRate, format, channelMask, &size); 56 if (status != NO_ERROR) { 57 ALOGE("%s(): AudioSystem could not query the input buffer size for" 58 " sampleRate %u, format %#x, channelMask %#x; status %d", 59 __func__, sampleRate, format, channelMask, status); 60 return status; 61 } 62 63 // We double the size of input buffer for ping pong use of record buffer. 64 // Assumes audio_is_linear_pcm(format) 65 if ((*frameCount = (size * 2) / (audio_channel_count_from_in_mask(channelMask) * 66 audio_bytes_per_sample(format))) == 0) { 67 ALOGE("%s(): Unsupported configuration: sampleRate %u, format %#x, channelMask %#x", 68 __func__, sampleRate, format, channelMask); 69 return BAD_VALUE; 70 } 71 72 return NO_ERROR; 73 } 74 75 // --------------------------------------------------------------------------- 76 77 void AudioRecord::MediaMetrics::gather(const AudioRecord *record) 78 { 79 #define MM_PREFIX "android.media.audiorecord." // avoid cut-n-paste errors. 80 81 // Java API 28 entries, do not change. 82 mAnalyticsItem->setCString(MM_PREFIX "encoding", toString(record->mFormat).c_str()); 83 mAnalyticsItem->setCString(MM_PREFIX "source", toString(record->mAttributes.source).c_str()); 84 mAnalyticsItem->setInt32(MM_PREFIX "latency", (int32_t)record->mLatency); // bad estimate. 85 mAnalyticsItem->setInt32(MM_PREFIX "samplerate", (int32_t)record->mSampleRate); 86 mAnalyticsItem->setInt32(MM_PREFIX "channels", (int32_t)record->mChannelCount); 87 88 // Non-API entries, these can change. 89 mAnalyticsItem->setInt32(MM_PREFIX "portId", (int32_t)record->mPortId); 90 mAnalyticsItem->setInt32(MM_PREFIX "frameCount", (int32_t)record->mFrameCount); 91 mAnalyticsItem->setCString(MM_PREFIX "attributes", toString(record->mAttributes).c_str()); 92 mAnalyticsItem->setInt64(MM_PREFIX "channelMask", (int64_t)record->mChannelMask); 93 94 // log total duration recording, including anything currently running. 95 int64_t activeNs = 0; 96 if (mStartedNs != 0) { 97 activeNs = systemTime() - mStartedNs; 98 } 99 mAnalyticsItem->setDouble(MM_PREFIX "durationMs", (mDurationNs + activeNs) * 1e-6); 100 mAnalyticsItem->setInt64(MM_PREFIX "startCount", (int64_t)mCount); 101 102 if (mLastError != NO_ERROR) { 103 mAnalyticsItem->setInt32(MM_PREFIX "lastError.code", (int32_t)mLastError); 104 mAnalyticsItem->setCString(MM_PREFIX "lastError.at", mLastErrorFunc.c_str()); 105 } 106 } 107 108 // hand the user a snapshot of the metrics. 109 status_t AudioRecord::getMetrics(MediaAnalyticsItem * &item) 110 { 111 mMediaMetrics.gather(this); 112 MediaAnalyticsItem *tmp = mMediaMetrics.dup(); 113 if (tmp == nullptr) { 114 return BAD_VALUE; 115 } 116 item = tmp; 117 return NO_ERROR; 118 } 119 120 AudioRecord::AudioRecord(const String16 &opPackageName) 121 : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName), 122 mSessionId(AUDIO_SESSION_ALLOCATE), 123 mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT), 124 mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE), 125 mSelectedMicDirection(MIC_DIRECTION_UNSPECIFIED), 126 mSelectedMicFieldDimension(MIC_FIELD_DIMENSION_DEFAULT) 127 { 128 } 129 130 AudioRecord::AudioRecord( 131 audio_source_t inputSource, 132 uint32_t sampleRate, 133 audio_format_t format, 134 audio_channel_mask_t channelMask, 135 const String16& opPackageName, 136 size_t frameCount, 137 callback_t cbf, 138 void* user, 139 uint32_t notificationFrames, 140 audio_session_t sessionId, 141 transfer_type transferType, 142 audio_input_flags_t flags, 143 uid_t uid, 144 pid_t pid, 145 const audio_attributes_t* pAttributes, 146 audio_port_handle_t selectedDeviceId, 147 audio_microphone_direction_t selectedMicDirection, 148 float microphoneFieldDimension) 149 : mActive(false), 150 mStatus(NO_INIT), 151 mOpPackageName(opPackageName), 152 mSessionId(AUDIO_SESSION_ALLOCATE), 153 mPreviousPriority(ANDROID_PRIORITY_NORMAL), 154 mPreviousSchedulingGroup(SP_DEFAULT), 155 mProxy(NULL) 156 { 157 (void)set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user, 158 notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags, 159 uid, pid, pAttributes, selectedDeviceId, 160 selectedMicDirection, microphoneFieldDimension); 161 } 162 163 AudioRecord::~AudioRecord() 164 { 165 mMediaMetrics.gather(this); 166 167 if (mStatus == NO_ERROR) { 168 // Make sure that callback function exits in the case where 169 // it is looping on buffer empty condition in obtainBuffer(). 170 // Otherwise the callback thread will never exit. 171 stop(); 172 if (mAudioRecordThread != 0) { 173 mProxy->interrupt(); 174 mAudioRecordThread->requestExit(); // see comment in AudioRecord.h 175 mAudioRecordThread->requestExitAndWait(); 176 mAudioRecordThread.clear(); 177 } 178 // No lock here: worst case we remove a NULL callback which will be a nop 179 if (mDeviceCallback != 0 && mInput != AUDIO_IO_HANDLE_NONE) { 180 AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId); 181 } 182 IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this); 183 mAudioRecord.clear(); 184 mCblkMemory.clear(); 185 mBufferMemory.clear(); 186 IPCThreadState::self()->flushCommands(); 187 ALOGV("%s(%d): releasing session id %d", 188 __func__, mPortId, mSessionId); 189 AudioSystem::releaseAudioSessionId(mSessionId, -1 /*pid*/); 190 } 191 } 192 193 status_t AudioRecord::set( 194 audio_source_t inputSource, 195 uint32_t sampleRate, 196 audio_format_t format, 197 audio_channel_mask_t channelMask, 198 size_t frameCount, 199 callback_t cbf, 200 void* user, 201 uint32_t notificationFrames, 202 bool threadCanCallJava, 203 audio_session_t sessionId, 204 transfer_type transferType, 205 audio_input_flags_t flags, 206 uid_t uid, 207 pid_t pid, 208 const audio_attributes_t* pAttributes, 209 audio_port_handle_t selectedDeviceId, 210 audio_microphone_direction_t selectedMicDirection, 211 float microphoneFieldDimension) 212 { 213 status_t status = NO_ERROR; 214 uint32_t channelCount; 215 pid_t callingPid; 216 pid_t myPid; 217 218 // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set. 219 ALOGV("%s(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " 220 "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s " 221 "uid %d, pid %d", 222 __func__, 223 inputSource, sampleRate, format, channelMask, frameCount, notificationFrames, 224 sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid); 225 226 mTracker.reset(new RecordingActivityTracker()); 227 228 mSelectedDeviceId = selectedDeviceId; 229 mSelectedMicDirection = selectedMicDirection; 230 mSelectedMicFieldDimension = microphoneFieldDimension; 231 232 switch (transferType) { 233 case TRANSFER_DEFAULT: 234 if (cbf == NULL || threadCanCallJava) { 235 transferType = TRANSFER_SYNC; 236 } else { 237 transferType = TRANSFER_CALLBACK; 238 } 239 break; 240 case TRANSFER_CALLBACK: 241 if (cbf == NULL) { 242 ALOGE("%s(): Transfer type TRANSFER_CALLBACK but cbf == NULL", __func__); 243 status = BAD_VALUE; 244 goto exit; 245 } 246 break; 247 case TRANSFER_OBTAIN: 248 case TRANSFER_SYNC: 249 break; 250 default: 251 ALOGE("%s(): Invalid transfer type %d", __func__, transferType); 252 status = BAD_VALUE; 253 goto exit; 254 } 255 mTransfer = transferType; 256 257 // invariant that mAudioRecord != 0 is true only after set() returns successfully 258 if (mAudioRecord != 0) { 259 ALOGE("%s(): Track already in use", __func__); 260 status = INVALID_OPERATION; 261 goto exit; 262 } 263 264 if (pAttributes == NULL) { 265 memset(&mAttributes, 0, sizeof(audio_attributes_t)); 266 mAttributes.source = inputSource; 267 } else { 268 // stream type shouldn't be looked at, this track has audio attributes 269 memcpy(&mAttributes, pAttributes, sizeof(audio_attributes_t)); 270 ALOGV("%s(): Building AudioRecord with attributes: source=%d flags=0x%x tags=[%s]", 271 __func__, mAttributes.source, mAttributes.flags, mAttributes.tags); 272 } 273 274 mSampleRate = sampleRate; 275 276 // these below should probably come from the audioFlinger too... 277 if (format == AUDIO_FORMAT_DEFAULT) { 278 format = AUDIO_FORMAT_PCM_16_BIT; 279 } 280 281 // validate parameters 282 // AudioFlinger capture only supports linear PCM 283 if (!audio_is_valid_format(format) || !audio_is_linear_pcm(format)) { 284 ALOGE("%s(): Format %#x is not linear pcm", __func__, format); 285 status = BAD_VALUE; 286 goto exit; 287 } 288 mFormat = format; 289 290 if (!audio_is_input_channel(channelMask)) { 291 ALOGE("%s(): Invalid channel mask %#x", __func__, channelMask); 292 status = BAD_VALUE; 293 goto exit; 294 } 295 mChannelMask = channelMask; 296 channelCount = audio_channel_count_from_in_mask(channelMask); 297 mChannelCount = channelCount; 298 299 if (audio_is_linear_pcm(format)) { 300 mFrameSize = channelCount * audio_bytes_per_sample(format); 301 } else { 302 mFrameSize = sizeof(uint8_t); 303 } 304 305 // mFrameCount is initialized in createRecord_l 306 mReqFrameCount = frameCount; 307 308 mNotificationFramesReq = notificationFrames; 309 // mNotificationFramesAct is initialized in createRecord_l 310 311 mSessionId = sessionId; 312 ALOGV("%s(): mSessionId %d", __func__, mSessionId); 313 314 callingPid = IPCThreadState::self()->getCallingPid(); 315 myPid = getpid(); 316 if (uid == AUDIO_UID_INVALID || (callingPid != myPid)) { 317 mClientUid = IPCThreadState::self()->getCallingUid(); 318 } else { 319 mClientUid = uid; 320 } 321 if (pid == -1 || (callingPid != myPid)) { 322 mClientPid = callingPid; 323 } else { 324 mClientPid = pid; 325 } 326 327 mOrigFlags = mFlags = flags; 328 mCbf = cbf; 329 330 if (cbf != NULL) { 331 mAudioRecordThread = new AudioRecordThread(*this); 332 mAudioRecordThread->run("AudioRecord", ANDROID_PRIORITY_AUDIO); 333 // thread begins in paused state, and will not reference us until start() 334 } 335 336 // create the IAudioRecord 337 { 338 AutoMutex lock(mLock); 339 status = createRecord_l(0 /*epoch*/, mOpPackageName); 340 } 341 342 ALOGV("%s(%d): status %d", __func__, mPortId, status); 343 344 if (status != NO_ERROR) { 345 if (mAudioRecordThread != 0) { 346 mAudioRecordThread->requestExit(); // see comment in AudioRecord.h 347 mAudioRecordThread->requestExitAndWait(); 348 mAudioRecordThread.clear(); 349 } 350 goto exit; 351 } 352 353 mUserData = user; 354 // TODO: add audio hardware input latency here 355 mLatency = (1000LL * mFrameCount) / mSampleRate; 356 mMarkerPosition = 0; 357 mMarkerReached = false; 358 mNewPosition = 0; 359 mUpdatePeriod = 0; 360 AudioSystem::acquireAudioSessionId(mSessionId, -1); 361 mSequence = 1; 362 mObservedSequence = mSequence; 363 mInOverrun = false; 364 mFramesRead = 0; 365 mFramesReadServerOffset = 0; 366 367 exit: 368 mStatus = status; 369 if (status != NO_ERROR) { 370 mMediaMetrics.markError(status, __FUNCTION__); 371 } 372 return status; 373 } 374 375 // ------------------------------------------------------------------------- 376 377 status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t triggerSession) 378 { 379 ALOGV("%s(%d): sync event %d trigger session %d", __func__, mPortId, event, triggerSession); 380 381 AutoMutex lock(mLock); 382 if (mActive) { 383 return NO_ERROR; 384 } 385 386 // discard data in buffer 387 const uint32_t framesFlushed = mProxy->flush(); 388 mFramesReadServerOffset -= mFramesRead + framesFlushed; 389 mFramesRead = 0; 390 mProxy->clearTimestamp(); // timestamp is invalid until next server push 391 392 // reset current position as seen by client to 0 393 mProxy->setEpoch(mProxy->getEpoch() - mProxy->getPosition()); 394 // force refresh of remaining frames by processAudioBuffer() as last 395 // read before stop could be partial. 396 mRefreshRemaining = true; 397 398 mNewPosition = mProxy->getPosition() + mUpdatePeriod; 399 int32_t flags = android_atomic_acquire_load(&mCblk->mFlags); 400 401 // we reactivate markers (mMarkerPosition != 0) as the position is reset to 0. 402 // This is legacy behavior. This is not done in stop() to avoid a race condition 403 // where the last marker event is issued twice. 404 mMarkerReached = false; 405 // mActive is checked by restoreRecord_l 406 mActive = true; 407 408 status_t status = NO_ERROR; 409 if (!(flags & CBLK_INVALID)) { 410 status = mAudioRecord->start(event, triggerSession).transactionError(); 411 if (status == DEAD_OBJECT) { 412 flags |= CBLK_INVALID; 413 } 414 } 415 if (flags & CBLK_INVALID) { 416 status = restoreRecord_l("start"); 417 } 418 419 // Call these directly because we are already holding the lock. 420 mAudioRecord->setPreferredMicrophoneDirection(mSelectedMicDirection); 421 mAudioRecord->setPreferredMicrophoneFieldDimension(mSelectedMicFieldDimension); 422 423 if (status != NO_ERROR) { 424 mActive = false; 425 ALOGE("%s(%d): status %d", __func__, mPortId, status); 426 mMediaMetrics.markError(status, __FUNCTION__); 427 } else { 428 mTracker->recordingStarted(); 429 sp<AudioRecordThread> t = mAudioRecordThread; 430 if (t != 0) { 431 t->resume(); 432 } else { 433 mPreviousPriority = getpriority(PRIO_PROCESS, 0); 434 get_sched_policy(0, &mPreviousSchedulingGroup); 435 androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO); 436 } 437 438 // we've successfully started, log that time 439 mMediaMetrics.logStart(systemTime()); 440 } 441 return status; 442 } 443 444 void AudioRecord::stop() 445 { 446 AutoMutex lock(mLock); 447 ALOGV("%s(%d): mActive:%d\n", __func__, mPortId, mActive); 448 if (!mActive) { 449 return; 450 } 451 452 mActive = false; 453 mProxy->interrupt(); 454 mAudioRecord->stop(); 455 mTracker->recordingStopped(); 456 457 // Note: legacy handling - stop does not clear record marker and 458 // periodic update position; we update those on start(). 459 460 sp<AudioRecordThread> t = mAudioRecordThread; 461 if (t != 0) { 462 t->pause(); 463 } else { 464 setpriority(PRIO_PROCESS, 0, mPreviousPriority); 465 set_sched_policy(0, mPreviousSchedulingGroup); 466 } 467 468 // we've successfully started, log that time 469 mMediaMetrics.logStop(systemTime()); 470 } 471 472 bool AudioRecord::stopped() const 473 { 474 AutoMutex lock(mLock); 475 return !mActive; 476 } 477 478 status_t AudioRecord::setMarkerPosition(uint32_t marker) 479 { 480 // The only purpose of setting marker position is to get a callback 481 if (mCbf == NULL) { 482 return INVALID_OPERATION; 483 } 484 485 AutoMutex lock(mLock); 486 mMarkerPosition = marker; 487 mMarkerReached = false; 488 489 sp<AudioRecordThread> t = mAudioRecordThread; 490 if (t != 0) { 491 t->wake(); 492 } 493 return NO_ERROR; 494 } 495 496 status_t AudioRecord::getMarkerPosition(uint32_t *marker) const 497 { 498 if (marker == NULL) { 499 return BAD_VALUE; 500 } 501 502 AutoMutex lock(mLock); 503 mMarkerPosition.getValue(marker); 504 505 return NO_ERROR; 506 } 507 508 status_t AudioRecord::setPositionUpdatePeriod(uint32_t updatePeriod) 509 { 510 // The only purpose of setting position update period is to get a callback 511 if (mCbf == NULL) { 512 return INVALID_OPERATION; 513 } 514 515 AutoMutex lock(mLock); 516 mNewPosition = mProxy->getPosition() + updatePeriod; 517 mUpdatePeriod = updatePeriod; 518 519 sp<AudioRecordThread> t = mAudioRecordThread; 520 if (t != 0) { 521 t->wake(); 522 } 523 return NO_ERROR; 524 } 525 526 status_t AudioRecord::getPositionUpdatePeriod(uint32_t *updatePeriod) const 527 { 528 if (updatePeriod == NULL) { 529 return BAD_VALUE; 530 } 531 532 AutoMutex lock(mLock); 533 *updatePeriod = mUpdatePeriod; 534 535 return NO_ERROR; 536 } 537 538 status_t AudioRecord::getPosition(uint32_t *position) const 539 { 540 if (position == NULL) { 541 return BAD_VALUE; 542 } 543 544 AutoMutex lock(mLock); 545 mProxy->getPosition().getValue(position); 546 547 return NO_ERROR; 548 } 549 550 uint32_t AudioRecord::getInputFramesLost() const 551 { 552 // no need to check mActive, because if inactive this will return 0, which is what we want 553 return AudioSystem::getInputFramesLost(getInputPrivate()); 554 } 555 556 status_t AudioRecord::getTimestamp(ExtendedTimestamp *timestamp) 557 { 558 if (timestamp == nullptr) { 559 return BAD_VALUE; 560 } 561 AutoMutex lock(mLock); 562 status_t status = mProxy->getTimestamp(timestamp); 563 if (status == OK) { 564 timestamp->mPosition[ExtendedTimestamp::LOCATION_CLIENT] = mFramesRead; 565 timestamp->mTimeNs[ExtendedTimestamp::LOCATION_CLIENT] = 0; 566 // server side frame offset in case AudioRecord has been restored. 567 for (int i = ExtendedTimestamp::LOCATION_SERVER; 568 i < ExtendedTimestamp::LOCATION_MAX; ++i) { 569 if (timestamp->mTimeNs[i] >= 0) { 570 timestamp->mPosition[i] += mFramesReadServerOffset; 571 } 572 } 573 } 574 return status; 575 } 576 577 // ---- Explicit Routing --------------------------------------------------- 578 status_t AudioRecord::setInputDevice(audio_port_handle_t deviceId) { 579 AutoMutex lock(mLock); 580 if (mSelectedDeviceId != deviceId) { 581 mSelectedDeviceId = deviceId; 582 if (mStatus == NO_ERROR) { 583 // stop capture so that audio policy manager does not reject the new instance start request 584 // as only one capture can be active at a time. 585 if (mAudioRecord != 0 && mActive) { 586 mAudioRecord->stop(); 587 } 588 android_atomic_or(CBLK_INVALID, &mCblk->mFlags); 589 mProxy->interrupt(); 590 } 591 } 592 return NO_ERROR; 593 } 594 595 audio_port_handle_t AudioRecord::getInputDevice() { 596 AutoMutex lock(mLock); 597 return mSelectedDeviceId; 598 } 599 600 // must be called with mLock held 601 void AudioRecord::updateRoutedDeviceId_l() 602 { 603 // if the record is inactive, do not update actual device as the input stream maybe routed 604 // from a device not relevant to this client because of other active use cases. 605 if (!mActive) { 606 return; 607 } 608 if (mInput != AUDIO_IO_HANDLE_NONE) { 609 audio_port_handle_t deviceId = AudioSystem::getDeviceIdForIo(mInput); 610 if (deviceId != AUDIO_PORT_HANDLE_NONE) { 611 mRoutedDeviceId = deviceId; 612 } 613 } 614 } 615 616 audio_port_handle_t AudioRecord::getRoutedDeviceId() { 617 AutoMutex lock(mLock); 618 updateRoutedDeviceId_l(); 619 return mRoutedDeviceId; 620 } 621 622 status_t AudioRecord::dump(int fd, const Vector<String16>& args __unused) const 623 { 624 String8 result; 625 626 result.append(" AudioRecord::dump\n"); 627 result.appendFormat(" id(%d) status(%d), active(%d), session Id(%d)\n", 628 mPortId, mStatus, mActive, mSessionId); 629 result.appendFormat(" flags(%#x), req. flags(%#x), audio source(%d)\n", 630 mFlags, mOrigFlags, mAttributes.source); 631 result.appendFormat(" format(%#x), channel mask(%#x), channel count(%u), sample rate(%u)\n", 632 mFormat, mChannelMask, mChannelCount, mSampleRate); 633 result.appendFormat(" frame count(%zu), req. frame count(%zu)\n", 634 mFrameCount, mReqFrameCount); 635 result.appendFormat(" notif. frame count(%u), req. notif. frame count(%u)\n", 636 mNotificationFramesAct, mNotificationFramesReq); 637 result.appendFormat(" input(%d), latency(%u), selected device Id(%d), routed device Id(%d)\n", 638 mInput, mLatency, mSelectedDeviceId, mRoutedDeviceId); 639 result.appendFormat(" mic direction(%d) mic field dimension(%f)", 640 mSelectedMicDirection, mSelectedMicFieldDimension); 641 ::write(fd, result.string(), result.size()); 642 return NO_ERROR; 643 } 644 645 // ------------------------------------------------------------------------- 646 // TODO Move this macro to a common header file for enum to string conversion in audio framework. 647 #define MEDIA_CASE_ENUM(name) case name: return #name 648 const char * AudioRecord::convertTransferToText(transfer_type transferType) { 649 switch (transferType) { 650 MEDIA_CASE_ENUM(TRANSFER_DEFAULT); 651 MEDIA_CASE_ENUM(TRANSFER_CALLBACK); 652 MEDIA_CASE_ENUM(TRANSFER_OBTAIN); 653 MEDIA_CASE_ENUM(TRANSFER_SYNC); 654 default: 655 return "UNRECOGNIZED"; 656 } 657 } 658 659 // must be called with mLock held 660 status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch, const String16& opPackageName) 661 { 662 const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger(); 663 IAudioFlinger::CreateRecordInput input; 664 IAudioFlinger::CreateRecordOutput output; 665 audio_session_t originalSessionId; 666 sp<media::IAudioRecord> record; 667 void *iMemPointer; 668 audio_track_cblk_t* cblk; 669 status_t status; 670 671 if (audioFlinger == 0) { 672 ALOGE("%s(%d): Could not get audioflinger", __func__, mPortId); 673 status = NO_INIT; 674 goto exit; 675 } 676 677 // mFlags (not mOrigFlags) is modified depending on whether fast request is accepted. 678 // After fast request is denied, we will request again if IAudioRecord is re-created. 679 680 // Now that we have a reference to an I/O handle and have not yet handed it off to AudioFlinger, 681 // we must release it ourselves if anything goes wrong. 682 683 // Client can only express a preference for FAST. Server will perform additional tests. 684 if (mFlags & AUDIO_INPUT_FLAG_FAST) { 685 bool useCaseAllowed = 686 // any of these use cases: 687 // use case 1: callback transfer mode 688 (mTransfer == TRANSFER_CALLBACK) || 689 // use case 2: blocking read mode 690 // The default buffer capacity at 48 kHz is 2048 frames, or ~42.6 ms. 691 // That's enough for double-buffering with our standard 20 ms rule of thumb for 692 // the minimum period of a non-SCHED_FIFO thread. 693 // This is needed so that AAudio apps can do a low latency non-blocking read from a 694 // callback running with SCHED_FIFO. 695 (mTransfer == TRANSFER_SYNC) || 696 // use case 3: obtain/release mode 697 (mTransfer == TRANSFER_OBTAIN); 698 if (!useCaseAllowed) { 699 ALOGW("%s(%d): AUDIO_INPUT_FLAG_FAST denied, incompatible transfer = %s", 700 __func__, mPortId, 701 convertTransferToText(mTransfer)); 702 mFlags = (audio_input_flags_t) (mFlags & ~(AUDIO_INPUT_FLAG_FAST | 703 AUDIO_INPUT_FLAG_RAW)); 704 } 705 } 706 707 input.attr = mAttributes; 708 input.config.sample_rate = mSampleRate; 709 input.config.channel_mask = mChannelMask; 710 input.config.format = mFormat; 711 input.clientInfo.clientUid = mClientUid; 712 input.clientInfo.clientPid = mClientPid; 713 input.clientInfo.clientTid = -1; 714 if (mFlags & AUDIO_INPUT_FLAG_FAST) { 715 if (mAudioRecordThread != 0) { 716 input.clientInfo.clientTid = mAudioRecordThread->getTid(); 717 } 718 } 719 input.opPackageName = opPackageName; 720 input.riid = mTracker->getRiid(); 721 722 input.flags = mFlags; 723 // The notification frame count is the period between callbacks, as suggested by the client 724 // but moderated by the server. For record, the calculations are done entirely on server side. 725 input.frameCount = mReqFrameCount; 726 input.notificationFrameCount = mNotificationFramesReq; 727 input.selectedDeviceId = mSelectedDeviceId; 728 input.sessionId = mSessionId; 729 originalSessionId = mSessionId; 730 731 record = audioFlinger->createRecord(input, 732 output, 733 &status); 734 735 if (status != NO_ERROR) { 736 ALOGE("%s(%d): AudioFlinger could not create record track, status: %d", 737 __func__, mPortId, status); 738 goto exit; 739 } 740 ALOG_ASSERT(record != 0); 741 742 // AudioFlinger now owns the reference to the I/O handle, 743 // so we are no longer responsible for releasing it. 744 745 mAwaitBoost = false; 746 if (output.flags & AUDIO_INPUT_FLAG_FAST) { 747 ALOGI("%s(%d): AUDIO_INPUT_FLAG_FAST successful; frameCount %zu -> %zu", 748 __func__, mPortId, 749 mReqFrameCount, output.frameCount); 750 mAwaitBoost = true; 751 } 752 mFlags = output.flags; 753 mRoutedDeviceId = output.selectedDeviceId; 754 mSessionId = output.sessionId; 755 mSampleRate = output.sampleRate; 756 757 if (output.cblk == 0) { 758 ALOGE("%s(%d): Could not get control block", __func__, mPortId); 759 status = NO_INIT; 760 goto exit; 761 } 762 iMemPointer = output.cblk ->pointer(); 763 if (iMemPointer == NULL) { 764 ALOGE("%s(%d): Could not get control block pointer", __func__, mPortId); 765 status = NO_INIT; 766 goto exit; 767 } 768 cblk = static_cast<audio_track_cblk_t*>(iMemPointer); 769 770 // Starting address of buffers in shared memory. 771 // The buffers are either immediately after the control block, 772 // or in a separate area at discretion of server. 773 void *buffers; 774 if (output.buffers == 0) { 775 buffers = cblk + 1; 776 } else { 777 buffers = output.buffers->pointer(); 778 if (buffers == NULL) { 779 ALOGE("%s(%d): Could not get buffer pointer", __func__, mPortId); 780 status = NO_INIT; 781 goto exit; 782 } 783 } 784 785 // invariant that mAudioRecord != 0 is true only after set() returns successfully 786 if (mAudioRecord != 0) { 787 IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this); 788 mDeathNotifier.clear(); 789 } 790 mAudioRecord = record; 791 mCblkMemory = output.cblk; 792 mBufferMemory = output.buffers; 793 IPCThreadState::self()->flushCommands(); 794 795 mCblk = cblk; 796 // note that output.frameCount is the (possibly revised) value of mReqFrameCount 797 if (output.frameCount < mReqFrameCount || (mReqFrameCount == 0 && output.frameCount == 0)) { 798 ALOGW("%s(%d): Requested frameCount %zu but received frameCount %zu", 799 __func__, output.portId, 800 mReqFrameCount, output.frameCount); 801 } 802 803 // Make sure that application is notified with sufficient margin before overrun. 804 // The computation is done on server side. 805 if (mNotificationFramesReq > 0 && output.notificationFrameCount != mNotificationFramesReq) { 806 ALOGW("%s(%d): Server adjusted notificationFrames from %u to %zu for frameCount %zu", 807 __func__, output.portId, 808 mNotificationFramesReq, output.notificationFrameCount, output.frameCount); 809 } 810 mNotificationFramesAct = (uint32_t)output.notificationFrameCount; 811 812 //mInput != input includes the case where mInput == AUDIO_IO_HANDLE_NONE for first creation 813 if (mDeviceCallback != 0) { 814 if (mInput != AUDIO_IO_HANDLE_NONE) { 815 AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId); 816 } 817 AudioSystem::addAudioDeviceCallback(this, output.inputId, output.portId); 818 } 819 820 mPortId = output.portId; 821 // We retain a copy of the I/O handle, but don't own the reference 822 mInput = output.inputId; 823 mRefreshRemaining = true; 824 825 mFrameCount = output.frameCount; 826 // If IAudioRecord is re-created, don't let the requested frameCount 827 // decrease. This can confuse clients that cache frameCount(). 828 if (mFrameCount > mReqFrameCount) { 829 mReqFrameCount = mFrameCount; 830 } 831 832 // update proxy 833 mProxy = new AudioRecordClientProxy(cblk, buffers, mFrameCount, mFrameSize); 834 mProxy->setEpoch(epoch); 835 mProxy->setMinimum(mNotificationFramesAct); 836 837 mDeathNotifier = new DeathNotifier(this); 838 IInterface::asBinder(mAudioRecord)->linkToDeath(mDeathNotifier, this); 839 840 exit: 841 mStatus = status; 842 // sp<IAudioTrack> track destructor will cause releaseOutput() to be called by AudioFlinger 843 return status; 844 } 845 846 status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_t *nonContig) 847 { 848 if (audioBuffer == NULL) { 849 if (nonContig != NULL) { 850 *nonContig = 0; 851 } 852 return BAD_VALUE; 853 } 854 if (mTransfer != TRANSFER_OBTAIN) { 855 audioBuffer->frameCount = 0; 856 audioBuffer->size = 0; 857 audioBuffer->raw = NULL; 858 if (nonContig != NULL) { 859 *nonContig = 0; 860 } 861 return INVALID_OPERATION; 862 } 863 864 const struct timespec *requested; 865 struct timespec timeout; 866 if (waitCount == -1) { 867 requested = &ClientProxy::kForever; 868 } else if (waitCount == 0) { 869 requested = &ClientProxy::kNonBlocking; 870 } else if (waitCount > 0) { 871 time_t ms = WAIT_PERIOD_MS * (time_t) waitCount; 872 timeout.tv_sec = ms / 1000; 873 timeout.tv_nsec = (long) (ms % 1000) * 1000000; 874 requested = &timeout; 875 } else { 876 ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount); 877 requested = NULL; 878 } 879 return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig); 880 } 881 882 status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *requested, 883 struct timespec *elapsed, size_t *nonContig) 884 { 885 // previous and new IAudioRecord sequence numbers are used to detect track re-creation 886 uint32_t oldSequence = 0; 887 uint32_t newSequence; 888 889 Proxy::Buffer buffer; 890 status_t status = NO_ERROR; 891 892 static const int32_t kMaxTries = 5; 893 int32_t tryCounter = kMaxTries; 894 895 do { 896 // obtainBuffer() is called with mutex unlocked, so keep extra references to these fields to 897 // keep them from going away if another thread re-creates the track during obtainBuffer() 898 sp<AudioRecordClientProxy> proxy; 899 sp<IMemory> iMem; 900 sp<IMemory> bufferMem; 901 { 902 // start of lock scope 903 AutoMutex lock(mLock); 904 905 newSequence = mSequence; 906 // did previous obtainBuffer() fail due to media server death or voluntary invalidation? 907 if (status == DEAD_OBJECT) { 908 // re-create track, unless someone else has already done so 909 if (newSequence == oldSequence) { 910 status = restoreRecord_l("obtainBuffer"); 911 if (status != NO_ERROR) { 912 buffer.mFrameCount = 0; 913 buffer.mRaw = NULL; 914 buffer.mNonContig = 0; 915 break; 916 } 917 } 918 } 919 oldSequence = newSequence; 920 921 // Keep the extra references 922 proxy = mProxy; 923 iMem = mCblkMemory; 924 bufferMem = mBufferMemory; 925 926 // Non-blocking if track is stopped 927 if (!mActive) { 928 requested = &ClientProxy::kNonBlocking; 929 } 930 931 } // end of lock scope 932 933 buffer.mFrameCount = audioBuffer->frameCount; 934 // FIXME starts the requested timeout and elapsed over from scratch 935 status = proxy->obtainBuffer(&buffer, requested, elapsed); 936 937 } while ((status == DEAD_OBJECT) && (tryCounter-- > 0)); 938 939 audioBuffer->frameCount = buffer.mFrameCount; 940 audioBuffer->size = buffer.mFrameCount * mFrameSize; 941 audioBuffer->raw = buffer.mRaw; 942 if (nonContig != NULL) { 943 *nonContig = buffer.mNonContig; 944 } 945 return status; 946 } 947 948 void AudioRecord::releaseBuffer(const Buffer* audioBuffer) 949 { 950 // FIXME add error checking on mode, by adding an internal version 951 952 size_t stepCount = audioBuffer->size / mFrameSize; 953 if (stepCount == 0) { 954 return; 955 } 956 957 Proxy::Buffer buffer; 958 buffer.mFrameCount = stepCount; 959 buffer.mRaw = audioBuffer->raw; 960 961 AutoMutex lock(mLock); 962 mInOverrun = false; 963 mProxy->releaseBuffer(&buffer); 964 965 // the server does not automatically disable recorder on overrun, so no need to restart 966 } 967 968 audio_io_handle_t AudioRecord::getInputPrivate() const 969 { 970 AutoMutex lock(mLock); 971 return mInput; 972 } 973 974 // ------------------------------------------------------------------------- 975 976 ssize_t AudioRecord::read(void* buffer, size_t userSize, bool blocking) 977 { 978 if (mTransfer != TRANSFER_SYNC) { 979 return INVALID_OPERATION; 980 } 981 982 if (ssize_t(userSize) < 0 || (buffer == NULL && userSize != 0)) { 983 // sanity-check. user is most-likely passing an error code, and it would 984 // make the return value ambiguous (actualSize vs error). 985 ALOGE("%s(%d) (buffer=%p, size=%zu (%zu)", 986 __func__, mPortId, buffer, userSize, userSize); 987 return BAD_VALUE; 988 } 989 990 ssize_t read = 0; 991 Buffer audioBuffer; 992 993 while (userSize >= mFrameSize) { 994 audioBuffer.frameCount = userSize / mFrameSize; 995 996 status_t err = obtainBuffer(&audioBuffer, 997 blocking ? &ClientProxy::kForever : &ClientProxy::kNonBlocking); 998 if (err < 0) { 999 if (read > 0) { 1000 break; 1001 } 1002 if (err == TIMED_OUT || err == -EINTR) { 1003 err = WOULD_BLOCK; 1004 } 1005 return ssize_t(err); 1006 } 1007 1008 size_t bytesRead = audioBuffer.size; 1009 memcpy(buffer, audioBuffer.i8, bytesRead); 1010 buffer = ((char *) buffer) + bytesRead; 1011 userSize -= bytesRead; 1012 read += bytesRead; 1013 1014 releaseBuffer(&audioBuffer); 1015 } 1016 if (read > 0) { 1017 mFramesRead += read / mFrameSize; 1018 // mFramesReadTime = systemTime(SYSTEM_TIME_MONOTONIC); // not provided at this time. 1019 } 1020 return read; 1021 } 1022 1023 // ------------------------------------------------------------------------- 1024 1025 nsecs_t AudioRecord::processAudioBuffer() 1026 { 1027 mLock.lock(); 1028 if (mAwaitBoost) { 1029 mAwaitBoost = false; 1030 mLock.unlock(); 1031 static const int32_t kMaxTries = 5; 1032 int32_t tryCounter = kMaxTries; 1033 uint32_t pollUs = 10000; 1034 do { 1035 int policy = sched_getscheduler(0) & ~SCHED_RESET_ON_FORK; 1036 if (policy == SCHED_FIFO || policy == SCHED_RR) { 1037 break; 1038 } 1039 usleep(pollUs); 1040 pollUs <<= 1; 1041 } while (tryCounter-- > 0); 1042 if (tryCounter < 0) { 1043 ALOGE("%s(%d): did not receive expected priority boost on time", __func__, mPortId); 1044 } 1045 // Run again immediately 1046 return 0; 1047 } 1048 1049 // Can only reference mCblk while locked 1050 int32_t flags = android_atomic_and(~CBLK_OVERRUN, &mCblk->mFlags); 1051 1052 // Check for track invalidation 1053 if (flags & CBLK_INVALID) { 1054 (void) restoreRecord_l("processAudioBuffer"); 1055 mLock.unlock(); 1056 // Run again immediately, but with a new IAudioRecord 1057 return 0; 1058 } 1059 1060 bool active = mActive; 1061 1062 // Manage overrun callback, must be done under lock to avoid race with releaseBuffer() 1063 bool newOverrun = false; 1064 if (flags & CBLK_OVERRUN) { 1065 if (!mInOverrun) { 1066 mInOverrun = true; 1067 newOverrun = true; 1068 } 1069 } 1070 1071 // Get current position of server 1072 Modulo<uint32_t> position(mProxy->getPosition()); 1073 1074 // Manage marker callback 1075 bool markerReached = false; 1076 Modulo<uint32_t> markerPosition(mMarkerPosition); 1077 // FIXME fails for wraparound, need 64 bits 1078 if (!mMarkerReached && markerPosition.value() > 0 && position >= markerPosition) { 1079 mMarkerReached = markerReached = true; 1080 } 1081 1082 // Determine the number of new position callback(s) that will be needed, while locked 1083 size_t newPosCount = 0; 1084 Modulo<uint32_t> newPosition(mNewPosition); 1085 uint32_t updatePeriod = mUpdatePeriod; 1086 // FIXME fails for wraparound, need 64 bits 1087 if (updatePeriod > 0 && position >= newPosition) { 1088 newPosCount = ((position - newPosition).value() / updatePeriod) + 1; 1089 mNewPosition += updatePeriod * newPosCount; 1090 } 1091 1092 // Cache other fields that will be needed soon 1093 uint32_t notificationFrames = mNotificationFramesAct; 1094 if (mRefreshRemaining) { 1095 mRefreshRemaining = false; 1096 mRemainingFrames = notificationFrames; 1097 mRetryOnPartialBuffer = false; 1098 } 1099 size_t misalignment = mProxy->getMisalignment(); 1100 uint32_t sequence = mSequence; 1101 1102 // These fields don't need to be cached, because they are assigned only by set(): 1103 // mTransfer, mCbf, mUserData, mSampleRate, mFrameSize 1104 1105 mLock.unlock(); 1106 1107 // perform callbacks while unlocked 1108 if (newOverrun) { 1109 mCbf(EVENT_OVERRUN, mUserData, NULL); 1110 } 1111 if (markerReached) { 1112 mCbf(EVENT_MARKER, mUserData, &markerPosition); 1113 } 1114 while (newPosCount > 0) { 1115 size_t temp = newPosition.value(); // FIXME size_t != uint32_t 1116 mCbf(EVENT_NEW_POS, mUserData, &temp); 1117 newPosition += updatePeriod; 1118 newPosCount--; 1119 } 1120 if (mObservedSequence != sequence) { 1121 mObservedSequence = sequence; 1122 mCbf(EVENT_NEW_IAUDIORECORD, mUserData, NULL); 1123 } 1124 1125 // if inactive, then don't run me again until re-started 1126 if (!active) { 1127 return NS_INACTIVE; 1128 } 1129 1130 // Compute the estimated time until the next timed event (position, markers) 1131 uint32_t minFrames = ~0; 1132 if (!markerReached && position < markerPosition) { 1133 minFrames = (markerPosition - position).value(); 1134 } 1135 if (updatePeriod > 0) { 1136 uint32_t remaining = (newPosition - position).value(); 1137 if (remaining < minFrames) { 1138 minFrames = remaining; 1139 } 1140 } 1141 1142 // If > 0, poll periodically to recover from a stuck server. A good value is 2. 1143 static const uint32_t kPoll = 0; 1144 if (kPoll > 0 && mTransfer == TRANSFER_CALLBACK && kPoll * notificationFrames < minFrames) { 1145 minFrames = kPoll * notificationFrames; 1146 } 1147 1148 // Convert frame units to time units 1149 nsecs_t ns = NS_WHENEVER; 1150 if (minFrames != (uint32_t) ~0) { 1151 // This "fudge factor" avoids soaking CPU, and compensates for late progress by server 1152 static const nsecs_t kFudgeNs = 10000000LL; // 10 ms 1153 ns = ((minFrames * 1000000000LL) / mSampleRate) + kFudgeNs; 1154 } 1155 1156 // If not supplying data by EVENT_MORE_DATA, then we're done 1157 if (mTransfer != TRANSFER_CALLBACK) { 1158 return ns; 1159 } 1160 1161 struct timespec timeout; 1162 const struct timespec *requested = &ClientProxy::kForever; 1163 if (ns != NS_WHENEVER) { 1164 timeout.tv_sec = ns / 1000000000LL; 1165 timeout.tv_nsec = ns % 1000000000LL; 1166 ALOGV("%s(%d): timeout %ld.%03d", 1167 __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000); 1168 requested = &timeout; 1169 } 1170 1171 size_t readFrames = 0; 1172 while (mRemainingFrames > 0) { 1173 1174 Buffer audioBuffer; 1175 audioBuffer.frameCount = mRemainingFrames; 1176 size_t nonContig; 1177 status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig); 1178 LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0), 1179 "%s(%d): obtainBuffer() err=%d frameCount=%zu", 1180 __func__, mPortId, err, audioBuffer.frameCount); 1181 requested = &ClientProxy::kNonBlocking; 1182 size_t avail = audioBuffer.frameCount + nonContig; 1183 ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d", 1184 __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err); 1185 if (err != NO_ERROR) { 1186 if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR) { 1187 break; 1188 } 1189 ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.", 1190 __func__, mPortId, err); 1191 return NS_NEVER; 1192 } 1193 1194 if (mRetryOnPartialBuffer) { 1195 mRetryOnPartialBuffer = false; 1196 if (avail < mRemainingFrames) { 1197 int64_t myns = ((mRemainingFrames - avail) * 1198 1100000000LL) / mSampleRate; 1199 if (ns < 0 || myns < ns) { 1200 ns = myns; 1201 } 1202 return ns; 1203 } 1204 } 1205 1206 size_t reqSize = audioBuffer.size; 1207 mCbf(EVENT_MORE_DATA, mUserData, &audioBuffer); 1208 size_t readSize = audioBuffer.size; 1209 1210 // Sanity check on returned size 1211 if (ssize_t(readSize) < 0 || readSize > reqSize) { 1212 ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes", 1213 __func__, mPortId, reqSize, ssize_t(readSize)); 1214 return NS_NEVER; 1215 } 1216 1217 if (readSize == 0) { 1218 // The callback is done consuming buffers 1219 // Keep this thread going to handle timed events and 1220 // still try to provide more data in intervals of WAIT_PERIOD_MS 1221 // but don't just loop and block the CPU, so wait 1222 return WAIT_PERIOD_MS * 1000000LL; 1223 } 1224 1225 size_t releasedFrames = readSize / mFrameSize; 1226 audioBuffer.frameCount = releasedFrames; 1227 mRemainingFrames -= releasedFrames; 1228 if (misalignment >= releasedFrames) { 1229 misalignment -= releasedFrames; 1230 } else { 1231 misalignment = 0; 1232 } 1233 1234 releaseBuffer(&audioBuffer); 1235 readFrames += releasedFrames; 1236 1237 // FIXME here is where we would repeat EVENT_MORE_DATA again on same advanced buffer 1238 // if callback doesn't like to accept the full chunk 1239 if (readSize < reqSize) { 1240 continue; 1241 } 1242 1243 // There could be enough non-contiguous frames available to satisfy the remaining request 1244 if (mRemainingFrames <= nonContig) { 1245 continue; 1246 } 1247 1248 #if 0 1249 // This heuristic tries to collapse a series of EVENT_MORE_DATA that would total to a 1250 // sum <= notificationFrames. It replaces that series by at most two EVENT_MORE_DATA 1251 // that total to a sum == notificationFrames. 1252 if (0 < misalignment && misalignment <= mRemainingFrames) { 1253 mRemainingFrames = misalignment; 1254 return (mRemainingFrames * 1100000000LL) / mSampleRate; 1255 } 1256 #endif 1257 1258 } 1259 if (readFrames > 0) { 1260 AutoMutex lock(mLock); 1261 mFramesRead += readFrames; 1262 // mFramesReadTime = systemTime(SYSTEM_TIME_MONOTONIC); // not provided at this time. 1263 } 1264 mRemainingFrames = notificationFrames; 1265 mRetryOnPartialBuffer = true; 1266 1267 // A lot has transpired since ns was calculated, so run again immediately and re-calculate 1268 return 0; 1269 } 1270 1271 status_t AudioRecord::restoreRecord_l(const char *from) 1272 { 1273 ALOGW("%s(%d): dead IAudioRecord, creating a new one from %s()", __func__, mPortId, from); 1274 ++mSequence; 1275 1276 const int INITIAL_RETRIES = 3; 1277 int retries = INITIAL_RETRIES; 1278 retry: 1279 if (retries < INITIAL_RETRIES) { 1280 // refresh the audio configuration cache in this process to make sure we get new 1281 // input parameters and new IAudioRecord in createRecord_l() 1282 AudioSystem::clearAudioConfigCache(); 1283 } 1284 mFlags = mOrigFlags; 1285 1286 // if the new IAudioRecord is created, createRecord_l() will modify the 1287 // following member variables: mAudioRecord, mCblkMemory, mCblk, mBufferMemory. 1288 // It will also delete the strong references on previous IAudioRecord and IMemory 1289 Modulo<uint32_t> position(mProxy->getPosition()); 1290 mNewPosition = position + mUpdatePeriod; 1291 status_t result = createRecord_l(position, mOpPackageName); 1292 1293 if (result == NO_ERROR) { 1294 if (mActive) { 1295 // callback thread or sync event hasn't changed 1296 // FIXME this fails if we have a new AudioFlinger instance 1297 result = mAudioRecord->start( 1298 AudioSystem::SYNC_EVENT_SAME, AUDIO_SESSION_NONE).transactionError(); 1299 } 1300 mFramesReadServerOffset = mFramesRead; // server resets to zero so we need an offset. 1301 } 1302 1303 if (result != NO_ERROR) { 1304 ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries); 1305 if (--retries > 0) { 1306 // leave time for an eventual race condition to clear before retrying 1307 usleep(500000); 1308 goto retry; 1309 } 1310 // if no retries left, set invalid bit to force restoring at next occasion 1311 // and avoid inconsistent active state on client and server sides 1312 if (mCblk != nullptr) { 1313 android_atomic_or(CBLK_INVALID, &mCblk->mFlags); 1314 } 1315 } 1316 1317 return result; 1318 } 1319 1320 status_t AudioRecord::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback) 1321 { 1322 if (callback == 0) { 1323 ALOGW("%s(%d): adding NULL callback!", __func__, mPortId); 1324 return BAD_VALUE; 1325 } 1326 AutoMutex lock(mLock); 1327 if (mDeviceCallback.unsafe_get() == callback.get()) { 1328 ALOGW("%s(%d): adding same callback!", __func__, mPortId); 1329 return INVALID_OPERATION; 1330 } 1331 status_t status = NO_ERROR; 1332 if (mInput != AUDIO_IO_HANDLE_NONE) { 1333 if (mDeviceCallback != 0) { 1334 ALOGW("%s(%d): callback already present!", __func__, mPortId); 1335 AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId); 1336 } 1337 status = AudioSystem::addAudioDeviceCallback(this, mInput, mPortId); 1338 } 1339 mDeviceCallback = callback; 1340 return status; 1341 } 1342 1343 status_t AudioRecord::removeAudioDeviceCallback( 1344 const sp<AudioSystem::AudioDeviceCallback>& callback) 1345 { 1346 if (callback == 0) { 1347 ALOGW("%s(%d): removing NULL callback!", __func__, mPortId); 1348 return BAD_VALUE; 1349 } 1350 AutoMutex lock(mLock); 1351 if (mDeviceCallback.unsafe_get() != callback.get()) { 1352 ALOGW("%s(%d): removing different callback!", __func__, mPortId); 1353 return INVALID_OPERATION; 1354 } 1355 mDeviceCallback.clear(); 1356 if (mInput != AUDIO_IO_HANDLE_NONE) { 1357 AudioSystem::removeAudioDeviceCallback(this, mInput, mPortId); 1358 } 1359 return NO_ERROR; 1360 } 1361 1362 void AudioRecord::onAudioDeviceUpdate(audio_io_handle_t audioIo, 1363 audio_port_handle_t deviceId) 1364 { 1365 sp<AudioSystem::AudioDeviceCallback> callback; 1366 { 1367 AutoMutex lock(mLock); 1368 if (audioIo != mInput) { 1369 return; 1370 } 1371 callback = mDeviceCallback.promote(); 1372 // only update device if the record is active as route changes due to other use cases are 1373 // irrelevant for this client 1374 if (mActive) { 1375 mRoutedDeviceId = deviceId; 1376 } 1377 } 1378 if (callback.get() != nullptr) { 1379 callback->onAudioDeviceUpdate(mInput, mRoutedDeviceId); 1380 } 1381 } 1382 1383 // ------------------------------------------------------------------------- 1384 1385 status_t AudioRecord::getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones) 1386 { 1387 AutoMutex lock(mLock); 1388 return mAudioRecord->getActiveMicrophones(activeMicrophones).transactionError(); 1389 } 1390 1391 status_t AudioRecord::setPreferredMicrophoneDirection(audio_microphone_direction_t direction) 1392 { 1393 AutoMutex lock(mLock); 1394 if (mSelectedMicDirection == direction) { 1395 // NOP 1396 return OK; 1397 } 1398 1399 mSelectedMicDirection = direction; 1400 if (mAudioRecord == 0) { 1401 // the internal AudioRecord hasn't be created yet, so just stash the attribute. 1402 return OK; 1403 } else { 1404 return mAudioRecord->setPreferredMicrophoneDirection(direction).transactionError(); 1405 } 1406 } 1407 1408 status_t AudioRecord::setPreferredMicrophoneFieldDimension(float zoom) { 1409 AutoMutex lock(mLock); 1410 if (mSelectedMicFieldDimension == zoom) { 1411 // NOP 1412 return OK; 1413 } 1414 1415 mSelectedMicFieldDimension = zoom; 1416 if (mAudioRecord == 0) { 1417 // the internal AudioRecord hasn't be created yet, so just stash the attribute. 1418 return OK; 1419 } else { 1420 return mAudioRecord->setPreferredMicrophoneFieldDimension(zoom).transactionError(); 1421 } 1422 } 1423 1424 // ========================================================================= 1425 1426 void AudioRecord::DeathNotifier::binderDied(const wp<IBinder>& who __unused) 1427 { 1428 sp<AudioRecord> audioRecord = mAudioRecord.promote(); 1429 if (audioRecord != 0) { 1430 AutoMutex lock(audioRecord->mLock); 1431 audioRecord->mProxy->binderDied(); 1432 } 1433 } 1434 1435 // ========================================================================= 1436 1437 AudioRecord::AudioRecordThread::AudioRecordThread(AudioRecord& receiver) 1438 : Thread(true /* bCanCallJava */) // binder recursion on restoreRecord_l() may call Java. 1439 , mReceiver(receiver), mPaused(true), mPausedInt(false), mPausedNs(0LL), 1440 mIgnoreNextPausedInt(false) 1441 { 1442 } 1443 1444 AudioRecord::AudioRecordThread::~AudioRecordThread() 1445 { 1446 } 1447 1448 bool AudioRecord::AudioRecordThread::threadLoop() 1449 { 1450 { 1451 AutoMutex _l(mMyLock); 1452 if (mPaused) { 1453 // TODO check return value and handle or log 1454 mMyCond.wait(mMyLock); 1455 // caller will check for exitPending() 1456 return true; 1457 } 1458 if (mIgnoreNextPausedInt) { 1459 mIgnoreNextPausedInt = false; 1460 mPausedInt = false; 1461 } 1462 if (mPausedInt) { 1463 if (mPausedNs > 0) { 1464 // TODO check return value and handle or log 1465 (void) mMyCond.waitRelative(mMyLock, mPausedNs); 1466 } else { 1467 // TODO check return value and handle or log 1468 mMyCond.wait(mMyLock); 1469 } 1470 mPausedInt = false; 1471 return true; 1472 } 1473 } 1474 if (exitPending()) { 1475 return false; 1476 } 1477 nsecs_t ns = mReceiver.processAudioBuffer(); 1478 switch (ns) { 1479 case 0: 1480 return true; 1481 case NS_INACTIVE: 1482 pauseInternal(); 1483 return true; 1484 case NS_NEVER: 1485 return false; 1486 case NS_WHENEVER: 1487 // Event driven: call wake() when callback notifications conditions change. 1488 ns = INT64_MAX; 1489 FALLTHROUGH_INTENDED; 1490 default: 1491 LOG_ALWAYS_FATAL_IF(ns < 0, "%s() returned %lld", __func__, (long long)ns); 1492 pauseInternal(ns); 1493 return true; 1494 } 1495 } 1496 1497 void AudioRecord::AudioRecordThread::requestExit() 1498 { 1499 // must be in this order to avoid a race condition 1500 Thread::requestExit(); 1501 resume(); 1502 } 1503 1504 void AudioRecord::AudioRecordThread::pause() 1505 { 1506 AutoMutex _l(mMyLock); 1507 mPaused = true; 1508 } 1509 1510 void AudioRecord::AudioRecordThread::resume() 1511 { 1512 AutoMutex _l(mMyLock); 1513 mIgnoreNextPausedInt = true; 1514 if (mPaused || mPausedInt) { 1515 mPaused = false; 1516 mPausedInt = false; 1517 mMyCond.signal(); 1518 } 1519 } 1520 1521 void AudioRecord::AudioRecordThread::wake() 1522 { 1523 AutoMutex _l(mMyLock); 1524 if (!mPaused) { 1525 // wake() might be called while servicing a callback - ignore the next 1526 // pause time and call processAudioBuffer. 1527 mIgnoreNextPausedInt = true; 1528 if (mPausedInt && mPausedNs > 0) { 1529 // audio record is active and internally paused with timeout. 1530 mPausedInt = false; 1531 mMyCond.signal(); 1532 } 1533 } 1534 } 1535 1536 void AudioRecord::AudioRecordThread::pauseInternal(nsecs_t ns) 1537 { 1538 AutoMutex _l(mMyLock); 1539 mPausedInt = true; 1540 mPausedNs = ns; 1541 } 1542 1543 // ------------------------------------------------------------------------- 1544 1545 } // namespace android 1546