Loading include/private/media/AudioTrackShared.h +3 −35 Original line number Diff line number Diff line Loading @@ -119,11 +119,8 @@ struct AudioTrackSharedStatic { typedef SingleStateQueue<AudioPlaybackRate> PlaybackRateQueue; typedef SingleStateQueue<ExtendedTimestamp> ExtendedTimestampQueue; typedef SingleStateQueue<AudioTimestamp> TimestampQueue; // ---------------------------------------------------------------------------- // Important: do not add any virtual methods, including ~ Loading Loading @@ -178,9 +175,7 @@ private: uint16_t mPad2; // unused // server write-only, client read ExtendedTimestampQueue::Shared mExtendedTimestampQueue; // capture TimestampQueue::Shared mTimestampQueue; // playback ExtendedTimestampQueue::Shared mExtendedTimestampQueue; public: volatile int32_t mFlags; // combinations of CBLK_* Loading Loading @@ -338,10 +333,7 @@ public: size_t frameSize, bool clientInServer = false) : ClientProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/, clientInServer), mPlaybackRateMutator(&cblk->mPlaybackRateQueue), mTimestampObserver(&cblk->mTimestampQueue) { } mPlaybackRateMutator(&cblk->mPlaybackRateQueue) { } virtual ~AudioTrackClientProxy() { } // No barriers on the following operations, so the ordering of loads/stores Loading @@ -365,20 +357,6 @@ public: mPlaybackRateMutator.push(playbackRate); } status_t getTimestamp(AudioTimestamp *timestamp) { if (timestamp == nullptr) { return BAD_VALUE; } (void) mTimestampObserver.poll(mTimestamp); // if no data is pushed by server, mTimestamp should be initialized by its constructor // to all zero elements. if (mTimestamp.mTime.tv_sec == 0 && mTimestamp.mTime.tv_nsec == 0) { return WOULD_BLOCK; } *timestamp = mTimestamp; return OK; } virtual void flush(); virtual uint32_t getUnderrunFrames() const { Loading @@ -396,8 +374,6 @@ public: private: PlaybackRateQueue::Mutator mPlaybackRateMutator; TimestampQueue::Observer mTimestampObserver; AudioTimestamp mTimestamp; }; class StaticAudioTrackClientProxy : public AudioTrackClientProxy { Loading Loading @@ -546,8 +522,7 @@ public: size_t frameSize, bool clientInServer = false, uint32_t sampleRate = 0) : ServerProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/, clientInServer), mPlaybackRateObserver(&cblk->mPlaybackRateQueue), mUnderrunCount(0), mUnderrunning(false), mTimestampMutator(&cblk->mTimestampQueue) { mUnderrunCount(0), mUnderrunning(false) { mCblk->mSampleRate = sampleRate; mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT; } Loading Loading @@ -587,11 +562,6 @@ public: // Return the playback speed and pitch read atomically. Not multi-thread safe on server side. AudioPlaybackRate getPlaybackRate(); // Expose timestamp to client proxy. Should only be called by a single thread. void setTimestamp(const AudioTimestamp ×tamp) { mTimestampMutator.push(timestamp); } private: AudioPlaybackRate mPlaybackRate; // last observed playback rate PlaybackRateQueue::Observer mPlaybackRateObserver; Loading @@ -599,8 +569,6 @@ private: // The server keeps a copy here where it is safe from the client. uint32_t mUnderrunCount; // echoed to mCblk bool mUnderrunning; // used to detect edge of underrun TimestampQueue::Mutator mTimestampMutator; }; class StaticAudioTrackServerProxy : public AudioTrackServerProxy { Loading media/libmedia/AudioTrack.cpp +6 −4 Original line number Diff line number Diff line Loading @@ -2169,6 +2169,11 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) // Set false here to cover all the error return cases. mPreviousTimestampValid = false; // FIXME not implemented for fast tracks; should use proxy and SSQ if (mFlags & AUDIO_OUTPUT_FLAG_FAST) { return INVALID_OPERATION; } switch (mState) { case STATE_ACTIVE: case STATE_PAUSED: Loading Loading @@ -2198,10 +2203,7 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) // The presented frame count must always lag behind the consumed frame count. // To avoid a race, read the presented frames first. This ensures that presented <= consumed. // FastTrack timestamps are read through shared memory; otherwise use Binder. status_t status = (mFlags & AUDIO_OUTPUT_FLAG_FAST) ? mProxy->getTimestamp(×tamp) : mAudioTrack->getTimestamp(timestamp); status_t status = mAudioTrack->getTimestamp(timestamp); if (status != NO_ERROR) { ALOGV_IF(status != WOULD_BLOCK, "getTimestamp error:%#x", status); return status; Loading services/audioflinger/PlaybackTracks.h +0 −1 Original line number Diff line number Diff line Loading @@ -89,7 +89,6 @@ protected: // ExtendedAudioBufferProvider interface virtual size_t framesReady() const; virtual size_t framesReleased() const; virtual void onTimestamp(const AudioTimestamp ×tamp); bool isPausing() const { return mState == PAUSING; } bool isPaused() const { return mState == PAUSED; } Loading services/audioflinger/Tracks.cpp +1 −6 Original line number Diff line number Diff line Loading @@ -596,11 +596,6 @@ size_t AudioFlinger::PlaybackThread::Track::framesReleased() const return mAudioTrackServerProxy->framesReleased(); } void AudioFlinger::PlaybackThread::Track::onTimestamp(const AudioTimestamp ×tamp) { mAudioTrackServerProxy->setTimestamp(timestamp); } // Don't call for fast tracks; the framesReady() could result in priority inversion bool AudioFlinger::PlaybackThread::Track::isReady() const { if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) { Loading Loading @@ -863,7 +858,7 @@ status_t AudioFlinger::PlaybackThread::Track::setParameters(const String8& keyVa status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp) { // FastTrack timestamps are read through SSQ // Client should implement this using SSQ; the unpresented frame count in latch is irrelevant if (isFastTrack()) { return INVALID_OPERATION; } Loading Loading
include/private/media/AudioTrackShared.h +3 −35 Original line number Diff line number Diff line Loading @@ -119,11 +119,8 @@ struct AudioTrackSharedStatic { typedef SingleStateQueue<AudioPlaybackRate> PlaybackRateQueue; typedef SingleStateQueue<ExtendedTimestamp> ExtendedTimestampQueue; typedef SingleStateQueue<AudioTimestamp> TimestampQueue; // ---------------------------------------------------------------------------- // Important: do not add any virtual methods, including ~ Loading Loading @@ -178,9 +175,7 @@ private: uint16_t mPad2; // unused // server write-only, client read ExtendedTimestampQueue::Shared mExtendedTimestampQueue; // capture TimestampQueue::Shared mTimestampQueue; // playback ExtendedTimestampQueue::Shared mExtendedTimestampQueue; public: volatile int32_t mFlags; // combinations of CBLK_* Loading Loading @@ -338,10 +333,7 @@ public: size_t frameSize, bool clientInServer = false) : ClientProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/, clientInServer), mPlaybackRateMutator(&cblk->mPlaybackRateQueue), mTimestampObserver(&cblk->mTimestampQueue) { } mPlaybackRateMutator(&cblk->mPlaybackRateQueue) { } virtual ~AudioTrackClientProxy() { } // No barriers on the following operations, so the ordering of loads/stores Loading @@ -365,20 +357,6 @@ public: mPlaybackRateMutator.push(playbackRate); } status_t getTimestamp(AudioTimestamp *timestamp) { if (timestamp == nullptr) { return BAD_VALUE; } (void) mTimestampObserver.poll(mTimestamp); // if no data is pushed by server, mTimestamp should be initialized by its constructor // to all zero elements. if (mTimestamp.mTime.tv_sec == 0 && mTimestamp.mTime.tv_nsec == 0) { return WOULD_BLOCK; } *timestamp = mTimestamp; return OK; } virtual void flush(); virtual uint32_t getUnderrunFrames() const { Loading @@ -396,8 +374,6 @@ public: private: PlaybackRateQueue::Mutator mPlaybackRateMutator; TimestampQueue::Observer mTimestampObserver; AudioTimestamp mTimestamp; }; class StaticAudioTrackClientProxy : public AudioTrackClientProxy { Loading Loading @@ -546,8 +522,7 @@ public: size_t frameSize, bool clientInServer = false, uint32_t sampleRate = 0) : ServerProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/, clientInServer), mPlaybackRateObserver(&cblk->mPlaybackRateQueue), mUnderrunCount(0), mUnderrunning(false), mTimestampMutator(&cblk->mTimestampQueue) { mUnderrunCount(0), mUnderrunning(false) { mCblk->mSampleRate = sampleRate; mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT; } Loading Loading @@ -587,11 +562,6 @@ public: // Return the playback speed and pitch read atomically. Not multi-thread safe on server side. AudioPlaybackRate getPlaybackRate(); // Expose timestamp to client proxy. Should only be called by a single thread. void setTimestamp(const AudioTimestamp ×tamp) { mTimestampMutator.push(timestamp); } private: AudioPlaybackRate mPlaybackRate; // last observed playback rate PlaybackRateQueue::Observer mPlaybackRateObserver; Loading @@ -599,8 +569,6 @@ private: // The server keeps a copy here where it is safe from the client. uint32_t mUnderrunCount; // echoed to mCblk bool mUnderrunning; // used to detect edge of underrun TimestampQueue::Mutator mTimestampMutator; }; class StaticAudioTrackServerProxy : public AudioTrackServerProxy { Loading
media/libmedia/AudioTrack.cpp +6 −4 Original line number Diff line number Diff line Loading @@ -2169,6 +2169,11 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) // Set false here to cover all the error return cases. mPreviousTimestampValid = false; // FIXME not implemented for fast tracks; should use proxy and SSQ if (mFlags & AUDIO_OUTPUT_FLAG_FAST) { return INVALID_OPERATION; } switch (mState) { case STATE_ACTIVE: case STATE_PAUSED: Loading Loading @@ -2198,10 +2203,7 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp) // The presented frame count must always lag behind the consumed frame count. // To avoid a race, read the presented frames first. This ensures that presented <= consumed. // FastTrack timestamps are read through shared memory; otherwise use Binder. status_t status = (mFlags & AUDIO_OUTPUT_FLAG_FAST) ? mProxy->getTimestamp(×tamp) : mAudioTrack->getTimestamp(timestamp); status_t status = mAudioTrack->getTimestamp(timestamp); if (status != NO_ERROR) { ALOGV_IF(status != WOULD_BLOCK, "getTimestamp error:%#x", status); return status; Loading
services/audioflinger/PlaybackTracks.h +0 −1 Original line number Diff line number Diff line Loading @@ -89,7 +89,6 @@ protected: // ExtendedAudioBufferProvider interface virtual size_t framesReady() const; virtual size_t framesReleased() const; virtual void onTimestamp(const AudioTimestamp ×tamp); bool isPausing() const { return mState == PAUSING; } bool isPaused() const { return mState == PAUSED; } Loading
services/audioflinger/Tracks.cpp +1 −6 Original line number Diff line number Diff line Loading @@ -596,11 +596,6 @@ size_t AudioFlinger::PlaybackThread::Track::framesReleased() const return mAudioTrackServerProxy->framesReleased(); } void AudioFlinger::PlaybackThread::Track::onTimestamp(const AudioTimestamp ×tamp) { mAudioTrackServerProxy->setTimestamp(timestamp); } // Don't call for fast tracks; the framesReady() could result in priority inversion bool AudioFlinger::PlaybackThread::Track::isReady() const { if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) { Loading Loading @@ -863,7 +858,7 @@ status_t AudioFlinger::PlaybackThread::Track::setParameters(const String8& keyVa status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp) { // FastTrack timestamps are read through SSQ // Client should implement this using SSQ; the unpresented frame count in latch is irrelevant if (isFastTrack()) { return INVALID_OPERATION; } Loading