diff options
author | Eric Laurent <elaurent@google.com> | 2014-02-07 17:03:31 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-02-07 17:03:32 +0000 |
commit | d9a4783985203c759ddcca784798ef395668fe05 (patch) | |
tree | 69faaa1bffd16d23216630c04c80ae42a23dba9f /services | |
parent | c9583cba9913682e1c181675c6d0066292fb719d (diff) | |
parent | 7844f679be8d94c5cdf017f53754cb68ee2f00da (diff) | |
download | frameworks_av-d9a4783985203c759ddcca784798ef395668fe05.zip frameworks_av-d9a4783985203c759ddcca784798ef395668fe05.tar.gz frameworks_av-d9a4783985203c759ddcca784798ef395668fe05.tar.bz2 |
Merge "AudioFlinger: Modify flush handling for offload path"
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/PlaybackTracks.h | 3 | ||||
-rw-r--r-- | services/audioflinger/Threads.cpp | 27 | ||||
-rw-r--r-- | services/audioflinger/Threads.h | 2 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 14 |
4 files changed, 31 insertions, 15 deletions
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h index 4b6c74d..6600161 100644 --- a/services/audioflinger/PlaybackTracks.h +++ b/services/audioflinger/PlaybackTracks.h @@ -94,6 +94,8 @@ protected: bool isReady() const; void setPaused() { mState = PAUSED; } void reset(); + bool isFlushPending() const { return mFlushHwPending; } + void flushAck(); bool isOutputTrack() const { return (mStreamType == AUDIO_STREAM_CNT); @@ -155,6 +157,7 @@ private: bool mIsInvalid; // non-resettable latch, set by invalidate() AudioTrackServerProxy* mAudioTrackServerProxy; bool mResumeToStopping; // track was paused in stopping state. + bool mFlushHwPending; // track requests for thread flush }; // end of Track class TimedTrack : public Track { diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 00d14e8..cecb3dc 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -2727,12 +2727,6 @@ void AudioFlinger::MixerThread::threadLoop_standby() PlaybackThread::threadLoop_standby(); } -// Empty implementation for standard mixer -// Overridden for offloaded playback -void AudioFlinger::PlaybackThread::flushOutput_l() -{ -} - bool AudioFlinger::PlaybackThread::waitingAsyncCallback_l() { return false; @@ -4003,6 +3997,17 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr sp<Track> l = mLatestActiveTrack.promote(); bool last = l.get() == track; + if (track->isInvalid()) { + ALOGW("An invalidated track shouldn't be in active list"); + tracksToRemove->add(track); + continue; + } + + if (track->mState == TrackBase::IDLE) { + ALOGW("An idle track shouldn't be in active list"); + continue; + } + if (track->isPausing()) { track->setPaused(); if (last) { @@ -4021,6 +4026,11 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr mBytesRemaining = 0; // stop writing } tracksToRemove->add(track); + } else if (track->isFlushPending()) { + track->flushAck(); + if (last) { + mFlushPending = true; + } } else if (track->framesReady() && track->isReady() && !track->isPaused() && !track->isTerminated() && !track->isStopping_2()) { ALOGVV("OffloadThread: track %d s=%08x [OK]", track->name(), cblk->mServer); @@ -4161,11 +4171,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr return mixerStatus; } -void AudioFlinger::OffloadThread::flushOutput_l() -{ - mFlushPending = true; -} - // must be called with thread mutex locked bool AudioFlinger::OffloadThread::waitingAsyncCallback_l() { diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index 4700c0a..4deea9a 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -631,7 +631,6 @@ public: protected: // accessed by both binder threads and within threadLoop(), lock on mutex needed unsigned mFastTrackAvailMask; // bit i set if fast track [i] is available - virtual void flushOutput_l(); private: // timestamp latch: @@ -750,7 +749,6 @@ protected: // threadLoop snippets virtual mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove); virtual void threadLoop_exit(); - virtual void flushOutput_l(); virtual bool waitingAsyncCallback(); virtual bool waitingAsyncCallback_l(); diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index ecedca9..8ffa43e 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -347,7 +347,8 @@ AudioFlinger::PlaybackThread::Track::Track( mCachedVolume(1.0), mIsInvalid(false), mAudioTrackServerProxy(NULL), - mResumeToStopping(false) + mResumeToStopping(false), + mFlushHwPending(false) { if (mCblk != NULL) { if (sharedBuffer == 0) { @@ -731,6 +732,7 @@ void AudioFlinger::PlaybackThread::Track::flush() mRetryCount = PlaybackThread::kMaxTrackRetriesOffload; } + mFlushHwPending = true; mResumeToStopping = false; } else { if (mState != STOPPING_1 && mState != STOPPING_2 && mState != STOPPED && @@ -751,11 +753,19 @@ void AudioFlinger::PlaybackThread::Track::flush() // Prevent flush being lost if the track is flushed and then resumed // before mixer thread can run. This is important when offloading // because the hardware buffer could hold a large amount of audio - playbackThread->flushOutput_l(); playbackThread->broadcast_l(); } } +// must be called with thread lock held +void AudioFlinger::PlaybackThread::Track::flushAck() +{ + if (!isOffloaded()) + return; + + mFlushHwPending = false; +} + void AudioFlinger::PlaybackThread::Track::reset() { // Do not reset twice to avoid discarding data written just after a flush and before |