aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--src/decoder/plugins/DsdLib.cxx19
-rw-r--r--src/decoder/plugins/DsdLib.hxx7
-rw-r--r--src/decoder/plugins/DsfDecoderPlugin.cxx2
4 files changed, 28 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 220d204a0..31c7fad47 100644
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,7 @@ ver 0.19 (not yet released)
- audiofile: support scanning remote files
- audiofile: log libaudiofile errors
- dsdiff, dsf: report bit rate
+ - dsf: support DSD512
- sndfile: support scanning remote files
- sndfile: support tags "comment", "album", "track", "genre"
- mp4v2: support playback of MP4 files.
diff --git a/src/decoder/plugins/DsdLib.cxx b/src/decoder/plugins/DsdLib.cxx
index 0f10b20e9..086f9d4d6 100644
--- a/src/decoder/plugins/DsdLib.cxx
+++ b/src/decoder/plugins/DsdLib.cxx
@@ -82,6 +82,25 @@ dsdlib_skip(Decoder *decoder, InputStream &is,
return decoder_skip(decoder, is, delta);
}
+bool
+dsdlib_valid_freq(uint32_t samplefreq)
+{
+ switch (samplefreq) {
+ case 2822400: /* DSD64, 64xFs, Fs = 44.100kHz */
+ case 3072000: /* DSD64 with Fs = 48.000 kHz */
+ case 5644800:
+ case 6144000:
+ case 11289600:
+ case 12288000:
+ case 22579200:/* DSD512 */
+ case 24576000:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
#ifdef HAVE_ID3TAG
void
dsdlib_tag_id3(InputStream &is,
diff --git a/src/decoder/plugins/DsdLib.hxx b/src/decoder/plugins/DsdLib.hxx
index 5250922ac..4d5830702 100644
--- a/src/decoder/plugins/DsdLib.hxx
+++ b/src/decoder/plugins/DsdLib.hxx
@@ -67,6 +67,13 @@ dsdlib_skip(Decoder *decoder, InputStream &is,
uint64_t delta);
/**
+ * Check if the sample frequency is a valid DSD frequency.
+ **/
+gcc_const
+bool
+dsdlib_valid_freq(uint32_t samplefreq);
+
+/**
* Add tags from ID3 tag. All tags commonly found in the ID3 tags of
* DSF and DSDIFF files are imported
*/
diff --git a/src/decoder/plugins/DsfDecoderPlugin.cxx b/src/decoder/plugins/DsfDecoderPlugin.cxx
index dc94d149c..94c25247d 100644
--- a/src/decoder/plugins/DsfDecoderPlugin.cxx
+++ b/src/decoder/plugins/DsfDecoderPlugin.cxx
@@ -131,7 +131,7 @@ dsf_read_metadata(Decoder *decoder, InputStream &is,
if (dsf_fmt_chunk.version != 1 || dsf_fmt_chunk.formatid != 0
|| dsf_fmt_chunk.channeltype != 2
|| dsf_fmt_chunk.channelnum != 2
- || (samplefreq != 2822400 && samplefreq != 5644800))
+ || (!dsdlib_valid_freq(samplefreq)))
return false;
uint32_t chblksize = FromLE32(dsf_fmt_chunk.block_size);