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

Commit b46f394a authored by Glenn Kasten's avatar Glenn Kasten
Browse files

AudioTrack::obtainBuffer() now returns number of non-contiguous frames

Change-Id: I1f61d7e3d057c3254babe456b4aa0f6a1809da55
parent 54a8a456
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -495,6 +495,13 @@ public:
     * After filling these slots with data, the caller should release them with releaseBuffer().
     * If the track buffer is not full, obtainBuffer() returns as many contiguous
     * [empty slots for] frames as are available immediately.
     *
     * If nonContig is non-NULL, it is an output parameter that will be set to the number of
     * additional non-contiguous frames that are predicted to be available immediately,
     * if the client were to release the first frames and then call obtainBuffer() again.
     * This value is only a prediction, and needs to be confirmed.
     * It will be set to zero for an error return.
     *
     * If the track buffer is full and track is stopped, obtainBuffer() returns WOULD_BLOCK
     * regardless of the value of waitCount.
     * If the track buffer is full and track is not stopped, obtainBuffer() blocks with a
@@ -526,14 +533,17 @@ public:
     *  size        actual number of bytes available
     *  raw         pointer to the buffer
     */

    /* FIXME Deprecated public API for TRANSFER_OBTAIN mode */
            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount,
                                size_t *nonContig = NULL)
                                __attribute__((__deprecated__));

private:
    /* If nonContig is non-NULL, it is an output parameter that will be set to the number of
     * additional non-contiguous frames that are available immediately.
     * additional non-contiguous frames that are predicted to be available immediately,
     * if the client were to release the first frames and then call obtainBuffer() again.
     * This value is only a prediction, and needs to be confirmed.
     * It will be set to zero for an error return.
     * FIXME We could pass an array of Buffers instead of only one Buffer to obtainBuffer(),
     * in case the requested amount of frames is in two or more non-contiguous regions.
     * FIXME requested and elapsed are both relative times.  Consider changing to absolute time.
+2 −2
Original line number Diff line number Diff line
@@ -1236,7 +1236,7 @@ release:
    return status;
}

status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_t *nonContig)
{
    if (audioBuffer == NULL) {
        return BAD_VALUE;
@@ -1263,7 +1263,7 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
        ALOGE("%s invalid waitCount %d", __func__, waitCount);
        requested = NULL;
    }
    return obtainBuffer(audioBuffer, requested);
    return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig);
}

status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, const struct timespec *requested,