Tag: add method Clear()

Allow reusing Tag instances.
This commit is contained in:
Max Kellermann 2013-07-31 00:26:55 +02:00
parent cbd38327e7
commit 7f9402bd22
7 changed files with 31 additions and 20 deletions

View File

@ -132,6 +132,22 @@ void tag_lib_init(void)
g_free(temp); g_free(temp);
} }
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 void
Tag::DeleteItem(unsigned idx) Tag::DeleteItem(unsigned idx)
{ {

View File

@ -112,6 +112,11 @@ struct Tag {
return !IsEmpty() || time >= 0; return !IsEmpty() || time >= 0;
} }
/**
* Clear everything, as if this was a new Tag object.
*/
void Clear();
void DeleteItem(unsigned i); void DeleteItem(unsigned i);
/** /**

View File

@ -36,16 +36,10 @@ flac_data::flac_data(struct decoder *_decoder,
:FlacInput(_input_stream, _decoder), :FlacInput(_input_stream, _decoder),
initialized(false), unsupported(false), initialized(false), unsupported(false),
total_frames(0), first_frame(0), next_frame(0), position(0), total_frames(0), first_frame(0), next_frame(0), position(0),
decoder(_decoder), input_stream(_input_stream), decoder(_decoder), input_stream(_input_stream)
tag(nullptr)
{ {
} }
flac_data::~flac_data()
{
delete tag;
}
static enum sample_format static enum sample_format
flac_sample_format(unsigned bits_per_sample) flac_sample_format(unsigned bits_per_sample)
{ {
@ -116,9 +110,8 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block,
decoder_mixramp(data->decoder, decoder_mixramp(data->decoder,
mixramp_start, mixramp_end); mixramp_start, mixramp_end);
if (data->tag != nullptr) flac_vorbis_comments_to_tag(data->tag,
flac_vorbis_comments_to_tag(data->tag, &block->data.vorbis_comment);
&block->data.vorbis_comment);
default: default:
break; break;

View File

@ -81,10 +81,9 @@ struct flac_data : public FlacInput {
struct decoder *decoder; struct decoder *decoder;
struct input_stream *input_stream; struct input_stream *input_stream;
Tag *tag; Tag tag;
flac_data(struct decoder *decoder, struct input_stream *input_stream); flac_data(struct decoder *decoder, struct input_stream *input_stream);
~flac_data();
}; };
void flac_metadata_common_cb(const FLAC__StreamMetadata * block, void flac_metadata_common_cb(const FLAC__StreamMetadata * block,

View File

@ -172,11 +172,10 @@ flac_decoder_loop(struct flac_data *data, FLAC__StreamDecoder *flac_dec,
data->first_frame = t_start; data->first_frame = t_start;
while (true) { while (true) {
if (data->tag != nullptr && !data->tag->IsEmpty()) { if (!data->tag.IsEmpty()) {
cmd = decoder_tag(data->decoder, data->input_stream, cmd = decoder_tag(data->decoder, data->input_stream,
std::move(*data->tag)); std::move(data->tag));
delete data->tag; data->tag.Clear();
data->tag = new Tag();
} else } else
cmd = decoder_get_command(decoder); cmd = decoder_get_command(decoder);
@ -260,7 +259,6 @@ flac_decode_internal(struct decoder * decoder,
return; return;
struct flac_data data(decoder, input_stream); struct flac_data data(decoder, input_stream);
data.tag = new Tag();
FLAC__StreamDecoderInitStatus status = FLAC__StreamDecoderInitStatus status =
stream_init(flac_dec, &data, is_ogg); stream_init(flac_dec, &data, is_ogg);

View File

@ -228,10 +228,10 @@ flac_scan_metadata(const FLAC__StreamMetadata *block,
} }
void void
flac_vorbis_comments_to_tag(Tag *tag, flac_vorbis_comments_to_tag(Tag &tag,
const FLAC__StreamMetadata_VorbisComment *comment) const FLAC__StreamMetadata_VorbisComment *comment)
{ {
flac_scan_comments(comment, &add_tag_handler, tag); flac_scan_comments(comment, &add_tag_handler, &tag);
} }
void void

View File

@ -130,7 +130,7 @@ flac_parse_mixramp(char **mixramp_start, char **mixramp_end,
const FLAC__StreamMetadata *block); const FLAC__StreamMetadata *block);
void void
flac_vorbis_comments_to_tag(Tag *tag, flac_vorbis_comments_to_tag(Tag &tag,
const FLAC__StreamMetadata_VorbisComment *comment); const FLAC__StreamMetadata_VorbisComment *comment);
void void