aboutsummaryrefslogtreecommitdiffstats
path: root/src/output
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-03-08 03:55:01 +0100
committerMax Kellermann <max@duempel.org>2009-03-08 03:55:01 +0100
commit554a34fb958cfa15c00a81671a72079cae00ca5f (patch)
treed1679a457a676b1dc836c1aa8da111df109aae69 /src/output
parent27193d84026dca7dce8e864da5a703e203347cdc (diff)
downloadmpd-554a34fb958cfa15c00a81671a72079cae00ca5f.tar.gz
mpd-554a34fb958cfa15c00a81671a72079cae00ca5f.tar.xz
mpd-554a34fb958cfa15c00a81671a72079cae00ca5f.zip
alsa: better period_time default value for high sample rates
The default values for buffer_time and period_time were both capped by the hardware limits on practically all chips. The result was a period_time which was half as big as the buffer_time. On some chips, this led to lots of underruns when using a high sample rate (192 kHz), because MPD had very little time to send new samples to ALSA. A period time which is one fourth of the buffer time turned out to be much better. If no period_time is configured, see how much buffer_time the hardware accepts, and try to configure one fourth of it as period_time, instead of hard-coding the default period_time value. This is yet another attempt to provide a solution which is valid for all sound chips. Using the SND_PCM_NONBLOCK flag also seemed to solve the underruns, but put a lot more CPU load to MPD.
Diffstat (limited to 'src/output')
-rw-r--r--src/output/alsa_plugin.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index fb748fdec..489d4f32b 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -32,7 +32,6 @@ static const char default_device[] = "default";
enum {
MPD_ALSA_BUFFER_TIME_US = 500000,
- MPD_ALSA_PERIOD_TIME_US = 125000,
};
#define MPD_ALSA_RETRY_NR 5
@@ -118,8 +117,7 @@ alsa_configure(struct alsa_data *ad, const struct config_param *param)
ad->buffer_time = config_get_block_unsigned(param, "buffer_time",
MPD_ALSA_BUFFER_TIME_US);
- ad->period_time = config_get_block_unsigned(param, "period_time",
- MPD_ALSA_PERIOD_TIME_US);
+ ad->period_time = config_get_block_unsigned(param, "period_time", 0);
#ifdef SND_PCM_NO_AUTO_RESAMPLE
if (!config_get_block_bool(param, "auto_resample", true))
@@ -313,6 +311,13 @@ configure_hw:
goto error;
}
+ if (period_time_ro == 0 && buffer_time >= 10000) {
+ period_time_ro = period_time = buffer_time / 4;
+
+ g_debug("default period_time = buffer_time/4 = %u/4 = %u",
+ buffer_time, period_time);
+ }
+
if (period_time_ro > 0) {
period_time = period_time_ro;
cmd = "snd_pcm_hw_params_set_period_time_near";