From 9b9d189a333705818783e51da10d21511379124f Mon Sep 17 00:00:00 2001
From: Jurgen Kramer <gtmkramer@xs4all.nl>
Date: Fri, 4 Jul 2014 14:15:09 +0200
Subject: decoder/dsf: Allow up to DSD512. Enable DSD rates based on Fs=48kHz

---
 src/decoder/plugins/DsdLib.cxx           | 19 +++++++++++++++++++
 src/decoder/plugins/DsdLib.hxx           |  7 +++++++
 src/decoder/plugins/DsfDecoderPlugin.cxx |  2 +-
 3 files changed, 27 insertions(+), 1 deletion(-)

(limited to 'src/decoder')

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
@@ -66,6 +66,13 @@ bool
 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);
-- 
cgit v1.2.3