From 74740ca50ba3f1d98f5362f2c62526a295bfcef8 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 10 Jul 2016 21:21:35 +0200 Subject: [PATCH] decoder/flac: add class FlacStreamDecoder wrapping a FLAC__StreamDecoder* --- Makefile.am | 1 + src/decoder/plugins/FlacDecoderPlugin.cxx | 21 +++---- src/decoder/plugins/FlacStreamDecoder.hxx | 67 +++++++++++++++++++++++ 3 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 src/decoder/plugins/FlacStreamDecoder.hxx diff --git a/Makefile.am b/Makefile.am index 918c189a0..f6546c36f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1052,6 +1052,7 @@ libdecoder_a_SOURCES += \ src/decoder/plugins/FlacPcm.cxx src/decoder/plugins/FlacPcm.hxx \ src/decoder/plugins/FlacDomain.cxx src/decoder/plugins/FlacDomain.hxx \ src/decoder/plugins/FlacCommon.cxx src/decoder/plugins/FlacCommon.hxx \ + src/decoder/plugins/FlacStreamDecoder.hxx \ src/decoder/plugins/FlacDecoderPlugin.cxx \ src/decoder/plugins/FlacDecoderPlugin.h endif diff --git a/src/decoder/plugins/FlacDecoderPlugin.cxx b/src/decoder/plugins/FlacDecoderPlugin.cxx index f66a85467..4b512329f 100644 --- a/src/decoder/plugins/FlacDecoderPlugin.cxx +++ b/src/decoder/plugins/FlacDecoderPlugin.cxx @@ -19,6 +19,7 @@ #include "config.h" /* must be first for large file support */ #include "FlacDecoderPlugin.h" +#include "FlacStreamDecoder.hxx" #include "FlacDomain.hxx" #include "FlacCommon.hxx" #include "FlacMetadata.hxx" @@ -115,17 +116,17 @@ flac_scan_stream(InputStream &is, /** * Some glue code around FLAC__stream_decoder_new(). */ -static FLAC__StreamDecoder * +static FlacStreamDecoder flac_decoder_new(void) { - FLAC__StreamDecoder *sd = FLAC__stream_decoder_new(); - if (sd == nullptr) { + FlacStreamDecoder sd; + if (!sd) { LogError(flac_domain, "FLAC__stream_decoder_new() failed"); - return nullptr; + return sd; } - if(!FLAC__stream_decoder_set_metadata_respond(sd, FLAC__METADATA_TYPE_VORBIS_COMMENT)) + if(!FLAC__stream_decoder_set_metadata_respond(sd.get(), FLAC__METADATA_TYPE_VORBIS_COMMENT)) LogDebug(flac_domain, "FLAC__stream_decoder_set_metadata_respond() has failed"); @@ -286,17 +287,13 @@ flac_decode_internal(Decoder &decoder, InputStream &input_stream, bool is_ogg) { - FLAC__StreamDecoder *flac_dec; - - flac_dec = flac_decoder_new(); - if (flac_dec == nullptr) + auto flac_dec = flac_decoder_new(); + if (!flac_dec) return; FlacDecoder data(decoder, input_stream); - FlacInitAndDecode(data, flac_dec, is_ogg); - - FLAC__stream_decoder_delete(flac_dec); + FlacInitAndDecode(data, flac_dec.get(), is_ogg); } static void diff --git a/src/decoder/plugins/FlacStreamDecoder.hxx b/src/decoder/plugins/FlacStreamDecoder.hxx new file mode 100644 index 000000000..2ef7c3ded --- /dev/null +++ b/src/decoder/plugins/FlacStreamDecoder.hxx @@ -0,0 +1,67 @@ +/* + * Copyright 2003-2016 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_FLAC_STREAM_DECODER +#define MPD_FLAC_STREAM_DECODER + +#include "check.h" + +#include + +#include + +#include + +/** + * OO wrapper for a FLAC__StreamDecoder. + */ +class FlacStreamDecoder { + FLAC__StreamDecoder *decoder; + +public: + FlacStreamDecoder() + :decoder(FLAC__stream_decoder_new()) {} + + FlacStreamDecoder(FlacStreamDecoder &&src) + :decoder(src.decoder) { + src.decoder = nullptr; + } + + ~FlacStreamDecoder() { + if (decoder != nullptr) + FLAC__stream_decoder_delete(decoder); + } + + FlacStreamDecoder &operator=(FlacStreamDecoder &&src) { + std::swap(decoder, src.decoder); + return *this; + } + + operator bool() const { + return decoder != nullptr; + } + + FLAC__StreamDecoder *get() { + assert(decoder != nullptr); + + return decoder; + } +}; + +#endif