#include "snd_main.h"
-#define NB_PERIODS 2
+#define NB_PERIODS 4
static snd_pcm_t* pcm_handle = NULL;
static snd_pcm_sframes_t expected_delay = 0;
Con_Print ("SndSys_Init: using the ALSA module\n");
seq_name = NULL;
+// COMMANDLINEOPTION: Linux ALSA Sound: -sndseqin <client>:<port> selects which sequencer port to use for input, by default no sequencer port is used (MIDI note events from that port get mapped to MIDINOTE<n> keys that can be bound)
i = COM_CheckParm ("-sndseqin"); // TODO turn this into a cvar, maybe
if (i != 0 && i < com_argc - 1)
seq_name = com_argv[i + 1];
pcm_name = "default";
break;
}
-// COMMANDLINEOPTION: Linux ALSA Sound: -sndpcm <devicename> selects which pcm device to us, default is "default"
+// COMMANDLINEOPTION: Linux ALSA Sound: -sndpcm <devicename> selects which pcm device to use, default is "default"
i = COM_CheckParm ("-sndpcm");
if (i != 0 && i < com_argc - 1)
pcm_name = com_argv[i + 1];
goto init_error;
}
- 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)
{
goto init_error;
}
+ // 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)
written = snd_pcm_writei (pcm_handle, buffer, nbframes);
if (written < 0)
{
- if (developer.integer >= 1000 && vid_activewindow)
- Con_Printf ("SndSys_Write: audio write returned %ld (%s)!\n",
+ if (developer_insane.integer && vid_activewindow)
+ Con_DPrintf ("SndSys_Write: audio write returned %ld (%s)!\n",
written, snd_strerror (written));
if (SndSys_Recover (written))
err = snd_pcm_delay (pcm_handle, &delay);
if (err < 0)
{
- if (developer.integer >= 1000 && vid_activewindow)
+ if (developer_insane.integer && vid_activewindow)
Con_DPrintf ("SndSys_GetSoundTime: can't get playback delay (%s)\n",
snd_strerror (err));