request a power of 2 buffer size in ALSA (maybe better compatibility)
thanks to Diablo-D3 for a patch I based this functionality on
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9268
d7cf8633-e32d-0410-b094-
e92efae38249
static snd_pcm_t* pcm_handle = NULL;
static snd_pcm_sframes_t expected_delay = 0;
static snd_pcm_t* pcm_handle = NULL;
static snd_pcm_sframes_t expected_delay = 0;
- buffer_size = requested->speed / 5;
+ // pick a buffer size that is a power of 2 (by masking off low bits)
+ buffer_size = i = (int)(requested->speed * 0.15f);
+ while (buffer_size & (buffer_size-1))
+ buffer_size &= (buffer_size-1);
+ // then check if it is the nearest power of 2 and bump it up if not
+ if (i - buffer_size >= buffer_size >> 1)
+ buffer_size *= 2;
+
err = snd_pcm_hw_params_set_buffer_size_near (pcm_handle, hw_params, &buffer_size);
if (err < 0)
{
err = snd_pcm_hw_params_set_buffer_size_near (pcm_handle, hw_params, &buffer_size);
if (err < 0)
{
+ // pick a period size near the buffer_size we got from ALSA
+ snd_pcm_hw_params_get_buffer_size (hw_params, &buffer_size);
buffer_size /= NB_PERIODS;
err = snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, &buffer_size, 0);
if (err < 0)
buffer_size /= NB_PERIODS;
err = snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, &buffer_size, 0);
if (err < 0)