From f0f3017a7663f51bc830bd10087434e37d8fb258 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 26 Feb 2016 18:54:13 +0100 Subject: [PATCH] pcm/export: move Open() parameters to struct Params --- src/output/plugins/AlsaOutputPlugin.cxx | 16 +++++++----- src/output/plugins/OssOutputPlugin.cxx | 11 +++++--- src/pcm/PcmExport.cxx | 16 +++++------- src/pcm/PcmExport.hxx | 11 ++++++-- test/test_pcm_export.cxx | 34 +++++++++++++++++++------ 5 files changed, 58 insertions(+), 30 deletions(-) diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 36d715076..c051517cf 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -716,22 +716,24 @@ AlsaOutput::SetupDop(const AudioFormat audio_format, inline bool AlsaOutput::SetupOrDop(AudioFormat &audio_format, Error &error) { - bool shift8 = false, packed, reverse_endian; + PcmExport::Params params; + params.alsa_channel_order = true; - const bool dop2 = dop && - audio_format.format == SampleFormat::DSD; - const bool success = dop2 + params.dop = dop && audio_format.format == SampleFormat::DSD; + const bool success = params.dop ? SetupDop(audio_format, - &shift8, &packed, &reverse_endian, + ¶ms.shift8, + ¶ms.pack24, ¶ms.reverse_endian, error) - : alsa_setup(this, audio_format, &packed, &reverse_endian, + : alsa_setup(this, audio_format, + ¶ms.pack24, ¶ms.reverse_endian, error); if (!success) return false; pcm_export->Open(audio_format.format, audio_format.channels, - true, dop2, shift8, packed, reverse_endian); + params); return true; } diff --git a/src/output/plugins/OssOutputPlugin.cxx b/src/output/plugins/OssOutputPlugin.cxx index ee1eb41a1..e54925f65 100644 --- a/src/output/plugins/OssOutputPlugin.cxx +++ b/src/output/plugins/OssOutputPlugin.cxx @@ -537,10 +537,13 @@ oss_probe_sample_format(int fd, SampleFormat sample_format, *oss_format_r = oss_format; #ifdef AFMT_S24_PACKED - pcm_export.Open(sample_format, 0, true, false, false, - oss_format == AFMT_S24_PACKED, - oss_format == AFMT_S24_PACKED && - !IsLittleEndian()); + PcmExport::Params params; + params.alsa_channel_order = true; + params.pack24 = oss_format == AFMT_S24_PACKED; + params.reverse_endian = oss_format == AFMT_S24_PACKED && + !IsLittleEndian(); + + pcm_export.Open(sample_format, 0, params); #endif return SUCCESS; diff --git a/src/pcm/PcmExport.cxx b/src/pcm/PcmExport.cxx index 4b9108cd1..b40129ad1 100644 --- a/src/pcm/PcmExport.cxx +++ b/src/pcm/PcmExport.cxx @@ -32,35 +32,33 @@ void PcmExport::Open(SampleFormat sample_format, unsigned _channels, - bool _alsa_channel_order, - bool _dop, bool _shift8, bool _pack, bool _reverse_endian) + Params params) { assert(audio_valid_sample_format(sample_format)); channels = _channels; - alsa_channel_order = _alsa_channel_order + alsa_channel_order = params.alsa_channel_order ? sample_format : SampleFormat::UNDEFINED; #ifdef ENABLE_DSD - assert(!_dop || audio_valid_channel_count(_channels)); - dop = _dop && sample_format == SampleFormat::DSD; + assert(!params.dop || audio_valid_channel_count(_channels)); + dop = params.dop && sample_format == SampleFormat::DSD; if (dop) /* after the conversion to DoP, the DSD samples are stuffed inside fake 24 bit samples */ sample_format = SampleFormat::S24_P32; #else (void)_channels; - (void)_dop; #endif - shift8 = _shift8 && sample_format == SampleFormat::S24_P32; - pack24 = _pack && sample_format == SampleFormat::S24_P32; + shift8 = params.shift8 && sample_format == SampleFormat::S24_P32; + pack24 = params.pack24 && sample_format == SampleFormat::S24_P32; assert(!shift8 || !pack24); reverse_endian = 0; - if (_reverse_endian) { + if (params.reverse_endian) { size_t sample_size = pack24 ? 3 : sample_format_size(sample_format); diff --git a/src/pcm/PcmExport.hxx b/src/pcm/PcmExport.hxx index 61ccddb0d..a03cdc903 100644 --- a/src/pcm/PcmExport.hxx +++ b/src/pcm/PcmExport.hxx @@ -33,6 +33,14 @@ template struct ConstBuffer; * representation which are not supported by the pcm_convert library. */ struct PcmExport { + struct Params { + bool alsa_channel_order = false; + bool dop = false; + bool shift8 = false; + bool pack24 = false; + bool reverse_endian = false; + }; + /** * This buffer is used to reorder channels. * @@ -117,8 +125,7 @@ struct PcmExport { * @param channels the number of channels; ignored unless dop is set */ void Open(SampleFormat sample_format, unsigned channels, - bool _alsa_channel_order, - bool dop, bool shift8, bool pack, bool reverse_endian); + Params params); /** * Calculate the size of one output frame. diff --git a/test/test_pcm_export.cxx b/test/test_pcm_export.cxx index 085a4e64e..cea0de634 100644 --- a/test/test_pcm_export.cxx +++ b/test/test_pcm_export.cxx @@ -32,8 +32,11 @@ PcmExportTest::TestShift8() static constexpr int32_t src[] = { 0x0, 0x1, 0x100, 0x10000, 0xffffff }; static constexpr uint32_t expected[] = { 0x0, 0x100, 0x10000, 0x1000000, 0xffffff00 }; + PcmExport::Params params; + params.shift8 = true; + PcmExport e; - e.Open(SampleFormat::S24_P32, 2, false, false, true, false, false); + e.Open(SampleFormat::S24_P32, 2, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size); @@ -65,8 +68,11 @@ PcmExportTest::TestPack24() static const uint8_t *const expected = IsBigEndian() ? expected_be : expected_le; + PcmExport::Params params; + params.pack24 = true; + PcmExport e; - e.Open(SampleFormat::S24_P32, 2, false, false, false, true, false); + e.Open(SampleFormat::S24_P32, 2, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(expected_size, dest.size); @@ -88,19 +94,22 @@ PcmExportTest::TestReverseEndian() 4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, }; + PcmExport::Params params; + params.reverse_endian = true; + PcmExport e; - e.Open(SampleFormat::S8, 2, false, false, false, false, true); + e.Open(SampleFormat::S8, 2, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(src), dest.size); CPPUNIT_ASSERT(memcmp(dest.data, src, dest.size) == 0); - e.Open(SampleFormat::S16, 2, false, false, false, false, true); + e.Open(SampleFormat::S16, 2, params); dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected2), dest.size); CPPUNIT_ASSERT(memcmp(dest.data, expected2, dest.size) == 0); - e.Open(SampleFormat::S32, 2, false, false, false, false, true); + e.Open(SampleFormat::S32, 2, params); dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected4), dest.size); CPPUNIT_ASSERT(memcmp(dest.data, expected4, dest.size) == 0); @@ -121,8 +130,11 @@ PcmExportTest::TestDop() 0xfffaabef, }; + PcmExport::Params params; + params.dop = true; + PcmExport e; - e.Open(SampleFormat::DSD, 2, false, true, false, false, false); + e.Open(SampleFormat::DSD, 2, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size); @@ -145,8 +157,11 @@ TestAlsaChannelOrder51() 6, 7, 10, 11, 8, 9, }; + PcmExport::Params params; + params.alsa_channel_order = true; + PcmExport e; - e.Open(F, 6, true, false, false, false, false); + e.Open(F, 6, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size); @@ -169,8 +184,11 @@ TestAlsaChannelOrder71() 8, 9, 12, 13, 10, 11, 14, 15, }; + PcmExport::Params params; + params.alsa_channel_order = true; + PcmExport e; - e.Open(F, 8, true, false, false, false, false); + e.Open(F, 8, params); auto dest = e.Export({src, sizeof(src)}); CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size);