aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/output/alsa_output_plugin.c63
1 files changed, 18 insertions, 45 deletions
diff --git a/src/output/alsa_output_plugin.c b/src/output/alsa_output_plugin.c
index 7714e8a66..8cc244d4c 100644
--- a/src/output/alsa_output_plugin.c
+++ b/src/output/alsa_output_plugin.c
@@ -260,11 +260,13 @@ byteswap_bitformat(snd_pcm_format_t fmt)
}
/**
- * Attempts to configure the specified sample format.
+ * Attempts to configure the specified sample format, and tries the
+ * reversed host byte order if was not supported.
*/
static int
alsa_output_try_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
struct audio_format *audio_format,
+ bool *reverse_endian_r,
enum sample_format sample_format)
{
snd_pcm_format_t alsa_format = get_bitformat(sample_format);
@@ -272,51 +274,22 @@ alsa_output_try_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
return -EINVAL;
int err = snd_pcm_hw_params_set_format(pcm, hwparams, alsa_format);
- if (err == 0)
+ if (err == 0) {
+ *reverse_endian_r = false;
audio_format->format = sample_format;
+ }
- return err;
-}
+ if (err != -EINVAL)
+ return err;
-/**
- * Attempts to configure the specified sample format with reversed
- * host byte order.
- */
-static int
-alsa_output_try_reverse(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
- struct audio_format *audio_format,
- enum sample_format sample_format)
-{
- snd_pcm_format_t alsa_format =
- byteswap_bitformat(get_bitformat(sample_format));
+ alsa_format = byteswap_bitformat(alsa_format);
if (alsa_format == SND_PCM_FORMAT_UNKNOWN)
return -EINVAL;
- int err = snd_pcm_hw_params_set_format(pcm, hwparams, alsa_format);
- if (err == 0)
- audio_format->format = sample_format;
-
- return err;
-}
-
-/**
- * Attempts to configure the specified sample format, and tries the
- * reversed host byte order if was not supported.
- */
-static int
-alsa_output_try_format_both(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
- struct audio_format *audio_format,
- bool *reverse_endian_r,
- enum sample_format sample_format)
-{
- *reverse_endian_r = false;
-
- int err = alsa_output_try_format(pcm, hwparams, audio_format,
- sample_format);
- if (err == -EINVAL) {
+ err = snd_pcm_hw_params_set_format(pcm, hwparams, alsa_format);
+ if (err == 0) {
*reverse_endian_r = true;
- err = alsa_output_try_reverse(pcm, hwparams, audio_format,
- sample_format);
+ audio_format->format = sample_format;
}
return err;
@@ -332,9 +305,9 @@ alsa_output_setup_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
{
/* try the input format first */
- int err = alsa_output_try_format_both(pcm, hwparams, audio_format,
- reverse_endian_r,
- audio_format->format);
+ int err = alsa_output_try_format(pcm, hwparams, audio_format,
+ reverse_endian_r,
+ audio_format->format);
if (err != -EINVAL)
return err;
@@ -353,9 +326,9 @@ alsa_output_setup_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
if (probe_formats[i] == audio_format->format)
continue;
- err = alsa_output_try_format_both(pcm, hwparams, audio_format,
- reverse_endian_r,
- probe_formats[i]);
+ err = alsa_output_try_format(pcm, hwparams, audio_format,
+ reverse_endian_r,
+ probe_formats[i]);
if (err != -EINVAL)
return err;
}