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

Commit 720ad9dd authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioTrack non-blocking write

Bug 7531968

Change-Id: I6d0e79fa8cab5b6eb36bcc34977f4cf0d7eec8ea
parent 56df9ff3
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -556,8 +556,11 @@ public:
     *      WOULD_BLOCK         when obtainBuffer() returns same, or
     *                          AudioTrack was stopped during the write
     *      or any other error code returned by IAudioTrack::start() or restoreTrack_l().
     * Default behavior is to only return until all data has been transferred. Set 'blocking' to
     * false for the method to return immediately without waiting to try multiple times to write
     * the full content of the buffer.
     */
            ssize_t     write(const void* buffer, size_t size);
            ssize_t     write(const void* buffer, size_t size, bool blocking = true);

    /*
     * Dumps the state of an audio track.
+3 −2
Original line number Diff line number Diff line
@@ -1270,7 +1270,7 @@ void AudioTrack::releaseBuffer(Buffer* audioBuffer)

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

ssize_t AudioTrack::write(const void* buffer, size_t userSize)
ssize_t AudioTrack::write(const void* buffer, size_t userSize, bool blocking)
{
    if (mTransfer != TRANSFER_SYNC || mIsTimed) {
        return INVALID_OPERATION;
@@ -1289,7 +1289,8 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize)
    while (userSize >= mFrameSize) {
        audioBuffer.frameCount = userSize / mFrameSize;

        status_t err = obtainBuffer(&audioBuffer, &ClientProxy::kForever);
        status_t err = obtainBuffer(&audioBuffer,
                blocking ? &ClientProxy::kForever : &ClientProxy::kNonBlocking);
        if (err < 0) {
            if (written > 0) {
                break;