aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--src/output/plugins/AlsaOutputPlugin.cxx12
2 files changed, 14 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 5470d7311..a2ab58f32 100644
--- a/NEWS
+++ b/NEWS
@@ -52,6 +52,8 @@ ver 0.19 (not yet released)
- mp4v2: support playback of MP4 files.
* encoder:
- shine: new encoder plugin
+* output
+ - alsa: support native DSD playback
* threads:
- the update thread runs at "idle" priority
- the output thread runs at "real-time" priority
diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx
index d91eeea9f..9f299642e 100644
--- a/src/output/plugins/AlsaOutputPlugin.cxx
+++ b/src/output/plugins/AlsaOutputPlugin.cxx
@@ -22,6 +22,7 @@
#include "../OutputAPI.hxx"
#include "mixer/MixerList.hxx"
#include "pcm/PcmExport.hxx"
+#include "config/ConfigError.hxx"
#include "util/Manual.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
@@ -32,6 +33,11 @@
#include <string>
+#if SND_LIB_VERSION >= 0x1001c
+/* alsa-lib supports DSD since version 1.0.27.1 */
+#define HAVE_ALSA_DSD
+#endif
+
static const char default_device[] = "default";
static constexpr unsigned MPD_ALSA_BUFFER_TIME_US = 500000;
@@ -236,8 +242,14 @@ get_bitformat(SampleFormat sample_format)
{
switch (sample_format) {
case SampleFormat::UNDEFINED:
+ return SND_PCM_FORMAT_UNKNOWN;
+
case SampleFormat::DSD:
+#ifdef HAVE_ALSA_DSD
+ return SND_PCM_FORMAT_DSD_U8;
+#else
return SND_PCM_FORMAT_UNKNOWN;
+#endif
case SampleFormat::S8:
return SND_PCM_FORMAT_S8;