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

Commit 2550f855 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

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

parents fded9268 e9ed2721
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