Loading services/audioflinger/AudioFlinger.cpp +16 −1 Original line number Diff line number Diff line Loading @@ -1804,11 +1804,25 @@ Exit: return track; } uint32_t AudioFlinger::MixerThread::correctLatency(uint32_t latency) const { if (mFastMixer != NULL) { MonoPipe *pipe = (MonoPipe *)mPipeSink.get(); latency += (pipe->getAvgFrames() * 1000) / mSampleRate; } return latency; } uint32_t AudioFlinger::PlaybackThread::correctLatency(uint32_t latency) const { return latency; } uint32_t AudioFlinger::PlaybackThread::latency() const { Mutex::Autolock _l(mLock); if (initCheck() == NO_ERROR) { return mOutput->stream->get_latency(mOutput->stream); return correctLatency(mOutput->stream->get_latency(mOutput->stream)); } else { return 0; } Loading Loading @@ -2020,6 +2034,7 @@ void AudioFlinger::PlaybackThread::readOutputParameters() } } status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames) { if (halFrames == NULL || dspFrames == NULL) { Loading services/audioflinger/AudioFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -1048,6 +1048,8 @@ public: // Cache various calculated values, at threadLoop() entry and after a parameter change virtual void cacheParameters_l(); virtual uint32_t correctLatency(uint32_t latency) const; private: friend class AudioFlinger; // for numerous Loading Loading @@ -1154,6 +1156,7 @@ public: virtual void threadLoop_mix(); virtual void threadLoop_sleepTime(); virtual void threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove); virtual uint32_t correctLatency(uint32_t latency) const; AudioMixer* mAudioMixer; // normal mixer private: Loading services/audioflinger/MonoPipe.h +4 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ public: virtual ssize_t write(const void *buffer, size_t count); //virtual ssize_t writeVia(writeVia_t via, size_t total, void *user, size_t block); // average number of frames present in the pipe under normal conditions. // See throttling mechanism in MonoPipe::write() size_t getAvgFrames() const { return (mMaxFrames * 11) / 16; } private: const size_t mMaxFrames; // always a power of 2 void * const mBuffer; Loading Loading
services/audioflinger/AudioFlinger.cpp +16 −1 Original line number Diff line number Diff line Loading @@ -1804,11 +1804,25 @@ Exit: return track; } uint32_t AudioFlinger::MixerThread::correctLatency(uint32_t latency) const { if (mFastMixer != NULL) { MonoPipe *pipe = (MonoPipe *)mPipeSink.get(); latency += (pipe->getAvgFrames() * 1000) / mSampleRate; } return latency; } uint32_t AudioFlinger::PlaybackThread::correctLatency(uint32_t latency) const { return latency; } uint32_t AudioFlinger::PlaybackThread::latency() const { Mutex::Autolock _l(mLock); if (initCheck() == NO_ERROR) { return mOutput->stream->get_latency(mOutput->stream); return correctLatency(mOutput->stream->get_latency(mOutput->stream)); } else { return 0; } Loading Loading @@ -2020,6 +2034,7 @@ void AudioFlinger::PlaybackThread::readOutputParameters() } } status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames) { if (halFrames == NULL || dspFrames == NULL) { Loading
services/audioflinger/AudioFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -1048,6 +1048,8 @@ public: // Cache various calculated values, at threadLoop() entry and after a parameter change virtual void cacheParameters_l(); virtual uint32_t correctLatency(uint32_t latency) const; private: friend class AudioFlinger; // for numerous Loading Loading @@ -1154,6 +1156,7 @@ public: virtual void threadLoop_mix(); virtual void threadLoop_sleepTime(); virtual void threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove); virtual uint32_t correctLatency(uint32_t latency) const; AudioMixer* mAudioMixer; // normal mixer private: Loading
services/audioflinger/MonoPipe.h +4 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ public: virtual ssize_t write(const void *buffer, size_t count); //virtual ssize_t writeVia(writeVia_t via, size_t total, void *user, size_t block); // average number of frames present in the pipe under normal conditions. // See throttling mechanism in MonoPipe::write() size_t getAvgFrames() const { return (mMaxFrames * 11) / 16; } private: const size_t mMaxFrames; // always a power of 2 void * const mBuffer; Loading