aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-09-05 19:11:50 +0200
committerMax Kellermann <max@duempel.org>2013-09-26 17:35:08 +0200
commit52ee132d92d4a04d31bbbdeb7c6c0077bd2a2828 (patch)
tree098cf4f9385693b28e41c5342fcdfae416b058dd /src/decoder
parent7ca0aedcfc35c784d7ae07cd1f1e8dce684e5901 (diff)
downloadmpd-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.cxx5
-rw-r--r--src/decoder/OpusDecoderPlugin.cxx11
-rw-r--r--src/decoder/VorbisComments.cxx15
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();
}