From 74cdc0005a032c5473027e372eee3a522ccaf750 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 21 Aug 2014 17:11:48 +0200 Subject: decoder/dsf: eliminate temporary buffer Convert into a second buffer that gets passed to decoder_data() without copying back to the first buffer. --- src/decoder/plugins/DsfDecoderPlugin.cxx | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) (limited to 'src/decoder') diff --git a/src/decoder/plugins/DsfDecoderPlugin.cxx b/src/decoder/plugins/DsfDecoderPlugin.cxx index 9f10b8dfc..d99550df1 100644 --- a/src/decoder/plugins/DsfDecoderPlugin.cxx +++ b/src/decoder/plugins/DsfDecoderPlugin.cxx @@ -39,8 +39,6 @@ #include "tag/TagHandler.hxx" #include "Log.hxx" -#include - static constexpr unsigned DSF_BLOCK_SIZE = 4096; struct DsfMetaData { @@ -197,22 +195,17 @@ bit_reverse_buffer(uint8_t *p, uint8_t *end) * order. */ static void -dsf_to_pcm_order(uint8_t *dest, size_t nrbytes) +dsf_to_pcm_order(uint8_t *dest, const uint8_t *src, size_t nrbytes) { - uint8_t scratch[DSF_BLOCK_SIZE * 2]; - assert(nrbytes <= sizeof(scratch)); - for (size_t i = 0, j = 0; i < nrbytes; i += 2) { - scratch[i] = *(dest+j); + dest[i] = src[j]; j++; } for (size_t i = 1, j = 0; i < nrbytes; i += 2) { - scratch[i] = *(dest + DSF_BLOCK_SIZE + j); + dest[i] = src[DSF_BLOCK_SIZE + j]; j++; } - - memcpy(dest, scratch, nrbytes); } /** @@ -250,9 +243,11 @@ dsf_decode_chunk(Decoder &decoder, InputStream &is, if (bitreverse) bit_reverse_buffer(buffer, buffer + nbytes); - dsf_to_pcm_order(buffer, nbytes); + uint8_t interleaved_buffer[DSF_BLOCK_SIZE * 2]; + dsf_to_pcm_order(interleaved_buffer, buffer, nbytes); - const auto cmd = decoder_data(decoder, is, buffer, nbytes, + const auto cmd = decoder_data(decoder, is, + interleaved_buffer, nbytes, sample_rate / 1000); switch (cmd) { case DecoderCommand::NONE: -- cgit v1.2.3