aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs/audioOutput_alsa.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-14 17:21:49 +0200
committerMax Kellermann <max@duempel.org>2008-10-14 17:21:49 +0200
commit86782faa18b32941eb2e39dd552d58b934279f1a (patch)
treed9f431360e66f686c8cb4f203166e9467a7a9af9 /src/audioOutputs/audioOutput_alsa.c
parent79a1811c1121e96918db4133872e0d05dcfc3dc8 (diff)
downloadmpd-86782faa18b32941eb2e39dd552d58b934279f1a.tar.gz
mpd-86782faa18b32941eb2e39dd552d58b934279f1a.tar.xz
mpd-86782faa18b32941eb2e39dd552d58b934279f1a.zip
alsa: optionally disable resampling and others
Added mpd.conf options for disabling automatic resamling, sample format and channel conversion. This way, users may choose to override ALSA's automatic resampling, and use libsamplerate instead.
Diffstat (limited to '')
-rw-r--r--src/audioOutputs/audioOutput_alsa.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c
index ebe40d04c..e2132b9b9 100644
--- a/src/audioOutputs/audioOutput_alsa.c
+++ b/src/audioOutputs/audioOutput_alsa.c
@@ -37,6 +37,10 @@ typedef snd_pcm_sframes_t alsa_writei_t(snd_pcm_t * pcm, const void *buffer,
typedef struct _AlsaData {
const char *device;
+
+ /** the mode flags passed to snd_pcm_open */
+ int mode;
+
snd_pcm_t *pcmHandle;
alsa_writei_t *writei;
unsigned int buffer_time;
@@ -50,6 +54,7 @@ static AlsaData *newAlsaData(void)
AlsaData *ret = xmalloc(sizeof(AlsaData));
ret->device = default_device;
+ ret->mode = 0;
ret->pcmHandle = NULL;
ret->writei = snd_pcm_writei;
ret->useMmap = 0;
@@ -80,6 +85,15 @@ alsa_configure(AlsaData *ad, ConfigParam *param)
ad->buffer_time = atoi(bp->value);
if ((bp = getBlockParam(param, "period_time")))
ad->period_time = atoi(bp->value);
+
+ if (!getBoolBlockParam(param, "auto_resample", true))
+ ad->mode |= SND_PCM_NO_AUTO_RESAMPLE;
+
+ if (!getBoolBlockParam(param, "auto_channels", true))
+ ad->mode |= SND_PCM_NO_AUTO_CHANNELS;
+
+ if (!getBoolBlockParam(param, "auto_format", true))
+ ad->mode |= SND_PCM_NO_AUTO_FORMAT;
}
static void *alsa_initDriver(mpd_unused struct audio_output *ao,
@@ -156,7 +170,7 @@ static int alsa_openDevice(void *data, struct audio_format *audioFormat)
ad->device, audioFormat->bits);
err = snd_pcm_open(&ad->pcmHandle, ad->device,
- SND_PCM_STREAM_PLAYBACK, 0);
+ SND_PCM_STREAM_PLAYBACK, ad->mode);
if (err < 0) {
ad->pcmHandle = NULL;
goto error;