aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-11 12:52:48 +0200
committerMax Kellermann <max@duempel.org>2008-10-11 12:52:48 +0200
commitdd7711d86c502c8d302b791d19a836360e758e12 (patch)
treeed1b56321b4a89f563b9b0a0875e66082fdd2887 /src
parentbcc443a8aa6899de79d2c5a01528afbe1fa52db8 (diff)
downloadmpd-dd7711d86c502c8d302b791d19a836360e758e12.tar.gz
mpd-dd7711d86c502c8d302b791d19a836360e758e12.tar.xz
mpd-dd7711d86c502c8d302b791d19a836360e758e12.zip
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.
Diffstat (limited to '')
-rw-r--r--src/audioOutputs/audioOutput_alsa.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c
index 52603cc62..8e3cbb9d6 100644
--- a/src/audioOutputs/audioOutput_alsa.c
+++ b/src/audioOutputs/audioOutput_alsa.c
@@ -25,11 +25,6 @@
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
#include "../utils.h"
@@ -58,8 +53,8 @@ static AlsaData *newAlsaData(void)
ret->pcmHandle = NULL;
ret->writei = snd_pcm_writei;
ret->useMmap = 0;
- ret->buffer_time = MPD_ALSA_BUFFER_TIME_US;
- ret->period_time = MPD_ALSA_PERIOD_TIME_US;
+ ret->buffer_time = 0;
+ ret->period_time = 0;
return ret;
}
@@ -219,23 +214,27 @@ configure_hw:
}
audioFormat->sample_rate = sample_rate;
- buffer_time = ad->buffer_time;
- cmd = "snd_pcm_hw_params_set_buffer_time_near";
- err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
- &buffer_time, NULL);
- if (err < 0)
- goto error;
+ if (ad->buffer_time > 0) {
+ buffer_time = ad->buffer_time;
+ cmd = "snd_pcm_hw_params_set_buffer_time_near";
+ err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
+ &buffer_time, NULL);
+ if (err < 0)
+ goto error;
+ }
- period_time = period_time_ro;
- cmd = "snd_pcm_hw_params_set_period_time_near";
- err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
- &period_time, NULL);
- if (err < 0)
- goto error;
+ if (period_time_ro > 0) {
+ period_time = period_time_ro;
+ cmd = "snd_pcm_hw_params_set_period_time_near";
+ err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
+ &period_time, NULL);
+ if (err < 0)
+ goto error;
+ }
cmd = "snd_pcm_hw_params";
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;
goto configure_hw;
} else if (err < 0)