From 082830f92373a1b9e512dbbfb940187ffa1c2c6f Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 30 Aug 2012 10:56:14 -0700 Subject: Prepare for transmitting audio through AudioSource. AudioSource can now be configured to output buffers timestamped based on looper time (absolute) instead of based on systemTime() relative to start time. Change-Id: I8eca42648eb50033ac4aafbe5daac64a98a40690 --- media/libstagefright/AudioSource.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'media/libstagefright/AudioSource.cpp') diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp index ed142a4..3248dbc 100644 --- a/media/libstagefright/AudioSource.cpp +++ b/media/libstagefright/AudioSource.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -33,7 +34,7 @@ static void AudioRecordCallbackFunction(int event, void *user, void *info) { AudioSource *source = (AudioSource *) user; switch (event) { case AudioRecord::EVENT_MORE_DATA: { - source->dataCallbackTimestamp(*((AudioRecord::Buffer *) info), systemTime() / 1000); + source->dataCallback(*((AudioRecord::Buffer *) info)); break; } case AudioRecord::EVENT_OVERRUN: { @@ -53,7 +54,8 @@ AudioSource::AudioSource( mSampleRate(sampleRate), mPrevSampleTimeUs(0), mNumFramesReceived(0), - mNumClientOwnedBuffers(0) { + mNumClientOwnedBuffers(0), + mUseLooperTime(false) { ALOGV("sampleRate: %d, channelCount: %d", sampleRate, channelCount); CHECK(channelCount == 1 || channelCount == 2); @@ -100,6 +102,12 @@ status_t AudioSource::initCheck() const { return mInitCheck; } +void AudioSource::setUseLooperTime(bool useLooperTime) { + CHECK(!mStarted); + + mUseLooperTime = useLooperTime; +} + status_t AudioSource::start(MetaData *params) { Mutex::Autolock autoLock(mLock); if (mStarted) { @@ -271,8 +279,10 @@ void AudioSource::signalBufferReturned(MediaBuffer *buffer) { return; } -status_t AudioSource::dataCallbackTimestamp( - const AudioRecord::Buffer& audioBuffer, int64_t timeUs) { +status_t AudioSource::dataCallback(const AudioRecord::Buffer& audioBuffer) { + int64_t timeUs = + mUseLooperTime ? ALooper::GetNowUs() : (systemTime() / 1000ll); + ALOGV("dataCallbackTimestamp: %lld us", timeUs); Mutex::Autolock autoLock(mLock); if (!mStarted) { @@ -290,12 +300,15 @@ status_t AudioSource::dataCallbackTimestamp( if (mNumFramesReceived == 0 && mPrevSampleTimeUs == 0) { mInitialReadTimeUs = timeUs; // Initial delay - if (mStartTimeUs > 0) { + if (mUseLooperTime) { + mStartTimeUs = timeUs; + } else if (mStartTimeUs > 0) { mStartTimeUs = timeUs - mStartTimeUs; } else { // Assume latency is constant. mStartTimeUs += mRecord->latency() * 1000; } + mPrevSampleTimeUs = mStartTimeUs; } -- cgit v1.1