diff options
Diffstat (limited to '')
-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 |
4 files changed, 31 insertions, 38 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() |