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