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

Commit 9bf34d54 authored by Glenn Kasten's avatar Glenn Kasten
Browse files

Limit notification period when a fast track denied

If client requests a fast track and this request is denied, then don't
allow notification period to exceed FMS_20.  FMS_20 is the minimum task
wakeup period in ms for which CFS operates reliably.  This reduces
glitching when an app uses a buffer size that is too small for the endpoint.
The theory is that if the app wanted a fast track but couldn't get it,
then at least wake it up as often as possible (while still not waking
up so often than CFS can't handle it).

Also clarify in the log when the denial is by client vs server.

Test: as described in bug
Bug: 63040475
Change-Id: I2c171bda7929a8f309c2286d868e09887680d234
parent 55c45b33
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -1379,14 +1379,14 @@ status_t AudioTrack::createTrack_l()

        bool useCaseAllowed = sharedBuffer || transferAllowed;
        if (!useCaseAllowed) {
            ALOGW("AUDIO_OUTPUT_FLAG_FAST denied, not shared buffer and transfer = %s",
            ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client, not shared buffer and transfer = %s",
                  convertTransferToText(mTransfer));
        }

        // sample rates must also match
        bool sampleRateAllowed = mSampleRate == mAfSampleRate;
        if (!sampleRateAllowed) {
            ALOGW("AUDIO_OUTPUT_FLAG_FAST denied, rates do not match %u Hz, require %u Hz",
            ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client, sample rate %u Hz but HAL needs %u Hz",
                  mSampleRate, mAfSampleRate);
        }

@@ -1562,6 +1562,15 @@ status_t AudioTrack::createTrack_l()
            // or at least triple-buffering if there is sample rate conversion
            const int nBuffering = mOriginalSampleRate == mAfSampleRate ? 2 : 3;
            maxNotificationFrames = frameCount / nBuffering;
            // If client requested a fast track but this was denied, then use the smaller maximum.
            // FMS_20 is the minimum task wakeup period in ms for which CFS operates reliably.
#define FMS_20 20   // FIXME share a common declaration with the same symbol in Threads.cpp
            if (mOrigFlags & AUDIO_OUTPUT_FLAG_FAST) {
                size_t maxNotificationFramesFastDenied = FMS_20 * mSampleRate / 1000;
                if (maxNotificationFrames > maxNotificationFramesFastDenied) {
                    maxNotificationFrames = maxNotificationFramesFastDenied;
                }
            }
        }
        if (mNotificationFramesAct == 0 || mNotificationFramesAct > maxNotificationFrames) {
            if (mNotificationFramesAct == 0) {