diff options
author | Jurgen Kramer <gtmkramer@xs4all.nl> | 2012-04-01 11:10:12 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-04-04 20:13:15 +0200 |
commit | f930f37d35995f0fc07f70aefc41babc0db1757e (patch) | |
tree | ebb54621fef2c4c73ec5bcd760acaccdc91414bf | |
parent | 4feb57e8953d114b85abd3910b477ef58ef171ae (diff) | |
download | mpd-f930f37d35995f0fc07f70aefc41babc0db1757e.tar.gz mpd-f930f37d35995f0fc07f70aefc41babc0db1757e.tar.xz mpd-f930f37d35995f0fc07f70aefc41babc0db1757e.zip |
Add support for DSD-over-USB version 1.0, remove pre-v1 support
-rw-r--r-- | doc/user.xml | 4 | ||||
-rw-r--r-- | src/pcm_dsd_usb.c | 33 | ||||
-rw-r--r-- | src/pcm_dsd_usb.h | 5 |
3 files changed, 33 insertions, 9 deletions
diff --git a/doc/user.xml b/doc/user.xml index 6c0547f0c..cd36528d5 100644 --- a/doc/user.xml +++ b/doc/user.xml @@ -1127,8 +1127,8 @@ systemctl start mpd.socket</programlisting> <entry> If set to <parameter>yes</parameter>, then DSD over USB according to the <ulink - url="http://www.dcsltd.co.uk/page/assets/DSDoverUSB.pdf">dCS - suggested standard</ulink> is enabled. This wrapsa + url="http://www.sonore.us/DoP_openStandard_1v1.pdf">pro + posed standard by dCS and others</ulink> 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 diff --git a/src/pcm_dsd_usb.c b/src/pcm_dsd_usb.c index 976420c00..4b5e39f39 100644 --- a/src/pcm_dsd_usb.c +++ b/src/pcm_dsd_usb.c @@ -24,11 +24,19 @@ G_GNUC_CONST static inline uint32_t -pcm_two_dsd_to_usb(uint8_t a, uint8_t b) +pcm_two_dsd_to_usb_marker1(uint8_t a, uint8_t b) { - return 0xffaa0000 | (a << 8) | b; + return 0xff050000 | (a << 8) | b; } +G_GNUC_CONST +static inline uint32_t +pcm_two_dsd_to_usb_marker2(uint8_t a, uint8_t b) +{ + return 0xfffa0000 | (a << 8) | b; +} + + const uint32_t * pcm_dsd_to_usb(struct pcm_buffer *buffer, unsigned channels, const uint8_t *src, size_t src_size, @@ -53,12 +61,27 @@ pcm_dsd_to_usb(struct pcm_buffer *buffer, unsigned channels, uint32_t *const dest0 = pcm_buffer_get(buffer, dest_size), *dest = dest0; - for (unsigned i = num_frames; i > 0; --i) { + for (unsigned i = num_frames / 2; i > 0; --i) { + for (unsigned c = channels; c > 0; --c) { + /* 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]); + + /* seek the source pointer to the next + channel */ + ++src; + } + + /* skip the second byte of each channel, because we + have already copied it */ + src += channels; + for (unsigned c = channels; c > 0; --c) { /* each 24 bit sample has 16 DSD sample bits - plus the magic 0xaa marker */ + plus the magic 0xfa marker */ - *dest++ = pcm_two_dsd_to_usb(src[0], src[channels]); + *dest++ = pcm_two_dsd_to_usb_marker2(src[0], src[channels]); /* seek the source pointer to the next channel */ diff --git a/src/pcm_dsd_usb.h b/src/pcm_dsd_usb.h index 3e7ad8fa1..389358459 100644 --- a/src/pcm_dsd_usb.h +++ b/src/pcm_dsd_usb.h @@ -30,8 +30,9 @@ struct pcm_buffer; /** * Pack DSD 1 bit samples into (padded) 24 bit PCM samples for - * playback over USB, according to the dCS suggested standard: - * http://www.dcsltd.co.uk/page/assets/DSDoverUSB.pdf + * playback over USB, according to the proposed standard by + * dCS and others: + * http://www.sonore.us/DoP_openStandard_1v1.pdf */ const uint32_t * pcm_dsd_to_usb(struct pcm_buffer *buffer, unsigned channels, |