aboutsummaryrefslogtreecommitdiffstats
path: root/src/output/alsa_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/output/alsa_plugin.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index 4802778dc..493eaaa96 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -20,6 +20,7 @@
#include "../utils.h"
#include "../log.h"
+#include <glib.h>
#include <alsa/asoundlib.h>
#define ALSA_PCM_NEW_HW_PARAMS_API
@@ -33,7 +34,7 @@ typedef snd_pcm_sframes_t alsa_writei_t(snd_pcm_t * pcm, const void *buffer,
snd_pcm_uframes_t size);
typedef struct _AlsaData {
- const char *device;
+ char *device;
/** the mode flags passed to snd_pcm_open */
int mode;
@@ -46,11 +47,16 @@ typedef struct _AlsaData {
int useMmap;
} AlsaData;
+static const char *
+alsa_device(const AlsaData *ad)
+{
+ return ad->device != NULL ? ad->device : default_device;
+}
+
static AlsaData *newAlsaData(void)
{
AlsaData *ret = xmalloc(sizeof(AlsaData));
- ret->device = default_device;
ret->mode = 0;
ret->pcmHandle = NULL;
ret->writei = snd_pcm_writei;
@@ -63,8 +69,7 @@ static AlsaData *newAlsaData(void)
static void freeAlsaData(AlsaData * ad)
{
- if (ad->device && ad->device != default_device)
- xfree(ad->device);
+ g_free(ad->device);
free(ad);
}
@@ -75,6 +80,9 @@ alsa_configure(AlsaData *ad, ConfigParam *param)
if ((bp = getBlockParam(param, "device")))
ad->device = xstrdup(bp->value);
+ else
+ ad->device = NULL;
+
ad->useMmap = getBoolBlockParam(param, "use_mmap", 1);
if (ad->useMmap == CONF_BOOL_UNSET)
ad->useMmap = 0;
@@ -170,9 +178,9 @@ static bool alsa_openDevice(void *data, struct audio_format *audioFormat)
if ((bitformat = get_bitformat(audioFormat)) == SND_PCM_FORMAT_UNKNOWN)
ERROR("ALSA device \"%s\" doesn't support %u bit audio\n",
- ad->device, audioFormat->bits);
+ alsa_device(ad), audioFormat->bits);
- err = snd_pcm_open(&ad->pcmHandle, ad->device,
+ err = snd_pcm_open(&ad->pcmHandle, alsa_device(ad),
SND_PCM_STREAM_PLAYBACK, ad->mode);
if (err < 0) {
ad->pcmHandle = NULL;
@@ -194,7 +202,7 @@ configure_hw:
SND_PCM_ACCESS_MMAP_INTERLEAVED);
if (err < 0) {
ERROR("Cannot set mmap'ed mode on ALSA device \"%s\": "
- " %s\n", ad->device, snd_strerror(-err));
+ " %s\n", alsa_device(ad), snd_strerror(-err));
ERROR("Falling back to direct write mode\n");
ad->useMmap = 0;
} else
@@ -217,14 +225,14 @@ configure_hw:
SND_PCM_FORMAT_S16);
if (err == 0) {
DEBUG("ALSA device \"%s\": converting %u bit to 16 bit\n",
- ad->device, audioFormat->bits);
+ alsa_device(ad), audioFormat->bits);
audioFormat->bits = 16;
}
}
if (err < 0) {
ERROR("ALSA device \"%s\" does not support %u bit audio: "
- "%s\n", ad->device, audioFormat->bits, snd_strerror(-err));
+ "%s\n", alsa_device(ad), audioFormat->bits, snd_strerror(-err));
goto fail;
}
@@ -232,7 +240,7 @@ configure_hw:
&channels);
if (err < 0) {
ERROR("ALSA device \"%s\" does not support %i channels: "
- "%s\n", ad->device, (int)audioFormat->channels,
+ "%s\n", alsa_device(ad), (int)audioFormat->channels,
snd_strerror(-err));
goto fail;
}
@@ -242,7 +250,7 @@ configure_hw:
&sample_rate, NULL);
if (err < 0 || sample_rate == 0) {
ERROR("ALSA device \"%s\" does not support %u Hz audio\n",
- ad->device, audioFormat->sample_rate);
+ alsa_device(ad), audioFormat->sample_rate);
goto fail;
}
audioFormat->sample_rate = sample_rate;
@@ -315,7 +323,7 @@ configure_hw:
ad->sampleSize = audio_format_frame_size(audioFormat);
DEBUG("ALSA device \"%s\" will be playing %i bit, %u channel audio at "
- "%u Hz\n", ad->device, audioFormat->bits,
+ "%u Hz\n", alsa_device(ad), audioFormat->bits,
channels, sample_rate);
return true;
@@ -323,9 +331,9 @@ configure_hw:
error:
if (cmd) {
ERROR("Error opening ALSA device \"%s\" (%s): %s\n",
- ad->device, cmd, snd_strerror(-err));
+ alsa_device(ad), cmd, snd_strerror(-err));
} else {
- ERROR("Error opening ALSA device \"%s\": %s\n", ad->device,
+ ERROR("Error opening ALSA device \"%s\": %s\n", alsa_device(ad),
snd_strerror(-err));
}
fail:
@@ -338,9 +346,9 @@ fail:
static int alsa_errorRecovery(AlsaData * ad, int err)
{
if (err == -EPIPE) {
- DEBUG("Underrun on ALSA device \"%s\"\n", ad->device);
+ DEBUG("Underrun on ALSA device \"%s\"\n", alsa_device(ad));
} else if (err == -ESTRPIPE) {
- DEBUG("ALSA device \"%s\" was suspended\n", ad->device);
+ DEBUG("ALSA device \"%s\" was suspended\n", alsa_device(ad));
}
switch (snd_pcm_state(ad->pcmHandle)) {
@@ -410,7 +418,7 @@ alsa_playAudio(void *data, const char *playChunk, size_t size)
if (ret < 0) {
if (alsa_errorRecovery(ad, ret) < 0) {
ERROR("closing ALSA device \"%s\" due to write "
- "error: %s\n", ad->device,
+ "error: %s\n", alsa_device(ad),
snd_strerror(-errno));
return false;
}