alsa: don't override libasound's buffer_time and period_time
ALSA does a good job measuring its buffer_time and period_time. Don't override its defaults, unless the user demands it.
This commit is contained in:
parent
bcc443a8aa
commit
dd7711d86c
@ -25,11 +25,6 @@
|
|||||||
|
|
||||||
static const char default_device[] = "default";
|
static const char default_device[] = "default";
|
||||||
|
|
||||||
#define MPD_ALSA_BUFFER_TIME_US 500000
|
|
||||||
/* the default period time of xmms is 50 ms, so let's use that as well.
|
|
||||||
* a user can tweak this parameter via the "period_time" config parameter.
|
|
||||||
*/
|
|
||||||
#define MPD_ALSA_PERIOD_TIME_US 50000
|
|
||||||
#define MPD_ALSA_RETRY_NR 5
|
#define MPD_ALSA_RETRY_NR 5
|
||||||
|
|
||||||
#include "../utils.h"
|
#include "../utils.h"
|
||||||
@ -58,8 +53,8 @@ static AlsaData *newAlsaData(void)
|
|||||||
ret->pcmHandle = NULL;
|
ret->pcmHandle = NULL;
|
||||||
ret->writei = snd_pcm_writei;
|
ret->writei = snd_pcm_writei;
|
||||||
ret->useMmap = 0;
|
ret->useMmap = 0;
|
||||||
ret->buffer_time = MPD_ALSA_BUFFER_TIME_US;
|
ret->buffer_time = 0;
|
||||||
ret->period_time = MPD_ALSA_PERIOD_TIME_US;
|
ret->period_time = 0;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -219,23 +214,27 @@ configure_hw:
|
|||||||
}
|
}
|
||||||
audioFormat->sample_rate = sample_rate;
|
audioFormat->sample_rate = sample_rate;
|
||||||
|
|
||||||
|
if (ad->buffer_time > 0) {
|
||||||
buffer_time = ad->buffer_time;
|
buffer_time = ad->buffer_time;
|
||||||
cmd = "snd_pcm_hw_params_set_buffer_time_near";
|
cmd = "snd_pcm_hw_params_set_buffer_time_near";
|
||||||
err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
|
err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
|
||||||
&buffer_time, NULL);
|
&buffer_time, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (period_time_ro > 0) {
|
||||||
period_time = period_time_ro;
|
period_time = period_time_ro;
|
||||||
cmd = "snd_pcm_hw_params_set_period_time_near";
|
cmd = "snd_pcm_hw_params_set_period_time_near";
|
||||||
err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
|
err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
|
||||||
&period_time, NULL);
|
&period_time, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
cmd = "snd_pcm_hw_params";
|
cmd = "snd_pcm_hw_params";
|
||||||
err = snd_pcm_hw_params(ad->pcmHandle, hwparams);
|
err = snd_pcm_hw_params(ad->pcmHandle, hwparams);
|
||||||
if (err == -EPIPE && --retry > 0) {
|
if (err == -EPIPE && --retry > 0 && period_time_ro > 0) {
|
||||||
period_time_ro = period_time_ro >> 1;
|
period_time_ro = period_time_ro >> 1;
|
||||||
goto configure_hw;
|
goto configure_hw;
|
||||||
} else if (err < 0)
|
} else if (err < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user