We are currently migrating Bugzilla to GitHub issues.
Any changes made to the bug tracker now will be lost, so please do not post new bugs or make changes to them.
When we're done, all bug URLs will redirect to their equivalent location on the new bug tracker.

Bug 4156

Summary: Refactored ALSA backend code to prevent generating hardware parameters with an excessive number of periods
Product: SDL Reporter: Anthony Pesch <inolen>
Component: audioAssignee: Ryan C. Gordon <icculus>
Status: RESOLVED FIXED QA Contact: Sam Lantinga <slouken>
Severity: major    
Priority: P2    
Version: HG 2.1   
Hardware: x86_64   
OS: Linux   
Attachments: patch

Description Anthony Pesch 2018-05-05 01:48:27 UTC
The previous code attempted to use set_buffer_size / set_period_size discretely,
    favoring the parameters which generated a buffer size that was exactly 2x the
    requested buffer size. This solution ultimately prioritizes only the buffer size,
    which comes at a large performance cost on some machines where this results in
    an excessive number of periods. In my case, for a 4096 sample buffer, this
    configured the device to use 37 periods with a period size of 221 samples and a
    buffer size of 8192 samples. With 37 periods, the SDL Audio thread was consuming
    25% of the CPU.
    
    This code has been refactored to use set_period_size and set_buffer_size together.
    set_period_size is called first to attempt to set the period to exactly match the
    requested buffer size, and set_buffer_size is called second to further refine the
    parameters to attempt to use only 2 periods. The fundamental change here is that
    the period size / count won't go to extreme values if the buffer size can't be
    exactly matched, the buffer size should instead just increase to the next closest
    multiple of the target period size that is supported. After changing this, for a
    4096 sample buffer, the device is configured to use 3 periods with a period size
    of 4096 samples and a buffer size of 12288 samples. With only 3 periods, the SDL
    Audio thread doesn't even show up when profiling.
Comment 1 Anthony Pesch 2018-05-05 01:49:56 UTC
Created attachment 3237 [details]
patch
Comment 2 Anthony Pesch 2018-05-05 01:57:22 UTC
Sorry for the malformed comment, it was copied and pasted from the diff. Please just read the comment in the diff directly.
Comment 3 Sam Lantinga 2018-05-05 17:38:48 UTC
This seems reasonable. Ryan, can you review and apply this if it looks good?
Comment 4 Ryan C. Gordon 2018-05-06 02:08:13 UTC
Going to test this on a Raspberry Pi and a desktop Linux box first, but this looks like a good patch from here.

--ryan.
Comment 5 Ryan C. Gordon 2018-06-25 05:50:48 UTC
Okay, tried this on a desktop and a Raspberry Pi, and it's solid. This patch is now https://hg.libsdl.org/SDL/rev/b6c4568cc10b, thanks!

--ryan.