From 39114f91a7c39c3da9a097f0bc63c08b2b74bf0f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 17 Jan 2017 22:04:31 +0100 Subject: [PATCH] AudioFormat: replace struct audio_format_string with class StringBuffer, return it --- src/AudioFormat.cxx | 13 ++++++------- src/AudioFormat.hxx | 19 +++++++------------ src/command/PlayerCommands.cxx | 9 +++------ src/decoder/Bridge.cxx | 8 +++----- src/filter/plugins/ChainFilterPlugin.cxx | 4 ++-- src/output/OutputThread.cxx | 15 ++++++--------- test/FakeDecoderAPI.cxx | 5 ++--- test/TestAudioFormat.cxx | 8 +++----- test/run_filter.cxx | 4 ++-- test/run_output.cxx | 4 ++-- 10 files changed, 36 insertions(+), 53 deletions(-) diff --git a/src/AudioFormat.cxx b/src/AudioFormat.cxx index a374bc02e..c3ebb2e6f 100644 --- a/src/AudioFormat.cxx +++ b/src/AudioFormat.cxx @@ -18,6 +18,7 @@ */ #include "AudioFormat.hxx" +#include "util/StringBuffer.hxx" #include #include @@ -40,15 +41,13 @@ AudioFormat::ApplyMask(AudioFormat mask) assert(IsValid()); } -const char * -audio_format_to_string(const AudioFormat af, - struct audio_format_string *s) +StringBuffer<24> +ToString(const AudioFormat af) { - assert(s != nullptr); - - snprintf(s->buffer, sizeof(s->buffer), "%u:%s:%u", + StringBuffer<24> buffer; + snprintf(buffer.data(), buffer.capacity(), "%u:%s:%u", af.sample_rate, sample_format_to_string(af.format), af.channels); - return s->buffer; + return buffer; } diff --git a/src/AudioFormat.hxx b/src/AudioFormat.hxx index f39dc21e7..09fe99405 100644 --- a/src/AudioFormat.hxx +++ b/src/AudioFormat.hxx @@ -23,8 +23,11 @@ #include "pcm/SampleFormat.hxx" #include "Compiler.h" -#include #include +#include +#include + +template class StringBuffer; static constexpr unsigned MAX_CHANNELS = 8; @@ -147,13 +150,6 @@ struct AudioFormat { double GetTimeToSize() const; }; -/** - * Buffer for audio_format_string(). - */ -struct audio_format_string { - char buffer[24]; -}; - /** * Checks whether the sample rate is valid. * @@ -226,9 +222,8 @@ AudioFormat::GetTimeToSize() const * @param s a buffer to print into * @return the string, or nullptr if the #AudioFormat object is invalid */ -gcc_pure gcc_malloc -const char * -audio_format_to_string(AudioFormat af, - struct audio_format_string *s); +gcc_const +StringBuffer<24> +ToString(AudioFormat af); #endif diff --git a/src/command/PlayerCommands.cxx b/src/command/PlayerCommands.cxx index f843bc5ff..a48890028 100644 --- a/src/command/PlayerCommands.cxx +++ b/src/command/PlayerCommands.cxx @@ -30,6 +30,7 @@ #include "Instance.hxx" #include "Idle.hxx" #include "AudioFormat.hxx" +#include "util/StringBuffer.hxx" #include "util/ScopeExit.hxx" #include "util/Exception.hxx" @@ -171,13 +172,9 @@ handle_status(Client &client, gcc_unused Request args, Response &r) r.Format("duration: %1.3f\n", player_status.total_time.ToDoubleS()); - if (player_status.audio_format.IsDefined()) { - struct audio_format_string af_string; - + if (player_status.audio_format.IsDefined()) r.Format(COMMAND_STATUS_AUDIO ": %s\n", - audio_format_to_string(player_status.audio_format, - &af_string)); - } + ToString(player_status.audio_format).c_str()); } #ifdef ENABLE_DATABASE diff --git a/src/decoder/Bridge.cxx b/src/decoder/Bridge.cxx index 0df3eb39e..201e6a1aa 100644 --- a/src/decoder/Bridge.cxx +++ b/src/decoder/Bridge.cxx @@ -32,6 +32,7 @@ #include "Log.hxx" #include "input/InputStream.hxx" #include "util/ConstBuffer.hxx" +#include "util/StringBuffer.hxx" #include #include @@ -246,15 +247,13 @@ void DecoderBridge::Ready(const AudioFormat audio_format, bool seekable, SignedSongTime duration) { - struct audio_format_string af_string; - assert(convert == nullptr); assert(stream_tag == nullptr); assert(decoder_tag == nullptr); assert(!seeking); FormatDebug(decoder_domain, "audio_format=%s, seekable=%s", - audio_format_to_string(audio_format, &af_string), + ToString(audio_format).c_str(), seekable ? "true" : "false"); { @@ -264,8 +263,7 @@ DecoderBridge::Ready(const AudioFormat audio_format, if (dc.in_audio_format != dc.out_audio_format) { FormatDebug(decoder_domain, "converting to %s", - audio_format_to_string(dc.out_audio_format, - &af_string)); + ToString(dc.out_audio_format).c_str()); convert = new PcmConvert(); diff --git a/src/filter/plugins/ChainFilterPlugin.cxx b/src/filter/plugins/ChainFilterPlugin.cxx index db62c70b1..d7c3525ee 100644 --- a/src/filter/plugins/ChainFilterPlugin.cxx +++ b/src/filter/plugins/ChainFilterPlugin.cxx @@ -24,6 +24,7 @@ #include "filter/FilterRegistry.hxx" #include "AudioFormat.hxx" #include "util/ConstBuffer.hxx" +#include "util/StringBuffer.hxx" #include "util/RuntimeError.hxx" #include @@ -108,10 +109,9 @@ PreparedChainFilter::Child::Open(const AudioFormat &prev_audio_format) if (conv_audio_format != prev_audio_format) { delete new_filter; - struct audio_format_string s; throw FormatRuntimeError("Audio format not supported by filter '%s': %s", name, - audio_format_to_string(prev_audio_format, &s)); + ToString(prev_audio_format).c_str()); } return new_filter; diff --git a/src/output/OutputThread.cxx b/src/output/OutputThread.cxx index 047dbe0c0..c2ee2ccfc 100644 --- a/src/output/OutputThread.cxx +++ b/src/output/OutputThread.cxx @@ -35,6 +35,7 @@ #include "thread/Slack.hxx" #include "thread/Name.hxx" #include "util/ConstBuffer.hxx" +#include "util/StringBuffer.hxx" #include "util/ScopeExit.hxx" #include "util/RuntimeError.hxx" #include "Log.hxx" @@ -154,14 +155,11 @@ AudioOutput::Open() } } - if (f != source.GetInputAudioFormat() || f != out_audio_format) { - struct audio_format_string afs1, afs2, afs3; + if (f != source.GetInputAudioFormat() || f != out_audio_format) FormatDebug(output_domain, "converting in=%s -> f=%s -> out=%s", - audio_format_to_string(source.GetInputAudioFormat(), - &afs1), - audio_format_to_string(f, &afs2), - audio_format_to_string(out_audio_format, &afs3)); - } + ToString(source.GetInputAudioFormat()).c_str(), + ToString(f).c_str(), + ToString(out_audio_format).c_str()); } void @@ -176,11 +174,10 @@ AudioOutput::OpenOutputAndConvert(AudioFormat desired_audio_format) name, plugin.name)); } - struct audio_format_string af_string; FormatDebug(output_domain, "opened plugin=%s name=\"%s\" audio_format=%s", plugin.name, name, - audio_format_to_string(out_audio_format, &af_string)); + ToString(out_audio_format).c_str()); try { convert_filter_set(convert_filter.Get(), out_audio_format); diff --git a/test/FakeDecoderAPI.cxx b/test/FakeDecoderAPI.cxx index 514875ee3..2310c335c 100644 --- a/test/FakeDecoderAPI.cxx +++ b/test/FakeDecoderAPI.cxx @@ -21,6 +21,7 @@ #include "FakeDecoderAPI.hxx" #include "decoder/DecoderAPI.hxx" #include "input/InputStream.hxx" +#include "util/StringBuffer.hxx" #include "Compiler.h" #include @@ -33,13 +34,11 @@ FakeDecoder::Ready(const AudioFormat audio_format, gcc_unused bool seekable, SignedSongTime duration) { - struct audio_format_string af_string; - assert(!initialized); assert(audio_format.IsValid()); fprintf(stderr, "audio_format=%s duration=%f\n", - audio_format_to_string(audio_format, &af_string), + ToString(audio_format).c_str(), duration.ToDoubleS()); initialized = true; diff --git a/test/TestAudioFormat.cxx b/test/TestAudioFormat.cxx index 10408677f..a29bf1b9d 100644 --- a/test/TestAudioFormat.cxx +++ b/test/TestAudioFormat.cxx @@ -21,6 +21,7 @@ #include "TestAudioFormat.hxx" #include "AudioFormat.hxx" #include "AudioParser.hxx" +#include "util/StringBuffer.hxx" #include @@ -51,8 +52,7 @@ struct assertion_traits static std::string toString(AudioFormat x) { - struct audio_format_string s; - return audio_format_to_string(x, &s); + return ToString(x).c_str(); } }; } @@ -80,10 +80,8 @@ static constexpr AudioFormatStringTest af_mask_tests[] = { void AudioFormatTest::TestToString() { - struct audio_format_string s; - for (const auto &i : af_string_tests) - CPPUNIT_ASSERT_EQUAL(i.s, audio_format_to_string(i.af, &s)); + CPPUNIT_ASSERT_EQUAL(i.s, ToString(i.af).c_str()); } void diff --git a/test/run_filter.cxx b/test/run_filter.cxx index 0fa6081a3..2251cf1c4 100644 --- a/test/run_filter.cxx +++ b/test/run_filter.cxx @@ -28,6 +28,7 @@ #include "pcm/Volume.hxx" #include "mixer/MixerControl.hxx" #include "util/ConstBuffer.hxx" +#include "util/StringBuffer.hxx" #include "system/FatalError.hxx" #include "Log.hxx" @@ -62,7 +63,6 @@ load_filter(const char *name) int main(int argc, char **argv) try { - struct audio_format_string af_string; char buffer[4096]; if (argc < 3 || argc > 4) { @@ -97,7 +97,7 @@ try { const AudioFormat out_audio_format = filter->GetOutAudioFormat(); fprintf(stderr, "audio_format=%s\n", - audio_format_to_string(out_audio_format, &af_string)); + ToString(out_audio_format).c_str()); /* play */ diff --git a/test/run_output.cxx b/test/run_output.cxx index 105a857e2..bf3c31205 100644 --- a/test/run_output.cxx +++ b/test/run_output.cxx @@ -33,6 +33,7 @@ #include "ReplayGainConfig.hxx" #include "pcm/PcmConvert.hxx" #include "filter/FilterRegistry.hxx" +#include "util/StringBuffer.hxx" #include "util/RuntimeError.hxx" #include "util/ScopeExit.hxx" #include "Log.hxx" @@ -86,9 +87,8 @@ run_output(AudioOutput *ao, AudioFormat audio_format) ao_plugin_open(ao, audio_format); AtScopeExit(ao) { ao_plugin_close(ao); }; - struct audio_format_string af_string; fprintf(stderr, "audio_format=%s\n", - audio_format_to_string(audio_format, &af_string)); + ToString(audio_format).c_str()); size_t frame_size = audio_format.GetFrameSize();