From a788b7e747bc21b9aadee45dd028fa6198af794e Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 28 Nov 2013 18:43:33 +0100 Subject: PcmConvert: fix src_format corruption when converting from DSD Method PcmConvert::Convert() modifies the src_format variable. This used to be a parameter, however commit d2679f59c made it an attribute instead. The modification to src_format persisted, and the next call would return garbage. --- src/pcm/PcmConvert.cxx | 11 +++++------ src/pcm/PcmConvert.hxx | 7 +++++++ 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pcm/PcmConvert.cxx b/src/pcm/PcmConvert.cxx index cca2f701e..05ed92faf 100644 --- a/src/pcm/PcmConvert.cxx +++ b/src/pcm/PcmConvert.cxx @@ -56,6 +56,10 @@ PcmConvert::Open(AudioFormat _src_format, AudioFormat _dest_format, src_format = _src_format; dest_format = _dest_format; + is_dsd = src_format.format == SampleFormat::DSD; + if (is_dsd) + src_format.format = SampleFormat::FLOAT; + return true; } @@ -277,8 +281,7 @@ PcmConvert::Convert(const void *src, size_t src_size, size_t *dest_size_r, Error &error) { - AudioFormat float_format; - if (src_format.format == SampleFormat::DSD) { + if (is_dsd) { size_t f_size; const float *f = dsd.ToFloat(src_format.channels, false, (const uint8_t *)src, @@ -289,10 +292,6 @@ PcmConvert::Convert(const void *src, size_t src_size, return nullptr; } - float_format = src_format; - float_format.format = SampleFormat::FLOAT; - - src_format = float_format; src = f; src_size = f_size; } diff --git a/src/pcm/PcmConvert.hxx b/src/pcm/PcmConvert.hxx index 02743b6cc..0672c2955 100644 --- a/src/pcm/PcmConvert.hxx +++ b/src/pcm/PcmConvert.hxx @@ -51,6 +51,13 @@ class PcmConvert { AudioFormat src_format, dest_format; + /** + * Do we get DSD source data? Then this flag is true and + * src_format.format is set to SampleFormat::FLOAT, because + * the #PcmDsd class will convert it to floating point. + */ + bool is_dsd; + public: PcmConvert(); ~PcmConvert(); -- cgit v1.2.3