aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--configure.ac10
-rw-r--r--src/output/alsa_output_plugin.c9
-rw-r--r--src/output/openal_output_plugin.c18
4 files changed, 26 insertions, 13 deletions
diff --git a/NEWS b/NEWS
index 2577f9d95..48d3d80ca 100644
--- a/NEWS
+++ b/NEWS
@@ -39,6 +39,8 @@ ver 0.16.5 (2010/??/??)
- ffmpeg: higher precision timestamps
- ffmpeg: don't require key frame for seeking
- fix CUE track seeking
+* output:
+ - openal: auto-fallback to mono if channel count is unsupported
* player:
- make seeking to CUE track more reliable
- the "seek" command works when MPD is stopped
diff --git a/configure.ac b/configure.ac
index 98062eea6..84f36f8fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -36,7 +36,15 @@ AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG
AC_ARG_WITH([systemdsystemunitdir],
AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
- [], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
+ [], [with_systemdsystemunitdir=no])
+if test "x$with_systemdsystemunitdir" = xyes; then
+ AC_MSG_CHECKING(for systemd)
+ with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
+ if test -z "$with_systemdsystemunitdir"; then
+ AC_MSG_ERROR([Failed to detect systemd])
+ fi
+ AC_MSG_RESULT([$with_systemdsystemunitdir])
+fi
if test "x$with_systemdsystemunitdir" != xno; then
AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
fi
diff --git a/src/output/alsa_output_plugin.c b/src/output/alsa_output_plugin.c
index 41293272d..af6d1b184 100644
--- a/src/output/alsa_output_plugin.c
+++ b/src/output/alsa_output_plugin.c
@@ -193,6 +193,9 @@ static snd_pcm_format_t
get_bitformat(enum sample_format sample_format)
{
switch (sample_format) {
+ case SAMPLE_FORMAT_UNDEFINED:
+ return SND_PCM_FORMAT_UNKNOWN;
+
case SAMPLE_FORMAT_S8:
return SND_PCM_FORMAT_S8;
@@ -209,10 +212,10 @@ get_bitformat(enum sample_format sample_format)
case SAMPLE_FORMAT_S32:
return SND_PCM_FORMAT_S32;
-
- default:
- return SND_PCM_FORMAT_UNKNOWN;
}
+
+ assert(false);
+ return SND_PCM_FORMAT_UNKNOWN;
}
static snd_pcm_format_t
diff --git a/src/output/openal_output_plugin.c b/src/output/openal_output_plugin.c
index 1473659f0..622cf559e 100644
--- a/src/output/openal_output_plugin.c
+++ b/src/output/openal_output_plugin.c
@@ -67,26 +67,26 @@ openal_audio_format(struct audio_format *audio_format)
return AL_FORMAT_STEREO16;
if (audio_format->channels == 1)
return AL_FORMAT_MONO16;
- break;
+
+ /* fall back to mono */
+ audio_format->channels = 1;
+ return openal_audio_format(audio_format);
case SAMPLE_FORMAT_S8:
if (audio_format->channels == 2)
return AL_FORMAT_STEREO8;
if (audio_format->channels == 1)
return AL_FORMAT_MONO8;
- break;
+
+ /* fall back to mono */
+ audio_format->channels = 1;
+ return openal_audio_format(audio_format);
default:
/* fall back to 16 bit */
audio_format->format = SAMPLE_FORMAT_S16;
- if (audio_format->channels == 2)
- return AL_FORMAT_STEREO16;
- if (audio_format->channels == 1)
- return AL_FORMAT_MONO16;
- break;
+ return openal_audio_format(audio_format);
}
-
- return 0;
}
static bool