From 9c4df669253e1b01f20ff4d496c15a8bed4a00ac Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 11 Jan 2017 00:11:43 +0100 Subject: [PATCH] pcm/Export: halve the sample rate for DoP Move this sample rate fixup from the ALSA output plugin to PcmExport, where it belongs. --- src/output/plugins/AlsaOutputPlugin.cxx | 4 ++-- src/pcm/PcmExport.cxx | 8 ++++++++ test/test_pcm_export.cxx | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 6b5405f87..90b74c0bb 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -666,7 +666,6 @@ AlsaOutput::SetupDop(const AudioFormat audio_format, AudioFormat dop_format = audio_format; dop_format.format = SampleFormat::S24_P32; - dop_format.sample_rate /= 2; const AudioFormat check = dop_format; @@ -698,11 +697,12 @@ AlsaOutput::SetupOrDop(AudioFormat &audio_format, PcmExport::Params ¶ms) std::exception_ptr dop_error; if (dop && audio_format.format == SampleFormat::DSD) { try { - SetupDop(audio_format, params); params.dop = true; + SetupDop(audio_format, params); return; } catch (...) { dop_error = std::current_exception(); + params.dop = false; } } diff --git a/src/pcm/PcmExport.cxx b/src/pcm/PcmExport.cxx index ed8ab1707..254995d38 100644 --- a/src/pcm/PcmExport.cxx +++ b/src/pcm/PcmExport.cxx @@ -106,6 +106,11 @@ PcmExport::Params::CalcOutputSampleRate(unsigned sample_rate) const /* DSD_U32 combines four 8-bit "samples" in one 32-bit "sample" */ sample_rate /= 4; + + if (dop) + /* DoP packs two 8-bit "samples" in one 24-bit + "sample" */ + sample_rate /= 2; #endif return sample_rate; @@ -117,6 +122,9 @@ PcmExport::Params::CalcInputSampleRate(unsigned sample_rate) const #ifdef ENABLE_DSD if (dsd_u32) sample_rate *= 4; + + if (dop) + sample_rate *= 2; #endif return sample_rate; diff --git a/test/test_pcm_export.cxx b/test/test_pcm_export.cxx index 5dded1367..3817b6cf1 100644 --- a/test/test_pcm_export.cxx +++ b/test/test_pcm_export.cxx @@ -175,6 +175,9 @@ PcmExportTest::TestDop() PcmExport::Params params; params.dop = true; + CPPUNIT_ASSERT_EQUAL(params.CalcOutputSampleRate(705600u), 176400u); + CPPUNIT_ASSERT_EQUAL(params.CalcInputSampleRate(176400u), 705600u); + PcmExport e; e.Open(SampleFormat::DSD, 2, params);