diff options
author | Max Kellermann <max@duempel.org> | 2013-07-31 00:26:55 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-07-31 00:35:05 +0200 |
commit | 7f9402bd22f02a46b32d53560094622493f33f37 (patch) | |
tree | b96b437520be32a512943985035939b9b94e5223 | |
parent | cbd38327e7f6948647768227ac4836f64e5ccd51 (diff) |
Tag: add method Clear()
Allow reusing Tag instances.
-rw-r--r-- | src/Tag.cxx | 16 | ||||
-rw-r--r-- | src/Tag.hxx | 5 | ||||
-rw-r--r-- | src/decoder/FlacCommon.cxx | 13 | ||||
-rw-r--r-- | src/decoder/FlacCommon.hxx | 3 | ||||
-rw-r--r-- | src/decoder/FlacDecoderPlugin.cxx | 8 | ||||
-rw-r--r-- | src/decoder/FlacMetadata.cxx | 4 | ||||
-rw-r--r-- | src/decoder/FlacMetadata.hxx | 2 |
7 files changed, 31 insertions, 20 deletions
diff --git a/src/Tag.cxx b/src/Tag.cxx index b473c367e..7853f0a2f 100644 --- a/src/Tag.cxx +++ b/src/Tag.cxx @@ -133,6 +133,22 @@ void tag_lib_init(void) } void +Tag::Clear() +{ + time = -1; + has_playlist = false; + + tag_pool_lock.lock(); + for (unsigned i = 0; i < num_items; ++i) + tag_pool_put_item(items[i]); + tag_pool_lock.unlock(); + + g_free(items); + items = nullptr; + num_items = 0; +} + +void Tag::DeleteItem(unsigned idx) { assert(idx < num_items); diff --git a/src/Tag.hxx b/src/Tag.hxx index 5f1702994..2c5f599e2 100644 --- a/src/Tag.hxx +++ b/src/Tag.hxx @@ -112,6 +112,11 @@ struct Tag { return !IsEmpty() || time >= 0; } + /** + * Clear everything, as if this was a new Tag object. + */ + void Clear(); + void DeleteItem(unsigned i); /** diff --git a/src/decoder/FlacCommon.cxx b/src/decoder/FlacCommon.cxx index 6b6c20d3c..32917ed86 100644 --- a/src/decoder/FlacCommon.cxx +++ b/src/decoder/FlacCommon.cxx @@ -36,16 +36,10 @@ flac_data::flac_data(struct decoder *_decoder, :FlacInput(_input_stream, _decoder), initialized(false), unsupported(false), total_frames(0), first_frame(0), next_frame(0), position(0), - decoder(_decoder), input_stream(_input_stream), - tag(nullptr) + decoder(_decoder), input_stream(_input_stream) { } -flac_data::~flac_data() -{ - delete tag; -} - static enum sample_format flac_sample_format(unsigned bits_per_sample) { @@ -116,9 +110,8 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block, decoder_mixramp(data->decoder, mixramp_start, mixramp_end); - if (data->tag != nullptr) - flac_vorbis_comments_to_tag(data->tag, - &block->data.vorbis_comment); + flac_vorbis_comments_to_tag(data->tag, + &block->data.vorbis_comment); default: break; diff --git a/src/decoder/FlacCommon.hxx b/src/decoder/FlacCommon.hxx index e3555efba..d2e240d81 100644 --- a/src/decoder/FlacCommon.hxx +++ b/src/decoder/FlacCommon.hxx @@ -81,10 +81,9 @@ struct flac_data : public FlacInput { struct decoder *decoder; struct input_stream *input_stream; - Tag *tag; + Tag tag; flac_data(struct decoder *decoder, struct input_stream *input_stream); - ~flac_data(); }; void flac_metadata_common_cb(const FLAC__StreamMetadata * block, diff --git a/src/decoder/FlacDecoderPlugin.cxx b/src/decoder/FlacDecoderPlugin.cxx index 4140d14f7..fc0925610 100644 --- a/src/decoder/FlacDecoderPlugin.cxx +++ b/src/decoder/FlacDecoderPlugin.cxx @@ -172,11 +172,10 @@ flac_decoder_loop(struct flac_data *data, FLAC__StreamDecoder *flac_dec, data->first_frame = t_start; while (true) { - if (data->tag != nullptr && !data->tag->IsEmpty()) { + if (!data->tag.IsEmpty()) { cmd = decoder_tag(data->decoder, data->input_stream, - std::move(*data->tag)); - delete data->tag; - data->tag = new Tag(); + std::move(data->tag)); + data->tag.Clear(); } else cmd = decoder_get_command(decoder); @@ -260,7 +259,6 @@ flac_decode_internal(struct decoder * decoder, return; struct flac_data data(decoder, input_stream); - data.tag = new Tag(); FLAC__StreamDecoderInitStatus status = stream_init(flac_dec, &data, is_ogg); diff --git a/src/decoder/FlacMetadata.cxx b/src/decoder/FlacMetadata.cxx index 3c0120ab4..be15092b5 100644 --- a/src/decoder/FlacMetadata.cxx +++ b/src/decoder/FlacMetadata.cxx @@ -228,10 +228,10 @@ flac_scan_metadata(const FLAC__StreamMetadata *block, } void -flac_vorbis_comments_to_tag(Tag *tag, +flac_vorbis_comments_to_tag(Tag &tag, const FLAC__StreamMetadata_VorbisComment *comment) { - flac_scan_comments(comment, &add_tag_handler, tag); + flac_scan_comments(comment, &add_tag_handler, &tag); } void diff --git a/src/decoder/FlacMetadata.hxx b/src/decoder/FlacMetadata.hxx index 52c6abbce..57769672f 100644 --- a/src/decoder/FlacMetadata.hxx +++ b/src/decoder/FlacMetadata.hxx @@ -130,7 +130,7 @@ flac_parse_mixramp(char **mixramp_start, char **mixramp_end, const FLAC__StreamMetadata *block); void -flac_vorbis_comments_to_tag(Tag *tag, +flac_vorbis_comments_to_tag(Tag &tag, const FLAC__StreamMetadata_VorbisComment *comment); void |