From dc63f3fe40a242c70d84c492c8c5f945b2269762 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 5 Mar 2012 17:27:11 -0800 Subject: MediaPlayerService: fix AudioSink latency The AudioSink latency is currently cached when the associated AudioTrack is created. However, the AudioTrack latency can change if the AudioTrack is moved from one output stream to another. The AudioPlayer must also periodically update its view of the latency as it is needed to compensate the real audio time used for A/V sync. This fixes an A/V sync problem seen when switching A2DP on and off while playing a video. Change-Id: I28b24049ca114e1af3e24791dcc900f463536ba4 Conflicts: media/libmediaplayerservice/MediaPlayerService.cpp --- media/libmediaplayerservice/MediaPlayerService.cpp | 7 +++---- media/libmediaplayerservice/MediaPlayerService.h | 1 - media/libstagefright/AudioPlayer.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index e8d0f0c14075..f27d3d6c4189 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -320,7 +320,7 @@ status_t MediaPlayerService::AudioOutput::dump(int fd, const Vector& a mStreamType, mLeftVolume, mRightVolume); result.append(buffer); snprintf(buffer, 255, " msec per frame(%f), latency (%d)\n", - mMsecsPerFrame, mLatency); + mMsecsPerFrame, (mTrack != 0) ? mTrack->latency() : -1); result.append(buffer); snprintf(buffer, 255, " aux effect id(%d), send level (%f)\n", mAuxEffectId, mSendLevel); @@ -1265,7 +1265,6 @@ MediaPlayerService::AudioOutput::AudioOutput(int sessionId) mStreamType = AUDIO_STREAM_MUSIC; mLeftVolume = 1.0; mRightVolume = 1.0; - mLatency = 0; mMsecsPerFrame = 0; mAuxEffectId = 0; mSendLevel = 0.0; @@ -1324,7 +1323,8 @@ ssize_t MediaPlayerService::AudioOutput::frameSize() const uint32_t MediaPlayerService::AudioOutput::latency () const { - return mLatency; + if (mTrack == 0) return 0; + return mTrack->latency(); } float MediaPlayerService::AudioOutput::msecsPerFrame() const @@ -1403,7 +1403,6 @@ status_t MediaPlayerService::AudioOutput::open( t->setVolume(mLeftVolume, mRightVolume); mMsecsPerFrame = 1.e3 / (float) sampleRate; - mLatency = t->latency(); mTrack = t; t->setAuxEffectSendLevel(mSendLevel); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 04d9e28e1199..b04fddb59a8b 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -112,7 +112,6 @@ class MediaPlayerService : public BnMediaPlayerService float mLeftVolume; float mRightVolume; float mMsecsPerFrame; - uint32_t mLatency; int mSessionId; float mSendLevel; int mAuxEffectId; diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 2581a62eca44..f4fb556bde44 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -408,6 +408,12 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { break; } + if (mAudioSink != NULL) { + mLatencyUs = (int64_t)mAudioSink->latency() * 1000; + } else { + mLatencyUs = (int64_t)mAudioTrack->latency() * 1000; + } + CHECK(mInputBuffer->meta_data()->findInt64( kKeyTime, &mPositionTimeMediaUs)); -- cgit v1.2.3-59-g8ed1b