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

Commit 8296c252 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

Move PlaybackThread::Track::writeFrames to PatchRecord

This code logically belongs to PatchRecord because it emulates
obtaining recorded data from a client.

Test: make
Change-Id: Icba4e33d9d0ca57e6ad964aaf3209e7db766f284
parent e3cdab3c
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -266,8 +266,6 @@ protected:


private:
private:
    void                interceptBuffer(const AudioBufferProvider::Buffer& buffer);
    void                interceptBuffer(const AudioBufferProvider::Buffer& buffer);
    /** Write the source data in the buffer provider. @return written frame count. */
    size_t              writeFrames(AudioBufferProvider* dest, const void* src, size_t frameCount);
    template <class F>
    template <class F>
    void                forEachTeePatchTrack(F f) {
    void                forEachTeePatchTrack(F f) {
        for (auto& tp : mTeePatches) { f(tp.patchTrack); }
        for (auto& tp : mTeePatches) { f(tp.patchTrack); }
+10 −0
Original line number Original line Diff line number Diff line
@@ -175,4 +175,14 @@ public:
    virtual status_t    obtainBuffer(Proxy::Buffer *buffer,
    virtual status_t    obtainBuffer(Proxy::Buffer *buffer,
                                     const struct timespec *timeOut = NULL);
                                     const struct timespec *timeOut = NULL);
    virtual void        releaseBuffer(Proxy::Buffer *buffer);
    virtual void        releaseBuffer(Proxy::Buffer *buffer);

    size_t writeFrames(const void* src, size_t frameCount, size_t frameSize) {
        return writeFrames(this, src, frameCount, frameSize);
    }

private:
    /** Write the source data into the buffer provider. @return written frame count. */
    static size_t writeFrames(AudioBufferProvider* dest, const void* src,
            size_t frameCount, size_t frameSize);

};  // end of PatchRecord
};  // end of PatchRecord
+36 −30
Original line number Original line Diff line number Diff line
@@ -823,16 +823,9 @@ void AudioFlinger::PlaybackThread::Track::interceptBuffer(
    }
    }
    for (auto& teePatch : mTeePatches) {
    for (auto& teePatch : mTeePatches) {
        RecordThread::PatchRecord* patchRecord = teePatch.patchRecord.get();
        RecordThread::PatchRecord* patchRecord = teePatch.patchRecord.get();

        const size_t framesWritten = patchRecord->writeFrames(
        size_t framesWritten = writeFrames(patchRecord, sourceBuffer.i8, frameCount);
                sourceBuffer.i8, frameCount, mFrameSize);
        // On buffer wrap, the buffer frame count will be less than requested,
        const size_t framesLeft = frameCount - framesWritten;
        // when this happens a second buffer needs to be used to write the leftover audio
        size_t framesLeft = frameCount - framesWritten;
        if (framesWritten != 0 && framesLeft != 0) {
            framesWritten +=
                writeFrames(patchRecord, sourceBuffer.i8 + framesWritten * mFrameSize, framesLeft);
            framesLeft = frameCount - framesWritten;
        }
        ALOGW_IF(framesLeft != 0, "%s(%d) PatchRecord %d can not provide big enough "
        ALOGW_IF(framesLeft != 0, "%s(%d) PatchRecord %d can not provide big enough "
                 "buffer %zu/%zu, dropping %zu frames", __func__, mId, patchRecord->mId,
                 "buffer %zu/%zu, dropping %zu frames", __func__, mId, patchRecord->mId,
                 framesWritten, frameCount, framesLeft);
                 framesWritten, frameCount, framesLeft);
@@ -844,26 +837,6 @@ void AudioFlinger::PlaybackThread::Track::interceptBuffer(
             spent.count(), mTeePatches.size());
             spent.count(), mTeePatches.size());
}
}


size_t AudioFlinger::PlaybackThread::Track::writeFrames(AudioBufferProvider* dest,
                                                        const void* src,
                                                        size_t frameCount) {
    AudioBufferProvider::Buffer patchBuffer;
    patchBuffer.frameCount = frameCount;
    auto status = dest->getNextBuffer(&patchBuffer);
    if (status != NO_ERROR) {
       ALOGW("%s PathRecord getNextBuffer failed with error %d: %s",
             __func__, status, strerror(-status));
       return 0;
    }
    ALOG_ASSERT(patchBuffer.frameCount <= frameCount);
    memcpy(patchBuffer.raw, src, patchBuffer.frameCount * mFrameSize);
    auto framesWritten = patchBuffer.frameCount;
    dest->releaseBuffer(&patchBuffer);
    return framesWritten;
}

// releaseBuffer() is not overridden

// ExtendedAudioBufferProvider interface
// ExtendedAudioBufferProvider interface


// framesReady() may return an approximation of the number of frames if called
// framesReady() may return an approximation of the number of frames if called
@@ -2405,6 +2378,39 @@ AudioFlinger::RecordThread::PatchRecord::~PatchRecord()
    ALOGV("%s(%d)", __func__, mId);
    ALOGV("%s(%d)", __func__, mId);
}
}


static size_t writeFramesHelper(
        AudioBufferProvider* dest, const void* src, size_t frameCount, size_t frameSize)
{
    AudioBufferProvider::Buffer patchBuffer;
    patchBuffer.frameCount = frameCount;
    auto status = dest->getNextBuffer(&patchBuffer);
    if (status != NO_ERROR) {
       ALOGW("%s PathRecord getNextBuffer failed with error %d: %s",
             __func__, status, strerror(-status));
       return 0;
    }
    ALOG_ASSERT(patchBuffer.frameCount <= frameCount);
    memcpy(patchBuffer.raw, src, patchBuffer.frameCount * frameSize);
    size_t framesWritten = patchBuffer.frameCount;
    dest->releaseBuffer(&patchBuffer);
    return framesWritten;
}

// static
size_t AudioFlinger::RecordThread::PatchRecord::writeFrames(
        AudioBufferProvider* dest, const void* src, size_t frameCount, size_t frameSize)
{
    size_t framesWritten = writeFramesHelper(dest, src, frameCount, frameSize);
    // On buffer wrap, the buffer frame count will be less than requested,
    // when this happens a second buffer needs to be used to write the leftover audio
    const size_t framesLeft = frameCount - framesWritten;
    if (framesWritten != 0 && framesLeft != 0) {
        framesWritten += writeFramesHelper(dest, (const char*)src + framesWritten * frameSize,
                        framesLeft, frameSize);
    }
    return framesWritten;
}

// AudioBufferProvider interface
// AudioBufferProvider interface
status_t AudioFlinger::RecordThread::PatchRecord::getNextBuffer(
status_t AudioFlinger::RecordThread::PatchRecord::getNextBuffer(
                                                  AudioBufferProvider::Buffer* buffer)
                                                  AudioBufferProvider::Buffer* buffer)