From e5a28bfd8d07fe5ca5dee1bfb55ce414c8f7e9fc Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 31 Aug 2014 16:12:26 +0200 Subject: [PATCH] output/alsa, pcm: rename "DSD over USB" to "DoP" The standard has been renamed since the early draft that was implemented in MPD. --- Makefile.am | 2 +- NEWS | 1 + doc/user.xml | 10 +++--- src/output/plugins/AlsaOutputPlugin.cxx | 41 +++++++++++++------------ src/pcm/{PcmDsdUsb.cxx => PcmDop.cxx} | 12 ++++---- src/pcm/{PcmDsdUsb.hxx => PcmDop.hxx} | 11 +++---- src/pcm/PcmExport.cxx | 22 ++++++------- src/pcm/PcmExport.hxx | 14 ++++----- test/test_pcm_all.hxx | 4 +-- test/test_pcm_export.cxx | 2 +- 10 files changed, 60 insertions(+), 59 deletions(-) rename src/pcm/{PcmDsdUsb.cxx => PcmDop.cxx} (88%) rename src/pcm/{PcmDsdUsb.hxx => PcmDop.hxx} (81%) diff --git a/Makefile.am b/Makefile.am index 89acbaa8d..606081fab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -465,7 +465,7 @@ libpcm_a_SOURCES = \ src/pcm/PcmConvert.cxx src/pcm/PcmConvert.hxx \ src/pcm/dsd2pcm/dsd2pcm.c src/pcm/dsd2pcm/dsd2pcm.h \ src/pcm/PcmDsd.cxx src/pcm/PcmDsd.hxx \ - src/pcm/PcmDsdUsb.cxx src/pcm/PcmDsdUsb.hxx \ + src/pcm/PcmDop.cxx src/pcm/PcmDop.hxx \ src/pcm/Volume.cxx src/pcm/Volume.hxx \ src/pcm/PcmMix.cxx src/pcm/PcmMix.hxx \ src/pcm/PcmChannels.cxx src/pcm/PcmChannels.hxx \ diff --git a/NEWS b/NEWS index fb513cd79..94fb234ca 100644 --- a/NEWS +++ b/NEWS @@ -55,6 +55,7 @@ ver 0.19 (not yet released) - shine: new encoder plugin * output - alsa: support native DSD playback + - alsa: rename "DSD over USB" to "DoP" * threads: - the update thread runs at "idle" priority - the output thread runs at "real-time" priority diff --git a/doc/user.xml b/doc/user.xml index e5b11927d..8b2782911 100644 --- a/doc/user.xml +++ b/doc/user.xml @@ -1991,15 +1991,15 @@ systemctl start mpd.socket - dsd_usb + dop yes|no If set to yes, then DSD over - USB according to the pro - posed standard by dCS and others is enabled. This wraps - DSD samples in fake 24 bit PCM, and is understood by + PCM according to the DoP + standard others is enabled. This wraps DSD + samples in fake 24 bit PCM, and is understood by some DSD capable products, but may be harmful to other hardware. Therefore, the default is no and you can enable the diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 0ebf3ddbe..33a090274 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -62,12 +62,11 @@ struct AlsaOutput { bool use_mmap; /** - * Enable DSD over USB according to the dCS suggested - * standard? + * Enable DSD over PCM according to the DoP standard standard? * - * @see http://www.dcsltd.co.uk/page/assets/DSDoverUSB.pdf + * @see http://dsd-guide.com/dop-open-standard */ - bool dsd_usb; + bool dop; /** libasound's buffer_time setting (in microseconds) */ unsigned int buffer_time; @@ -153,7 +152,9 @@ AlsaOutput::Configure(const config_param ¶m, Error &error) use_mmap = param.GetBlockValue("use_mmap", false); - dsd_usb = param.GetBlockValue("dsd_usb", false); + dop = param.GetBlockValue("dop", false) || + /* legacy name from MPD 0.18 and older: */ + param.GetBlockValue("dsd_usb", false); buffer_time = param.GetBlockValue("buffer_time", MPD_ALSA_BUFFER_TIME_US); @@ -639,34 +640,34 @@ alsa_setup_dsd(AlsaOutput *ad, const AudioFormat audio_format, bool *shift8_r, bool *packed_r, bool *reverse_endian_r, Error &error) { - assert(ad->dsd_usb); + assert(ad->dop); assert(audio_format.format == SampleFormat::DSD); /* pass 24 bit to alsa_setup() */ - AudioFormat usb_format = audio_format; - usb_format.format = SampleFormat::S24_P32; - usb_format.sample_rate /= 2; + AudioFormat dop_format = audio_format; + dop_format.format = SampleFormat::S24_P32; + dop_format.sample_rate /= 2; - const AudioFormat check = usb_format; + const AudioFormat check = dop_format; - if (!alsa_setup(ad, usb_format, packed_r, reverse_endian_r, error)) + if (!alsa_setup(ad, dop_format, packed_r, reverse_endian_r, error)) return false; - /* if the device allows only 32 bit, shift all DSD-over-USB + /* if the device allows only 32 bit, shift all DoP samples left by 8 bit and leave the lower 8 bit cleared; the DSD-over-USB documentation does not specify whether this is legal, but there is anecdotical evidence that this is possible (and the only option for some devices) */ - *shift8_r = usb_format.format == SampleFormat::S32; - if (usb_format.format == SampleFormat::S32) - usb_format.format = SampleFormat::S24_P32; + *shift8_r = dop_format.format == SampleFormat::S32; + if (dop_format.format == SampleFormat::S32) + dop_format.format = SampleFormat::S24_P32; - if (usb_format != check) { + if (dop_format != check) { /* no bit-perfect playback, which is required for DSD over USB */ error.Format(alsa_output_domain, - "Failed to configure DSD-over-USB on ALSA device \"%s\"", + "Failed to configure DSD-over-PCM on ALSA device \"%s\"", alsa_device(ad)); delete[] ad->silence; return false; @@ -681,9 +682,9 @@ alsa_setup_or_dsd(AlsaOutput *ad, AudioFormat &audio_format, { bool shift8 = false, packed, reverse_endian; - const bool dsd_usb = ad->dsd_usb && + const bool dop = ad->dop && audio_format.format == SampleFormat::DSD; - const bool success = dsd_usb + const bool success = dop ? alsa_setup_dsd(ad, audio_format, &shift8, &packed, &reverse_endian, error) @@ -694,7 +695,7 @@ alsa_setup_or_dsd(AlsaOutput *ad, AudioFormat &audio_format, ad->pcm_export->Open(audio_format.format, audio_format.channels, - dsd_usb, shift8, packed, reverse_endian); + dop, shift8, packed, reverse_endian); return true; } diff --git a/src/pcm/PcmDsdUsb.cxx b/src/pcm/PcmDop.cxx similarity index 88% rename from src/pcm/PcmDsdUsb.cxx rename to src/pcm/PcmDop.cxx index 9b854ad07..b2096d9e4 100644 --- a/src/pcm/PcmDsdUsb.cxx +++ b/src/pcm/PcmDop.cxx @@ -18,7 +18,7 @@ */ #include "config.h" -#include "PcmDsdUsb.hxx" +#include "PcmDop.hxx" #include "PcmBuffer.hxx" #include "AudioFormat.hxx" #include "util/ConstBuffer.hxx" @@ -27,20 +27,20 @@ constexpr static inline uint32_t -pcm_two_dsd_to_usb_marker1(uint8_t a, uint8_t b) +pcm_two_dsd_to_dop_marker1(uint8_t a, uint8_t b) { return 0xff050000 | (a << 8) | b; } constexpr static inline uint32_t -pcm_two_dsd_to_usb_marker2(uint8_t a, uint8_t b) +pcm_two_dsd_to_dop_marker2(uint8_t a, uint8_t b) { return 0xfffa0000 | (a << 8) | b; } ConstBuffer -pcm_dsd_to_usb(PcmBuffer &buffer, unsigned channels, +pcm_dsd_to_dop(PcmBuffer &buffer, unsigned channels, ConstBuffer _src) { assert(audio_valid_channel_count(channels)); @@ -65,7 +65,7 @@ pcm_dsd_to_usb(PcmBuffer &buffer, unsigned channels, /* each 24 bit sample has 16 DSD sample bits plus the magic 0x05 marker */ - *dest++ = pcm_two_dsd_to_usb_marker1(src[0], src[channels]); + *dest++ = pcm_two_dsd_to_dop_marker1(src[0], src[channels]); /* seek the source pointer to the next channel */ @@ -80,7 +80,7 @@ pcm_dsd_to_usb(PcmBuffer &buffer, unsigned channels, /* each 24 bit sample has 16 DSD sample bits plus the magic 0xfa marker */ - *dest++ = pcm_two_dsd_to_usb_marker2(src[0], src[channels]); + *dest++ = pcm_two_dsd_to_dop_marker2(src[0], src[channels]); /* seek the source pointer to the next channel */ diff --git a/src/pcm/PcmDsdUsb.hxx b/src/pcm/PcmDop.hxx similarity index 81% rename from src/pcm/PcmDsdUsb.hxx rename to src/pcm/PcmDop.hxx index 5e05c009b..03161c456 100644 --- a/src/pcm/PcmDsdUsb.hxx +++ b/src/pcm/PcmDop.hxx @@ -17,8 +17,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MPD_PCM_DSD_USB_HXX -#define MPD_PCM_DSD_USB_HXX +#ifndef MPD_PCM_DOP_HXX +#define MPD_PCM_DOP_HXX #include "check.h" @@ -30,12 +30,11 @@ template struct ConstBuffer; /** * Pack DSD 1 bit samples into (padded) 24 bit PCM samples for - * playback over USB, according to the proposed standard by - * dCS and others: - * http://www.sonore.us/DoP_openStandard_1v1.pdf + * playback over USB, according to the DoP standard: + * http://dsd-guide.com/dop-open-standard */ ConstBuffer -pcm_dsd_to_usb(PcmBuffer &buffer, unsigned channels, +pcm_dsd_to_dop(PcmBuffer &buffer, unsigned channels, ConstBuffer src); #endif diff --git a/src/pcm/PcmExport.cxx b/src/pcm/PcmExport.cxx index 5f567f3c6..ef099ba71 100644 --- a/src/pcm/PcmExport.cxx +++ b/src/pcm/PcmExport.cxx @@ -19,7 +19,7 @@ #include "config.h" #include "PcmExport.hxx" -#include "PcmDsdUsb.hxx" +#include "PcmDop.hxx" #include "PcmPack.hxx" #include "util/ByteReverse.hxx" #include "util/ConstBuffer.hxx" @@ -28,15 +28,15 @@ void PcmExport::Open(SampleFormat sample_format, unsigned _channels, - bool _dsd_usb, bool _shift8, bool _pack, bool _reverse_endian) + bool _dop, bool _shift8, bool _pack, bool _reverse_endian) { assert(audio_valid_sample_format(sample_format)); - assert(!_dsd_usb || audio_valid_channel_count(_channels)); + assert(!_dop || audio_valid_channel_count(_channels)); channels = _channels; - dsd_usb = _dsd_usb && sample_format == SampleFormat::DSD; - if (dsd_usb) - /* after the conversion to DSD-over-USB, the DSD + dop = _dop && sample_format == SampleFormat::DSD; + if (dop) + /* after the conversion to DoP, the DSD samples are stuffed inside fake 24 bit samples */ sample_format = SampleFormat::S24_P32; @@ -64,7 +64,7 @@ PcmExport::GetFrameSize(const AudioFormat &audio_format) const /* packed 24 bit samples (3 bytes per sample) */ return audio_format.channels * 3; - if (dsd_usb) + if (dop) /* the DSD-over-USB draft says that DSD 1-bit samples are enclosed within 24 bit samples, and MPD's representation of 24 bit is padded to 32 bit (4 @@ -77,8 +77,8 @@ PcmExport::GetFrameSize(const AudioFormat &audio_format) const ConstBuffer PcmExport::Export(ConstBuffer data) { - if (dsd_usb) - data = pcm_dsd_to_usb(dsd_buffer, channels, + if (dop) + data = pcm_dsd_to_dop(dop_buffer, channels, ConstBuffer::FromVoid(data)) .ToVoid(); @@ -125,8 +125,8 @@ PcmExport::CalcSourceSize(size_t size) const /* 32 bit to 24 bit conversion (4 to 3 bytes) */ size = (size / 3) * 4; - if (dsd_usb) - /* DSD over USB doubles the transport size */ + if (dop) + /* DoP doubles the transport size */ size /= 2; return size; diff --git a/src/pcm/PcmExport.hxx b/src/pcm/PcmExport.hxx index 8169dad7b..b99a35835 100644 --- a/src/pcm/PcmExport.hxx +++ b/src/pcm/PcmExport.hxx @@ -35,11 +35,11 @@ template struct ConstBuffer; struct PcmExport { /** * The buffer is used to convert DSD samples to the - * DSD-over-USB format. + * DoP format. * - * @see #dsd_usb + * @see #dop */ - PcmBuffer dsd_buffer; + PcmBuffer dop_buffer; /** * The buffer is used to pack samples, removing padding. @@ -61,11 +61,11 @@ struct PcmExport { uint8_t channels; /** - * Convert DSD to DSD-over-USB? Input format must be + * Convert DSD to DSD-over-PCM (DoP)? Input format must be * SampleFormat::DSD and output format must be * SampleFormat::S24_P32. */ - bool dsd_usb; + bool dop; /** * Convert (padded) 24 bit samples to 32 bit by shifting 8 @@ -93,10 +93,10 @@ struct PcmExport { * * This function cannot fail. * - * @param channels the number of channels; ignored unless dsd_usb is set + * @param channels the number of channels; ignored unless dop is set */ void Open(SampleFormat sample_format, unsigned channels, - bool dsd_usb, bool shift8, bool pack, bool reverse_endian); + bool dop, bool shift8, bool pack, bool reverse_endian); /** * Calculate the size of one output frame. diff --git a/test/test_pcm_all.hxx b/test/test_pcm_all.hxx index 64ad82a32..7cdd8b63f 100644 --- a/test/test_pcm_all.hxx +++ b/test/test_pcm_all.hxx @@ -108,14 +108,14 @@ class PcmExportTest : public CppUnit::TestFixture { CPPUNIT_TEST(TestShift8); CPPUNIT_TEST(TestPack24); CPPUNIT_TEST(TestReverseEndian); - CPPUNIT_TEST(TestDsdUsb); + CPPUNIT_TEST(TestDop); CPPUNIT_TEST_SUITE_END(); public: void TestShift8(); void TestPack24(); void TestReverseEndian(); - void TestDsdUsb(); + void TestDop(); }; #endif diff --git a/test/test_pcm_export.cxx b/test/test_pcm_export.cxx index 88c1974e3..410e64e4d 100644 --- a/test/test_pcm_export.cxx +++ b/test/test_pcm_export.cxx @@ -106,7 +106,7 @@ PcmExportTest::TestReverseEndian() } void -PcmExportTest::TestDsdUsb() +PcmExportTest::TestDop() { static constexpr uint8_t src[] = { 0x01, 0x23, 0x45, 0x67,