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