alsa: fix option parsing and restore default period_time

Two bugs here led to a large number of interrupts being generated on the
sound card when ALSA output is being used. Because we specify no default
period_time, the sound card gives us 3000 interrupts/sec rather than a more
sane 20 or 30. This completes the revert of dd7711 already started by
4ca24f.

The larger bug was in the change to config_get_block_unsigned() and using 0
as the default value for both 'buffer_time' and 'period_time'. This means
any pre-setting of these options in newAlsaData() gets wiped out. Add a new
default for period_time, and ensure default values for buffer_time and
period_time are used if none are provided by the user.

Signed-off-by: Dan McGee <dan@archlinux.org>
[mk: set defaults in newAlsaData() to fix auto-configuration; renamed
"_MS" back to "_US" because ALSA expects microseconds, not milliseconds]
Signed-off-by: Max Kellermann <max@duempel.org>
This commit is contained in:
Dan McGee 2009-01-25 12:52:37 +01:00 committed by Max Kellermann
parent 16796b1209
commit 27baf6913e

View File

@ -32,6 +32,7 @@ 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
@ -72,7 +73,7 @@ static AlsaData *newAlsaData(void)
ret->writei = snd_pcm_writei;
ret->useMmap = 0;
ret->buffer_time = MPD_ALSA_BUFFER_TIME_US;
ret->period_time = 0;
ret->period_time = MPD_ALSA_PERIOD_TIME_US;
//use alsa mixer by default
mixer_init(&ret->mixer, &alsa_mixer);
@ -94,8 +95,10 @@ alsa_configure(AlsaData *ad, struct config_param *param)
ad->useMmap = config_get_block_bool(param, "use_mmap", false);
ad->buffer_time = config_get_block_unsigned(param, "buffer_time", 0);
ad->period_time = config_get_block_unsigned(param, "period_time", 0);
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);
#ifdef SND_PCM_NO_AUTO_RESAMPLE
if (!config_get_block_bool(param, "auto_resample", true))