summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/AudioPlayer.h1
-rw-r--r--media/libstagefright/AudioPlayer.cpp34
-rw-r--r--media/libstagefright/codecs/aacdec/SoftAAC2.cpp6
3 files changed, 30 insertions, 11 deletions
diff --git a/include/media/stagefright/AudioPlayer.h b/include/media/stagefright/AudioPlayer.h
index a94b16e..1dc408f 100644
--- a/include/media/stagefright/AudioPlayer.h
+++ b/include/media/stagefright/AudioPlayer.h
@@ -100,6 +100,7 @@ private:
bool mAllowDeepBuffering; // allow audio deep audio buffers. Helps with low power audio
// playback but implies high latency
AwesomePlayer *mObserver;
+ int64_t mPinnedTimeUs;
static void AudioCallback(int event, void *user, void *info);
void AudioCallback(int event, void *info);
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index f729a78..6b1be1f 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -54,7 +54,8 @@ AudioPlayer::AudioPlayer(
mFirstBuffer(NULL),
mAudioSink(audioSink),
mAllowDeepBuffering(allowDeepBuffering),
- mObserver(observer) {
+ mObserver(observer),
+ mPinnedTimeUs(-1ll) {
}
AudioPlayer::~AudioPlayer() {
@@ -141,9 +142,10 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) {
mFirstBuffer = NULL;
}
- if (!sourceAlreadyStarted) {
- mSource->stop();
- }
+ // At this point, source already got started
+ // Stop the source when error is found.
+ mSource->stop();
+ mSource = NULL;
return err;
}
@@ -173,9 +175,9 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) {
mFirstBuffer = NULL;
}
- if (!sourceAlreadyStarted) {
- mSource->stop();
- }
+ // At this point, source already got started
+ // Stop the source when error is found.
+ mSource->stop();
return err;
}
@@ -187,6 +189,7 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) {
}
mStarted = true;
+ mPinnedTimeUs = -1ll;
return OK;
}
@@ -209,6 +212,8 @@ void AudioPlayer::pause(bool playPendingSamples) {
} else {
mAudioTrack->pause();
}
+
+ mPinnedTimeUs = ALooper::GetNowUs();
}
}
@@ -490,6 +495,12 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
mNumFramesPlayed += size_done / mFrameSize;
mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
+
+ if (mReachedEOS) {
+ mPinnedTimeUs = mNumFramesPlayedSysTimeUs;
+ } else {
+ mPinnedTimeUs = -1ll;
+ }
}
if (postEOS) {
@@ -516,7 +527,14 @@ int64_t AudioPlayer::getRealTimeUsLocked() const {
// Compensate for large audio buffers, updates of mNumFramesPlayed
// are less frequent, therefore to get a "smoother" notion of time we
// compensate using system time.
- int64_t diffUs = ALooper::GetNowUs() - mNumFramesPlayedSysTimeUs;
+ int64_t diffUs;
+ if (mPinnedTimeUs >= 0ll) {
+ diffUs = mPinnedTimeUs;
+ } else {
+ diffUs = ALooper::GetNowUs();
+ }
+
+ diffUs -= mNumFramesPlayedSysTimeUs;
return result + diffUs;
}
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
index b0d305b..4000686 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
@@ -177,11 +177,11 @@ OMX_ERRORTYPE SoftAAC2::internalGetParameter(
} else {
pcmParams->nChannels = mStreamInfo->numChannels;
pcmParams->nSamplingRate = mStreamInfo->sampleRate;
+ ALOGI("Sampling rate: %lu, channels: %lu",
+ pcmParams->nSamplingRate,
+ pcmParams->nChannels);
}
- if (!pcmParams->nChannels) ALOGW("Audio contains 0 channels");
- if (!pcmParams->nSamplingRate) ALOGW("Sampling rate of 0 Hz");
-
return OMX_ErrorNone;
}