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

Commit 620208dc authored by Chris Elliott's avatar Chris Elliott
Browse files

audio: prevent larger than required sleeps - DO NOT MERGE

This will be cherry picked into P build after O completes for other devices.

This reverts the revert from commit 2feb18dd.

b/17962037

From: Haynes Mathew George <hgeorge@codeaurora.org>
Date: Wed, 26 Mar 2014 16:18:42 -0700
Subject: [PATCH] AudioTrack: prevent larger than required sleeps

AudioTrackThread can end up waiting for larger than necessary
time for free space to be available in the cblk. Fix this by
waiting on the cblk futex instead of the (internal) condition variable.

Change-Id: Iba5b266f9b4082b3833f4abd52ebc6601c8e3034
parent 2feb18dd
Loading
Loading
Loading
Loading
+21 −1
Original line number Original line Diff line number Diff line
@@ -18,15 +18,21 @@


//#define LOG_NDEBUG 0
//#define LOG_NDEBUG 0
#define LOG_TAG "AudioTrack"
#define LOG_TAG "AudioTrack"
#define ATRACE_TAG ATRACE_TAG_AUDIO


#include <sys/resource.h>
#include <sys/resource.h>
#include <audio_utils/primitives.h>
#include <audio_utils/primitives.h>
#include <binder/IPCThreadState.h>
#include <binder/IPCThreadState.h>
#include <media/AudioTrack.h>
#include <media/AudioTrack.h>
#include <utils/Log.h>
#include <utils/Log.h>
#include <utils/Trace.h>
#include <private/media/AudioTrackShared.h>
#include <private/media/AudioTrackShared.h>
#include <media/IAudioFlinger.h>
#include <media/IAudioFlinger.h>


extern "C" {
#include "../private/bionic_futex.h"
}

#define WAIT_PERIOD_MS                  10
#define WAIT_PERIOD_MS                  10
#define WAIT_STREAM_END_TIMEOUT_SEC     120
#define WAIT_STREAM_END_TIMEOUT_SEC     120


@@ -1606,7 +1612,21 @@ nsecs_t AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
                if (ns < 0 || myns < ns) {
                if (ns < 0 || myns < ns) {
                    ns = myns;
                    ns = myns;
                }
                }
                return ns;
                int32_t old = android_atomic_and(~CBLK_FUTEX_WAKE, &mCblk->mFutex);
                char str[64] = {0};
                struct timespec ts;

                snprintf(str, sizeof(str), "futex_wait timeout %lld Us", ns/1000LL);

                ATRACE_BEGIN(str);
                ts.tv_sec = 0;
                ts.tv_nsec = ns;
                // wait for max ns allowing server to wake us up if possible
                int ret = __futex_syscall4(&mCblk->mFutex,
                                           FUTEX_WAIT,
                                           old & ~CBLK_FUTEX_WAKE, &ts);
                ATRACE_END();
                return 0; //retry immediately as space (possibly) became available
            }
            }
        }
        }