diff options
author | Max Kellermann <max@duempel.org> | 2008-10-11 12:52:48 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-10-11 12:52:48 +0200 |
commit | dd7711d86c502c8d302b791d19a836360e758e12 (patch) | |
tree | ed1b56321b4a89f563b9b0a0875e66082fdd2887 /src/audioOutputs/audioOutput_alsa.c | |
parent | bcc443a8aa6899de79d2c5a01528afbe1fa52db8 (diff) | |
download | mpd-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 'src/audioOutputs/audioOutput_alsa.c')
-rw-r--r-- | src/audioOutputs/audioOutput_alsa.c | 39 |
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) |