diff options
| author | 2010-01-27 14:21:20 -0800 | |
|---|---|---|
| committer | 2010-01-27 14:21:20 -0800 | |
| commit | 0ebff76e95aab7f6827ce1a8c25f1b4ad87a9029 (patch) | |
| tree | 877df1054ffe46b509da0d7ac1ade93e854e8714 /libs/audioflinger/AudioFlinger.cpp | |
| parent | e6dca5c29b569ec245c665341bd8794abf6a02e9 (diff) | |
| parent | 0986e7907ffc8387b04fb201e285784bcd11b9b7 (diff) | |
Merge "Fix issue 2285561: New AudioFlinger and audio driver API needed for A/V sync"
Diffstat (limited to 'libs/audioflinger/AudioFlinger.cpp')
| -rw-r--r-- | libs/audioflinger/AudioFlinger.cpp | 33 | 
1 files changed, 31 insertions, 2 deletions
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp index 5c58603fae12..cad420a9b153 100644 --- a/libs/audioflinger/AudioFlinger.cpp +++ b/libs/audioflinger/AudioFlinger.cpp @@ -633,6 +633,20 @@ status_t AudioFlinger::setVoiceVolume(float value)      return ret;  } +status_t AudioFlinger::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) +{ +    status_t status; + +    Mutex::Autolock _l(mLock); + +    PlaybackThread *playbackThread = checkPlaybackThread_l(output); +    if (playbackThread != NULL) { +        return playbackThread->getRenderPosition(halFrames, dspFrames); +    } + +    return BAD_VALUE; +} +  void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client)  { @@ -1166,6 +1180,19 @@ void AudioFlinger::PlaybackThread::readOutputParameters()      memset(mMixBuffer, 0, mFrameCount * 2 * sizeof(int16_t));  } +status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames) +{ +    if (halFrames == 0 || dspFrames == 0) { +        return BAD_VALUE; +    } +    if (mOutput == 0) { +        return INVALID_OPERATION; +    } +    *halFrames = mBytesWritten/mOutput->frameSize(); + +    return mOutput->getRenderPosition(dspFrames); +} +  // ----------------------------------------------------------------------------  AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id) @@ -1290,8 +1317,9 @@ bool AudioFlinger::MixerThread::threadLoop()          if (sleepTime == 0) {              mLastWriteTime = systemTime();              mInWrite = true; +            mBytesWritten += mixBufferSize;              int bytesWritten = (int)mOutput->write(curBuf, mixBufferSize); -            if (bytesWritten > 0) mBytesWritten += bytesWritten; +            if (bytesWritten < 0) mBytesWritten -= mixBufferSize;              mNumWrites++;              mInWrite = false;              nsecs_t now = systemTime(); @@ -1812,8 +1840,9 @@ bool AudioFlinger::DirectOutputThread::threadLoop()          if (sleepTime == 0) {              mLastWriteTime = systemTime();              mInWrite = true; +            mBytesWritten += mixBufferSize;              int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize); -            if (bytesWritten) mBytesWritten += bytesWritten; +            if (bytesWritten < 0) mBytesWritten -= mixBufferSize;              mNumWrites++;              mInWrite = false;              mStandby = false;  |