aboutsummaryrefslogtreecommitdiffstats
path: root/src/output/alsa_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/output/alsa_plugin.c')
-rw-r--r--src/output/alsa_plugin.c81
1 files changed, 49 insertions, 32 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index a68a78198..9b3b5599c 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -192,11 +192,14 @@ get_bitformat(const struct audio_format *af)
return SND_PCM_FORMAT_UNKNOWN;
}
+/**
+ * Set up the snd_pcm_t object which was opened by the caller. Set up
+ * the configured settings and the audio format.
+ */
static bool
-alsa_open(void *data, struct audio_format *audio_format)
+alsa_setup(struct alsa_data *ad, struct audio_format *audio_format,
+ snd_pcm_format_t bitformat)
{
- struct alsa_data *ad = data;
- snd_pcm_format_t bitformat;
snd_pcm_hw_params_t *hwparams;
snd_pcm_sw_params_t *swparams;
unsigned int sample_rate = audio_format->sample_rate;
@@ -209,19 +212,6 @@ alsa_open(void *data, struct audio_format *audio_format)
unsigned int period_time, period_time_ro;
unsigned int buffer_time;
- mixer_open(ad->mixer);
-
- if ((bitformat = get_bitformat(audio_format)) == SND_PCM_FORMAT_UNKNOWN)
- g_warning("ALSA device \"%s\" doesn't support %u bit audio\n",
- alsa_device(ad), audio_format->bits);
-
- err = snd_pcm_open(&ad->pcm, alsa_device(ad),
- SND_PCM_STREAM_PLAYBACK, ad->mode);
- if (err < 0) {
- ad->pcm = NULL;
- goto error;
- }
-
period_time_ro = period_time = ad->period_time;
configure_hw:
/* configure HW params */
@@ -268,7 +258,7 @@ configure_hw:
if (err < 0) {
g_warning("ALSA device \"%s\" does not support %u bit audio: %s\n",
alsa_device(ad), audio_format->bits, snd_strerror(-err));
- goto fail;
+ return false;
}
err = snd_pcm_hw_params_set_channels_near(ad->pcm, hwparams,
@@ -277,7 +267,7 @@ configure_hw:
g_warning("ALSA device \"%s\" does not support %i channels: %s\n",
alsa_device(ad), (int)audio_format->channels,
snd_strerror(-err));
- goto fail;
+ return false;
}
audio_format->channels = (int8_t)channels;
@@ -286,7 +276,7 @@ configure_hw:
if (err < 0 || sample_rate == 0) {
g_warning("ALSA device \"%s\" does not support %u Hz audio\n",
alsa_device(ad), audio_format->sample_rate);
- goto fail;
+ return false;
}
audio_format->sample_rate = sample_rate;
@@ -355,26 +345,53 @@ configure_hw:
if (err < 0)
goto error;
- ad->frame_size = audio_format_frame_size(audio_format);
-
- g_debug("ALSA device \"%s\" will be playing %i bit, %u channel audio at %u Hz\n",
- alsa_device(ad), audio_format->bits, channels, sample_rate);
-
return true;
error:
- if (cmd) {
- g_warning("Error opening ALSA device \"%s\" (%s): %s\n",
- alsa_device(ad), cmd, snd_strerror(-err));
- } else {
+ g_warning("Error opening ALSA device \"%s\" (%s): %s\n",
+ alsa_device(ad), cmd, snd_strerror(-err));
+
+ return false;
+}
+
+static bool
+alsa_open(void *data, struct audio_format *audio_format)
+{
+ struct alsa_data *ad = data;
+ snd_pcm_format_t bitformat;
+ int err;
+ bool success;
+
+ mixer_open(ad->mixer);
+
+ if ((bitformat = get_bitformat(audio_format)) == SND_PCM_FORMAT_UNKNOWN)
+ g_warning("ALSA device \"%s\" doesn't support %u bit audio\n",
+ alsa_device(ad), audio_format->bits);
+
+ err = snd_pcm_open(&ad->pcm, alsa_device(ad),
+ SND_PCM_STREAM_PLAYBACK, ad->mode);
+ if (err < 0) {
+ ad->pcm = NULL;
+
g_warning("Error opening ALSA device \"%s\": %s\n",
alsa_device(ad), snd_strerror(-err));
+ return false;
}
-fail:
- if (ad->pcm)
+
+ success = alsa_setup(ad, audio_format, bitformat);
+ if (!success) {
snd_pcm_close(ad->pcm);
- ad->pcm = NULL;
- return false;
+ ad->pcm = NULL;
+ return false;
+ }
+
+ ad->frame_size = audio_format_frame_size(audio_format);
+
+ g_debug("ALSA device \"%s\" will be playing %i bit, %u channel audio at %u Hz\n",
+ alsa_device(ad), audio_format->bits, audio_format->channels,
+ audio_format->sample_rate);
+
+ return true;
}
static int