pcm/Export: halve the sample rate for DoP

Move this sample rate fixup from the ALSA output plugin to PcmExport,
where it belongs.
This commit is contained in:
Max Kellermann 2017-01-11 00:11:43 +01:00
parent 2b43ceb6c6
commit 9c4df66925
3 changed files with 13 additions and 2 deletions

View File

@ -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 &params)
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;
}
}

View File

@ -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;

View File

@ -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);