From a86aaef4d0075df581857cdabb624a24885afa2b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 23 Aug 2014 16:12:18 +0200 Subject: [PATCH] output/alsa: support native DSD playback Translate SampleFormat::DSD to SND_PCM_FORMAT_DSD_U8, which was added to alsa-lib 1.0.27.1. --- NEWS | 2 ++ src/output/plugins/AlsaOutputPlugin.cxx | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) 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 +#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,9 +242,15 @@ get_bitformat(SampleFormat sample_format) { switch (sample_format) { case SampleFormat::UNDEFINED: - case SampleFormat::DSD: 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;