diff options
author | Glenn Kasten <gkasten@google.com> | 2014-02-27 13:34:29 -0800 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2014-02-27 13:34:29 -0800 |
commit | c6ba823a397abf865b02f4f48fe18231f94d8e87 (patch) | |
tree | dcb8d8bb9f8c03bcf921184c9833862003e70f54 /media | |
parent | 8897759002677a7072a51a7f0b7cc63761c5f2d4 (diff) | |
download | frameworks_av-c6ba823a397abf865b02f4f48fe18231f94d8e87.zip frameworks_av-c6ba823a397abf865b02f4f48fe18231f94d8e87.tar.gz frameworks_av-c6ba823a397abf865b02f4f48fe18231f94d8e87.tar.bz2 |
Make openRecord_l more like createTrack_l for fast tracks: part 1
Use the transfer mode to distinguish use cases, as the presence of
a callback handler is not sufficient. For example, the track could be
configured for synchronous transfer with write() or read(), and also
have a callback handler for position updates. But that does not mean
the track can operate in fast track mode.
Change-Id: I2a7f1f0ca98e68efe180b524496985109d8ce291
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 30 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 4 |
2 files changed, 23 insertions, 11 deletions
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 4438dfd..28daf16 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -430,18 +430,30 @@ status_t AudioRecord::openRecord_l(size_t epoch) return NO_INIT; } - IAudioFlinger::track_flags_t trackFlags = IAudioFlinger::TRACK_DEFAULT; - pid_t tid = -1; + // Fast tracks must be at the primary _output_ [sic] sampling rate, + // because there is currently no concept of a primary input sampling rate + uint32_t afSampleRate = AudioSystem::getPrimaryOutputSamplingRate(); + if (afSampleRate == 0) { + ALOGW("getPrimaryOutputSamplingRate failed"); + } // Client can only express a preference for FAST. Server will perform additional tests. - // The only supported use case for FAST is callback transfer mode. + if ((mFlags & AUDIO_INPUT_FLAG_FAST) && !( + // use case: callback transfer mode + (mTransfer == TRANSFER_CALLBACK) && + // matching sample rate + (mSampleRate == afSampleRate))) { + ALOGW("AUDIO_INPUT_FLAG_FAST denied by client"); + // once denied, do not request again if IAudioRecord is re-created + mFlags = (audio_input_flags_t) (mFlags & ~AUDIO_INPUT_FLAG_FAST); + } + + IAudioFlinger::track_flags_t trackFlags = IAudioFlinger::TRACK_DEFAULT; + + pid_t tid = -1; if (mFlags & AUDIO_INPUT_FLAG_FAST) { - if ((mTransfer != TRANSFER_CALLBACK) || (mAudioRecordThread == 0)) { - ALOGW("AUDIO_INPUT_FLAG_FAST denied by client"); - // once denied, do not request again if IAudioRecord is re-created - mFlags = (audio_input_flags_t) (mFlags & ~AUDIO_INPUT_FLAG_FAST); - } else { - trackFlags |= IAudioFlinger::TRACK_FAST; + trackFlags |= IAudioFlinger::TRACK_FAST; + if (mAudioRecordThread != 0) { tid = mAudioRecordThread->getTid(); } } diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index adf3847..c79b2c8 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -892,8 +892,8 @@ status_t AudioTrack::createTrack_l(size_t epoch) // either of these use cases: // use case 1: shared buffer (mSharedBuffer != 0) || - // use case 2: callback handler - (mCbf != NULL)) && + // use case 2: callback transfer mode + (mTransfer == TRANSFER_CALLBACK)) && // matching sample rate (mSampleRate == afSampleRate))) { ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client"); |