aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/alsa.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2010-02-08 17:42:44 -0800
committerChris Robinson <[email protected]>2010-02-08 17:42:44 -0800
commit96303893bc981ba9b52799d4cd67f2becab9e127 (patch)
treedadd451a8fa4d27243641f6c66fc35678394d184 /Alc/alsa.c
parenta329f9c84a154340a61accf5713db522f0a6cf00 (diff)
Set ALSA playback buffer and period size based on time
So rate adjustments won't modify the latency
Diffstat (limited to 'Alc/alsa.c')
-rw-r--r--Alc/alsa.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/Alc/alsa.c b/Alc/alsa.c
index f95dfb2a..fd82375b 100644
--- a/Alc/alsa.c
+++ b/Alc/alsa.c
@@ -68,6 +68,8 @@ MAKE_FUNC(snd_pcm_hw_params_set_periods_near);
MAKE_FUNC(snd_pcm_hw_params_set_rate_near);
MAKE_FUNC(snd_pcm_hw_params_set_rate);
MAKE_FUNC(snd_pcm_hw_params_set_rate_resample);
+MAKE_FUNC(snd_pcm_hw_params_set_buffer_time_near);
+MAKE_FUNC(snd_pcm_hw_params_set_period_time_near);
MAKE_FUNC(snd_pcm_hw_params_set_buffer_size_near);
MAKE_FUNC(snd_pcm_hw_params_set_period_size_near);
MAKE_FUNC(snd_pcm_hw_params_set_buffer_size_min);
@@ -163,6 +165,8 @@ LOAD_FUNC(snd_pcm_hw_params_set_periods_near);
LOAD_FUNC(snd_pcm_hw_params_set_rate_near);
LOAD_FUNC(snd_pcm_hw_params_set_rate);
LOAD_FUNC(snd_pcm_hw_params_set_rate_resample);
+LOAD_FUNC(snd_pcm_hw_params_set_buffer_time_near);
+LOAD_FUNC(snd_pcm_hw_params_set_period_time_near);
LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_near);
LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_min);
LOAD_FUNC(snd_pcm_hw_params_set_period_size_near);
@@ -512,7 +516,7 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
{
alsa_data *data = (alsa_data*)device->ExtraData;
snd_pcm_uframes_t periodSizeInFrames;
- snd_pcm_uframes_t bufferSizeInFrames;
+ unsigned int periodLen, bufferLen;
snd_pcm_sw_params_t *sp = NULL;
snd_pcm_hw_params_t *p = NULL;
snd_pcm_access_t access;
@@ -542,7 +546,7 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
allowmmap = GetConfigValueBool("alsa", "mmap", 1);
periods = device->NumUpdates;
- periodSizeInFrames = device->UpdateSize;
+ periodLen = (ALuint64)device->UpdateSize * 1000000 / device->Frequency;
rate = device->Frequency;
err = NULL;
@@ -625,13 +629,13 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
/* set rate (implicitly constrains period/buffer parameters) */
if(i >= 0 && (i=psnd_pcm_hw_params_set_rate_near(data->pcmHandle, p, &rate, NULL)) < 0)
err = "set rate near";
- /* set buffer size (implicitly constrains period/buffer parameters) */
- bufferSizeInFrames = periodSizeInFrames * periods;
- if(i >= 0 && (i=psnd_pcm_hw_params_set_buffer_size_near(data->pcmHandle, p, &bufferSizeInFrames)) < 0)
- err = "set buffer size near";
- /* set period size in frame units (implicitly sets buffer size/bytes/time and period time/bytes) */
- if(i >= 0 && (i=psnd_pcm_hw_params_set_period_size_near(data->pcmHandle, p, &periodSizeInFrames, NULL)) < 0)
- err = "set period size near";
+ /* set buffer time (implicitly constrains period/buffer parameters) */
+ bufferLen = periodLen * periods;
+ if(i >= 0 && (i=psnd_pcm_hw_params_set_buffer_time_near(data->pcmHandle, p, &bufferLen, NULL)) < 0)
+ err = "set buffer time near";
+ /* set period time in frame units (implicitly sets buffer size/bytes/time and period size/bytes) */
+ if(i >= 0 && (i=psnd_pcm_hw_params_set_period_time_near(data->pcmHandle, p, &periodLen, NULL)) < 0)
+ err = "set period time near";
/* install and prepare hardware configuration */
if(i >= 0 && (i=psnd_pcm_hw_params(data->pcmHandle, p)) < 0)
err = "set params";