MusicChunk, player/Thread: use std::unique_ptr<Tag>

This commit is contained in:
Max Kellermann 2017-12-20 14:43:29 +01:00
parent c6a95395b5
commit 25fa3ccade
7 changed files with 21 additions and 30 deletions

View File

@ -24,10 +24,8 @@
#include <assert.h> #include <assert.h>
MusicChunk::~MusicChunk() MusicChunk::MusicChunk() noexcept = default;
{ MusicChunk::~MusicChunk() noexcept = default;
delete tag;
}
#ifndef NDEBUG #ifndef NDEBUG
bool bool

View File

@ -28,6 +28,8 @@
#include "AudioFormat.hxx" #include "AudioFormat.hxx"
#endif #endif
#include <memory>
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
@ -67,11 +69,9 @@ struct MusicChunk {
/** /**
* An optional tag associated with this chunk (and the * An optional tag associated with this chunk (and the
* following chunks); appears at song boundaries. The tag * following chunks); appears at song boundaries.
* object is owned by this chunk, and must be freed when this
* chunk is deinitialized.
*/ */
Tag *tag = nullptr; std::unique_ptr<Tag> tag;
/** /**
* Replay gain information associated with this chunk. * Replay gain information associated with this chunk.
@ -101,12 +101,10 @@ struct MusicChunk {
AudioFormat audio_format; AudioFormat audio_format;
#endif #endif
MusicChunk() = default; MusicChunk() noexcept;
~MusicChunk() noexcept;
MusicChunk(const MusicChunk &) = delete; MusicChunk(const MusicChunk &) = delete;
~MusicChunk();
MusicChunk &operator=(const MusicChunk &) = delete; MusicChunk &operator=(const MusicChunk &) = delete;
bool IsEmpty() const { bool IsEmpty() const {

View File

@ -215,7 +215,7 @@ DecoderBridge::DoSendTag(const Tag &tag)
return dc.command; return dc.command;
} }
chunk->tag = new Tag(tag); chunk->tag = std::make_unique<Tag>(tag);
return DecoderCommand::NONE; return DecoderCommand::NONE;
} }

View File

@ -222,7 +222,7 @@ AudioOutputSource::Fill(Mutex &mutex)
if (current_chunk == nullptr) if (current_chunk == nullptr)
return false; return false;
pending_tag = current_chunk->tag; pending_tag = current_chunk->tag.get();
try { try {
/* release the mutex while the filter runs, because /* release the mutex while the filter runs, because

View File

@ -131,7 +131,7 @@ class Player {
* postponed, and sent to the output thread when the new song * postponed, and sent to the output thread when the new song
* really begins. * really begins.
*/ */
Tag *cross_fade_tag = nullptr; std::unique_ptr<Tag> cross_fade_tag;
/** /**
* The current audio format for the audio outputs. * The current audio format for the audio outputs.
@ -837,10 +837,8 @@ Player::PlayNextChunk() noexcept
/* don't send the tags of the new song (which /* don't send the tags of the new song (which
is being faded in) yet; postpone it until is being faded in) yet; postpone it until
the current song is faded out */ the current song is faded out */
cross_fade_tag = cross_fade_tag = Tag::Merge(std::move(cross_fade_tag),
Tag::MergeReplace(cross_fade_tag, std::move(other_chunk->tag));
other_chunk->tag);
other_chunk->tag = nullptr;
if (pc.cross_fade.mixramp_delay <= 0) { if (pc.cross_fade.mixramp_delay <= 0) {
chunk->mix_ratio = ((float)cross_fade_position) chunk->mix_ratio = ((float)cross_fade_position)
@ -889,7 +887,8 @@ Player::PlayNextChunk() noexcept
/* insert the postponed tag if cross-fading is finished */ /* insert the postponed tag if cross-fading is finished */
if (xfade_state != CrossFadeState::ACTIVE && cross_fade_tag != nullptr) { if (xfade_state != CrossFadeState::ACTIVE && cross_fade_tag != nullptr) {
chunk->tag = Tag::MergeReplace(chunk->tag, cross_fade_tag); chunk->tag = Tag::Merge(std::move(chunk->tag),
std::move(cross_fade_tag));
cross_fade_tag = nullptr; cross_fade_tag = nullptr;
} }
@ -1114,7 +1113,7 @@ Player::Run() noexcept
ClearAndDeletePipe(); ClearAndDeletePipe();
delete cross_fade_tag; cross_fade_tag.reset();
if (song != nullptr) { if (song != nullptr) {
FormatDefault(player_domain, "played \"%s\"", song->GetURI()); FormatDefault(player_domain, "played \"%s\"", song->GetURI());

View File

@ -63,8 +63,8 @@ Tag::Merge(const Tag &base, const Tag &add) noexcept
return builder.CommitNew(); return builder.CommitNew();
} }
Tag * std::unique_ptr<Tag>
Tag::MergeReplace(Tag *base, Tag *add) Tag::Merge(std::unique_ptr<Tag> base, std::unique_ptr<Tag> add)
{ {
if (add == nullptr) if (add == nullptr)
return base; return base;
@ -72,11 +72,7 @@ Tag::MergeReplace(Tag *base, Tag *add)
if (base == nullptr) if (base == nullptr)
return add; return add;
Tag *tag = Merge(*base, *add).release(); return Merge(*base, *add);
delete base;
delete add;
return tag;
} }
const char * const char *

View File

@ -126,8 +126,8 @@ struct Tag {
* *
* @return a newly allocated tag * @return a newly allocated tag
*/ */
gcc_malloc gcc_returns_nonnull static std::unique_ptr<Tag> Merge(std::unique_ptr<Tag> base,
static Tag *MergeReplace(Tag *base, Tag *add); std::unique_ptr<Tag> add);
/** /**
* Returns the first value of the specified tag type, or * Returns the first value of the specified tag type, or