Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9ed2721 authored by Eric Laurent's avatar Eric Laurent
Browse files

Fix issue 2285561: New AudioFlinger and audio driver API needed for A/V sync

Added getRenderPosition() API to IAudioFlinger to retreive number of audio frames
written by AudioFlinger to audio HAL and by DSP to DAC.

Added getRenderPosition() API to AudioHardwareInterface to retreive number of audio frames
written by DSP to DAC.

Exposed AudioTrack::getPosition() to AudioSink() to make it available to media player.

Removed excessive log in AudioHardwareGeneric.
parent 26ae5b2f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -457,4 +457,10 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::dump(int fd, const Vector<Strin
    return NO_ERROR;
}

status_t A2dpAudioInterface::A2dpAudioStreamOut::getRenderPosition(uint32_t *driverFrames)
{
    //TODO: enable when supported by driver
    return INVALID_OPERATION;
}

}; // namespace android
+1 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ private:
        virtual status_t    dump(int fd, const Vector<String16>& args);
        virtual status_t    setParameters(const String8& keyValuePairs);
        virtual String8     getParameters(const String8& keys);
        virtual status_t    getRenderPosition(uint32_t *dspFrames);

    private:
        friend class A2dpAudioInterface;
+6 −0
Original line number Diff line number Diff line
@@ -379,6 +379,12 @@ void AudioStreamOutDump::Close()
    }
}

status_t AudioStreamOutDump::getRenderPosition(uint32_t *dspFrames)
{
    if (mFinalStream != 0 ) return mFinalStream->getRenderPosition(dspFrames);
    return INVALID_OPERATION;
}

// ----------------------------------------------------------------------------

AudioStreamInDump::AudioStreamInDump(AudioDumpInterface *interface,
+2 −1
Original line number Diff line number Diff line
@@ -56,8 +56,9 @@ public:
    void                Close(void);
    AudioStreamOut*     finalStream() { return mFinalStream; }
    uint32_t            device() { return mDevice; }

    int                 getId()  { return mId; }
    virtual status_t    getRenderPosition(uint32_t *dspFrames);

private:
    AudioDumpInterface *mInterface;
    int                  mId;
+31 −2
Original line number Diff line number Diff line
@@ -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;
Loading