diff --git a/src/decoder/DecoderAPI.cxx b/src/decoder/DecoderAPI.cxx index b214b91a8..ae600260f 100644 --- a/src/decoder/DecoderAPI.cxx +++ b/src/decoder/DecoderAPI.cxx @@ -31,6 +31,7 @@ #include "DetachedSong.hxx" #include "input/InputStream.hxx" #include "util/Error.hxx" +#include "util/ConstBuffer.hxx" #include "Log.hxx" #include @@ -472,9 +473,8 @@ decoder_data(Decoder &decoder, assert(dc.in_audio_format != dc.out_audio_format); Error error; - data = decoder.convert->Convert(data, length, - &length, - error); + auto result = decoder.convert->Convert({data, length}, + error); if (data == nullptr) { /* the PCM conversion has failed - stop playback, since we have no better way to @@ -482,6 +482,9 @@ decoder_data(Decoder &decoder, LogError(error); return DecoderCommand::STOP; } + + data = result.data; + length = result.size; } else { assert(dc.in_audio_format == dc.out_audio_format); } diff --git a/src/filter/plugins/ConvertFilterPlugin.cxx b/src/filter/plugins/ConvertFilterPlugin.cxx index 27e6774f8..535330cfe 100644 --- a/src/filter/plugins/ConvertFilterPlugin.cxx +++ b/src/filter/plugins/ConvertFilterPlugin.cxx @@ -24,6 +24,7 @@ #include "filter/FilterRegistry.hxx" #include "pcm/PcmConvert.hxx" #include "util/Manual.hxx" +#include "util/ConstBuffer.hxx" #include "AudioFormat.hxx" #include "poison.h" @@ -130,8 +131,9 @@ ConvertFilter::FilterPCM(const void *src, size_t src_size, return src; } - return state->Convert(src, src_size, dest_size_r, - error); + auto result = state->Convert({src, src_size}, error); + *dest_size_r = result.size; + return result.data; } const struct filter_plugin convert_filter_plugin = { diff --git a/src/pcm/PcmConvert.cxx b/src/pcm/PcmConvert.cxx index ad79e60fc..ba9a691fc 100644 --- a/src/pcm/PcmConvert.cxx +++ b/src/pcm/PcmConvert.cxx @@ -117,12 +117,9 @@ PcmConvert::Close() #endif } -const void * -PcmConvert::Convert(const void *src, size_t src_size, - size_t *dest_size_r, - Error &error) +ConstBuffer +PcmConvert::Convert(ConstBuffer buffer, Error &error) { - ConstBuffer buffer(src, src_size); AudioFormat format = src_format; if (format.format == SampleFormat::DSD) { @@ -164,6 +161,5 @@ PcmConvert::Convert(const void *src, size_t src_size, format.channels = dest_format.channels; } - *dest_size_r = buffer.size; - return buffer.data; + return buffer; } diff --git a/src/pcm/PcmConvert.hxx b/src/pcm/PcmConvert.hxx index c65835421..9d63e07c9 100644 --- a/src/pcm/PcmConvert.hxx +++ b/src/pcm/PcmConvert.hxx @@ -70,16 +70,12 @@ public: * * @param src_format the source audio format * @param src the source PCM buffer - * @param src_size the size of #src in bytes * @param dest_format the requested destination audio format - * @param dest_size_r returns the number of bytes of the destination buffer * @param error_r location to store the error occurring, or nullptr to * ignore errors * @return the destination buffer, or nullptr on error */ - const void *Convert(const void *src, size_t src_size, - size_t *dest_size_r, - Error &error); + ConstBuffer Convert(ConstBuffer src, Error &error); }; bool diff --git a/test/run_convert.cxx b/test/run_convert.cxx index 47d9eae86..8b9b15cf0 100644 --- a/test/run_convert.cxx +++ b/test/run_convert.cxx @@ -28,6 +28,7 @@ #include "AudioFormat.hxx" #include "pcm/PcmConvert.hxx" #include "config/ConfigGlobal.hxx" +#include "util/ConstBuffer.hxx" #include "util/StaticFifoBuffer.hxx" #include "util/Error.hxx" #include "Log.hxx" @@ -48,7 +49,6 @@ config_get_string(gcc_unused enum ConfigOption option, int main(int argc, char **argv) { AudioFormat in_audio_format, out_audio_format; - const void *output; if (argc != 3) { fprintf(stderr, @@ -104,16 +104,15 @@ int main(int argc, char **argv) buffer.Consume(src.size); - size_t length; - output = state.Convert(src.data, src.size, - &length, error); - if (output == NULL) { + auto output = state.Convert({src.data, src.size}, error); + if (output.IsNull()) { state.Close(); LogError(error, "Failed to convert"); return EXIT_FAILURE; } - gcc_unused ssize_t ignored = write(1, output, length); + gcc_unused ssize_t ignored = write(1, output.data, + output.size); } state.Close();