diff options
-rw-r--r-- | src/output/plugins/AlsaOutputPlugin.cxx | 5 | ||||
-rw-r--r-- | src/output/plugins/OssOutputPlugin.cxx | 5 | ||||
-rw-r--r-- | src/pcm/PcmExport.cxx | 53 | ||||
-rw-r--r-- | src/pcm/PcmExport.hxx | 6 | ||||
-rw-r--r-- | test/test_pcm_export.cxx | 41 |
5 files changed, 50 insertions, 60 deletions
diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index f798bac63..a66561f0b 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -25,6 +25,7 @@ #include "util/Manual.hxx" #include "util/Error.hxx" #include "util/Domain.hxx" +#include "util/ConstBuffer.hxx" #include "Log.hxx" #include <alsa/asoundlib.h> @@ -809,7 +810,9 @@ alsa_play(AudioOutput *ao, const void *chunk, size_t size, } } - chunk = ad->pcm_export->Export(chunk, size, size); + const auto e = ad->pcm_export->Export({chunk, size}); + chunk = e.data; + size = e.size; assert(size % ad->out_frame_size == 0); diff --git a/src/output/plugins/OssOutputPlugin.cxx b/src/output/plugins/OssOutputPlugin.cxx index 05b14b29f..f2618491c 100644 --- a/src/output/plugins/OssOutputPlugin.cxx +++ b/src/output/plugins/OssOutputPlugin.cxx @@ -22,6 +22,7 @@ #include "../OutputAPI.hxx" #include "mixer/MixerList.hxx" #include "system/fd_util.h" +#include "util/ConstBuffer.hxx" #include "util/Error.hxx" #include "util/Domain.hxx" #include "util/Macros.hxx" @@ -728,7 +729,9 @@ oss_output_play(AudioOutput *ao, const void *chunk, size_t size, return 0; #ifdef AFMT_S24_PACKED - chunk = od->pcm_export->Export(chunk, size, size); + const auto e = od->pcm_export->Export({chunk, size}); + chunk = e.data; + size = e.size; #endif while (true) { diff --git a/src/pcm/PcmExport.cxx b/src/pcm/PcmExport.cxx index fc3ef57ca..e04a7fdd9 100644 --- a/src/pcm/PcmExport.cxx +++ b/src/pcm/PcmExport.cxx @@ -22,6 +22,7 @@ #include "PcmDsdUsb.hxx" #include "PcmPack.hxx" #include "util/ByteReverse.hxx" +#include "util/ConstBuffer.hxx" void PcmExport::Open(SampleFormat sample_format, unsigned _channels, @@ -71,59 +72,47 @@ PcmExport::GetFrameSize(const AudioFormat &audio_format) const return audio_format.GetFrameSize(); } -const void * -PcmExport::Export(const void *data, size_t size, size_t &dest_size_r) +ConstBuffer<void> +PcmExport::Export(ConstBuffer<void> data) { if (dsd_usb) - data = pcm_dsd_to_usb(dsd_buffer, channels, - (const uint8_t *)data, size, &size); + data.data = pcm_dsd_to_usb(dsd_buffer, channels, + (const uint8_t *)data.data, + data.size, &data.size); if (pack24) { - assert(size % 4 == 0); - - const size_t num_samples = size / 4; + const auto src = ConstBuffer<int32_t>::FromVoid(data); + const size_t num_samples = src.size; const size_t dest_size = num_samples * 3; - - const uint8_t *src8 = (const uint8_t *)data; - const uint8_t *src_end8 = src8 + size; uint8_t *dest = (uint8_t *)pack_buffer.Get(dest_size); assert(dest != nullptr); - pcm_pack_24(dest, (const int32_t *)src8, - (const int32_t *)src_end8); + pcm_pack_24(dest, src.begin(), src.end()); - data = dest; - size = dest_size; + data.data = dest; + data.size = dest_size; } else if (shift8) { - assert(size % 4 == 0); - - const uint8_t *src8 = (const uint8_t *)data; - const uint8_t *src_end8 = src8 + size; - const uint32_t *src = (const uint32_t *)src8; - const uint32_t *const src_end = (const uint32_t *)src_end8; + const auto src = ConstBuffer<int32_t>::FromVoid(data); - uint32_t *dest = (uint32_t *)pack_buffer.Get(size); - data = dest; + uint32_t *dest = (uint32_t *)pack_buffer.Get(data.size); + data.data = dest; - while (src < src_end) - *dest++ = *src++ << 8; + for (auto i : src) + *dest++ = i << 8; } - if (reverse_endian > 0) { assert(reverse_endian >= 2); - uint8_t *dest = (uint8_t *)reverse_buffer.Get(size); - assert(dest != nullptr); + const auto src = ConstBuffer<uint8_t>::FromVoid(data); - const uint8_t *src = (const uint8_t *)data; - const uint8_t *src_end = src + size; - reverse_bytes(dest, src, src_end, reverse_endian); + uint8_t *dest = (uint8_t *)reverse_buffer.Get(data.size); + assert(dest != nullptr); + data.data = dest; - data = dest; + reverse_bytes(dest, src.begin(), src.end(), reverse_endian); } - dest_size_r = size; return data; } diff --git a/src/pcm/PcmExport.hxx b/src/pcm/PcmExport.hxx index 61ac14c6f..75050e5c2 100644 --- a/src/pcm/PcmExport.hxx +++ b/src/pcm/PcmExport.hxx @@ -25,6 +25,7 @@ #include "AudioFormat.hxx" struct AudioFormat; +template<typename T> struct ConstBuffer; /** * An object that handles export of PCM samples to some instance @@ -108,12 +109,9 @@ struct PcmExport { * * @param state an initialized and open pcm_export_state object * @param src the source PCM buffer - * @param src_size the size of #src in bytes - * @param dest_size_r returns the number of bytes of the destination buffer * @return the destination buffer (may be a pointer to the source buffer) */ - const void *Export(const void *src, size_t src_size, - size_t &dest_size_r); + ConstBuffer<void> Export(ConstBuffer<void> src); /** * Converts the number of consumed bytes from the pcm_export() diff --git a/test/test_pcm_export.cxx b/test/test_pcm_export.cxx index ae9bce3f8..88c1974e3 100644 --- a/test/test_pcm_export.cxx +++ b/test/test_pcm_export.cxx @@ -21,6 +21,7 @@ #include "test_pcm_all.hxx" #include "pcm/PcmExport.hxx" #include "system/ByteOrder.hxx" +#include "util/ConstBuffer.hxx" #include <string.h> @@ -33,10 +34,9 @@ PcmExportTest::TestShift8() PcmExport e; e.Open(SampleFormat::S24_P32, 2, false, true, false, false); - size_t dest_size; - auto dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest_size); - CPPUNIT_ASSERT(memcmp(dest, expected, dest_size) == 0); + auto dest = e.Export({src, sizeof(src)}); + CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size); + CPPUNIT_ASSERT(memcmp(dest.data, expected, dest.size) == 0); } void @@ -67,10 +67,9 @@ PcmExportTest::TestPack24() PcmExport e; e.Open(SampleFormat::S24_P32, 2, false, false, true, false); - size_t dest_size; - auto dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(expected_size, dest_size); - CPPUNIT_ASSERT(memcmp(dest, expected, dest_size) == 0); + auto dest = e.Export({src, sizeof(src)}); + CPPUNIT_ASSERT_EQUAL(expected_size, dest.size); + CPPUNIT_ASSERT(memcmp(dest.data, expected, dest.size) == 0); } void @@ -91,20 +90,19 @@ PcmExportTest::TestReverseEndian() PcmExport e; e.Open(SampleFormat::S8, 2, false, false, false, true); - size_t dest_size; - auto dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(sizeof(src), dest_size); - CPPUNIT_ASSERT(memcmp(dest, src, dest_size) == 0); + 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, true); - dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(sizeof(expected2), dest_size); - CPPUNIT_ASSERT(memcmp(dest, expected2, dest_size) == 0); + 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, true); - dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(sizeof(expected4), dest_size); - CPPUNIT_ASSERT(memcmp(dest, expected4, dest_size) == 0); + dest = e.Export({src, sizeof(src)}); + CPPUNIT_ASSERT_EQUAL(sizeof(expected4), dest.size); + CPPUNIT_ASSERT(memcmp(dest.data, expected4, dest.size) == 0); } void @@ -125,8 +123,7 @@ PcmExportTest::TestDsdUsb() PcmExport e; e.Open(SampleFormat::DSD, 2, true, false, false, false); - size_t dest_size; - auto dest = e.Export(src, sizeof(src), dest_size); - CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest_size); - CPPUNIT_ASSERT(memcmp(dest, expected, dest_size) == 0); + auto dest = e.Export({src, sizeof(src)}); + CPPUNIT_ASSERT_EQUAL(sizeof(expected), dest.size); + CPPUNIT_ASSERT(memcmp(dest.data, expected, dest.size) == 0); } |