diff options
author | Max Kellermann <max@duempel.org> | 2013-09-05 19:11:50 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-09-26 17:35:08 +0200 |
commit | 52ee132d92d4a04d31bbbdeb7c6c0077bd2a2828 (patch) | |
tree | 098cf4f9385693b28e41c5342fcdfae416b058dd /src/decoder | |
parent | 7ca0aedcfc35c784d7ae07cd1f1e8dce684e5901 (diff) | |
download | mpd-52ee132d92d4a04d31bbbdeb7c6c0077bd2a2828.tar.gz mpd-52ee132d92d4a04d31bbbdeb7c6c0077bd2a2828.tar.xz mpd-52ee132d92d4a04d31bbbdeb7c6c0077bd2a2828.zip |
TagHandler: use a TagBuilder internally
Reduce heap allocator overhead.
Diffstat (limited to 'src/decoder')
-rw-r--r-- | src/decoder/FlacMetadata.cxx | 5 | ||||
-rw-r--r-- | src/decoder/OpusDecoderPlugin.cxx | 11 | ||||
-rw-r--r-- | src/decoder/VorbisComments.cxx | 15 |
3 files changed, 17 insertions, 14 deletions
diff --git a/src/decoder/FlacMetadata.cxx b/src/decoder/FlacMetadata.cxx index a27fec5d2..49e4851e8 100644 --- a/src/decoder/FlacMetadata.cxx +++ b/src/decoder/FlacMetadata.cxx @@ -23,6 +23,7 @@ #include "tag/Tag.hxx" #include "tag/TagHandler.hxx" #include "tag/TagTable.hxx" +#include "tag/TagBuilder.hxx" #include "replay_gain_info.h" #include <glib.h> @@ -231,7 +232,9 @@ void flac_vorbis_comments_to_tag(Tag &tag, const FLAC__StreamMetadata_VorbisComment *comment) { - flac_scan_comments(comment, &add_tag_handler, &tag); + TagBuilder tag_builder; + flac_scan_comments(comment, &add_tag_handler, &tag_builder); + tag_builder.Commit(tag); } void diff --git a/src/decoder/OpusDecoderPlugin.cxx b/src/decoder/OpusDecoderPlugin.cxx index 9d852102b..c757d66ef 100644 --- a/src/decoder/OpusDecoderPlugin.cxx +++ b/src/decoder/OpusDecoderPlugin.cxx @@ -28,6 +28,7 @@ #include "OggCodec.hxx" #include "CheckAudioFormat.hxx" #include "tag/TagHandler.hxx" +#include "tag/TagBuilder.hxx" #include "InputStream.hxx" #include "util/Error.hxx" @@ -222,14 +223,16 @@ MPDOpusDecoder::HandleBOS(const ogg_packet &packet) inline enum decoder_command MPDOpusDecoder::HandleTags(const ogg_packet &packet) { - Tag tag; + TagBuilder tag_builder; enum decoder_command cmd; if (ScanOpusTags(packet.packet, packet.bytes, - &add_tag_handler, &tag) && - !tag.IsEmpty()) + &add_tag_handler, &tag_builder) && + !tag_builder.IsEmpty()) { + Tag tag; + tag_builder.Commit(tag); cmd = decoder_tag(decoder, input_stream, std::move(tag)); - else + } else cmd = decoder_get_command(decoder); return cmd; diff --git a/src/decoder/VorbisComments.cxx b/src/decoder/VorbisComments.cxx index 48c603ea4..c8eeb09cd 100644 --- a/src/decoder/VorbisComments.cxx +++ b/src/decoder/VorbisComments.cxx @@ -23,6 +23,7 @@ #include "tag/Tag.hxx" #include "tag/TagTable.hxx" #include "tag/TagHandler.hxx" +#include "tag/TagBuilder.hxx" #include "replay_gain_info.h" #include <glib.h> @@ -138,13 +139,9 @@ vorbis_comments_scan(char **comments, Tag * vorbis_comments_to_tag(char **comments) { - Tag *tag = new Tag(); - vorbis_comments_scan(comments, &add_tag_handler, tag); - - if (tag->IsEmpty()) { - delete tag; - tag = NULL; - } - - return tag; + TagBuilder tag_builder; + vorbis_comments_scan(comments, &add_tag_handler, &tag_builder); + return tag_builder.IsEmpty() + ? nullptr + : tag_builder.Commit(); } |