summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Partition.cxx6
-rw-r--r--src/player/Control.cxx49
-rw-r--r--src/player/Control.hxx36
-rw-r--r--src/player/Thread.cxx23
-rw-r--r--src/queue/Playlist.cxx4
-rw-r--r--src/queue/PlaylistControl.cxx2
6 files changed, 59 insertions, 61 deletions
diff --git a/src/Partition.cxx b/src/Partition.cxx
index 369d65d0d..39768249e 100644
--- a/src/Partition.cxx
+++ b/src/Partition.cxx
@@ -88,11 +88,9 @@ Partition::DatabaseModified(const Database &db)
void
Partition::TagModified()
{
- DetachedSong *song = pc.LockReadTaggedSong();
- if (song != nullptr) {
+ auto song = pc.LockReadTaggedSong();
+ if (song)
playlist.TagModified(std::move(*song));
- delete song;
- }
}
void
diff --git a/src/player/Control.cxx b/src/player/Control.cxx
index a34b8b22a..57aeab4df 100644
--- a/src/player/Control.cxx
+++ b/src/player/Control.cxx
@@ -44,8 +44,6 @@ PlayerControl::PlayerControl(PlayerListener &_listener,
PlayerControl::~PlayerControl() noexcept
{
- delete next_song;
- delete tagged_song;
}
bool
@@ -61,12 +59,12 @@ PlayerControl::WaitOutputConsumed(unsigned threshold) noexcept
}
void
-PlayerControl::Play(DetachedSong *song)
+PlayerControl::Play(std::unique_ptr<DetachedSong> song)
{
assert(song != nullptr);
const std::lock_guard<Mutex> protect(mutex);
- SeekLocked(song, SongTime::zero());
+ SeekLocked(std::move(song), SongTime::zero());
if (state == PlayerState::PAUSE)
/* if the player was paused previously, we need to
@@ -192,28 +190,51 @@ void
PlayerControl::LockSetTaggedSong(const DetachedSong &song) noexcept
{
const std::lock_guard<Mutex> protect(mutex);
- delete tagged_song;
- tagged_song = new DetachedSong(song);
+ tagged_song.reset();
+ tagged_song = std::make_unique<DetachedSong>(song);
}
void
PlayerControl::ClearTaggedSong() noexcept
{
- delete tagged_song;
- tagged_song = nullptr;
+ tagged_song.reset();
+}
+
+std::unique_ptr<DetachedSong>
+PlayerControl::ReadTaggedSong() noexcept
+{
+ return std::exchange(tagged_song, nullptr);
+}
+
+std::unique_ptr<DetachedSong>
+PlayerControl::LockReadTaggedSong() noexcept
+{
+ const std::lock_guard<Mutex> protect(mutex);
+ return ReadTaggedSong();
}
void
-PlayerControl::LockEnqueueSong(DetachedSong *song) noexcept
+PlayerControl::LockEnqueueSong(std::unique_ptr<DetachedSong> song) noexcept
{
assert(song != nullptr);
const std::lock_guard<Mutex> protect(mutex);
- EnqueueSongLocked(song);
+ EnqueueSongLocked(std::move(song));
+}
+
+void
+PlayerControl::EnqueueSongLocked(std::unique_ptr<DetachedSong> song) noexcept
+{
+ assert(song != nullptr);
+ assert(next_song == nullptr);
+
+ next_song = std::move(song);
+ seek_time = SongTime::zero();
+ SynchronousCommand(PlayerCommand::QUEUE);
}
void
-PlayerControl::SeekLocked(DetachedSong *song, SongTime t)
+PlayerControl::SeekLocked(std::unique_ptr<DetachedSong> song, SongTime t)
{
assert(song != nullptr);
@@ -227,7 +248,7 @@ PlayerControl::SeekLocked(DetachedSong *song, SongTime t)
assert(next_song == nullptr);
ClearError();
- next_song = song;
+ next_song = std::move(song);
seek_time = t;
SynchronousCommand(PlayerCommand::SEEK);
@@ -242,13 +263,13 @@ PlayerControl::SeekLocked(DetachedSong *song, SongTime t)
}
void
-PlayerControl::LockSeek(DetachedSong *song, SongTime t)
+PlayerControl::LockSeek(std::unique_ptr<DetachedSong> song, SongTime t)
{
assert(song != nullptr);
{
const std::lock_guard<Mutex> protect(mutex);
- SeekLocked(song, t);
+ SeekLocked(std::move(song), t);
}
idle_add(IDLE_PLAYER);
diff --git a/src/player/Control.hxx b/src/player/Control.hxx
index e5a0e27be..6baaa0fb8 100644
--- a/src/player/Control.hxx
+++ b/src/player/Control.hxx
@@ -31,6 +31,7 @@
#include "ReplayGainMode.hxx"
#include <exception>
+#include <memory>
#include <stdint.h>
@@ -156,7 +157,7 @@ struct PlayerControl final : AudioOutputClient {
* Protected by #mutex. Set by the PlayerThread and consumed
* by the main thread.
*/
- DetachedSong *tagged_song = nullptr;
+ std::unique_ptr<DetachedSong> tagged_song;
uint16_t bit_rate;
AudioFormat audio_format;
@@ -169,7 +170,7 @@ struct PlayerControl final : AudioOutputClient {
* This is a duplicate, and must be freed when this attribute
* is cleared.
*/
- DetachedSong *next_song = nullptr;
+ std::unique_ptr<DetachedSong> next_song;
SongTime seek_time;
@@ -341,10 +342,9 @@ public:
/**
* Throws std::runtime_error or #Error on error.
*
- * @param song the song to be queued; the given instance will
- * be owned and freed by the player
+ * @param song the song to be queued
*/
- void Play(DetachedSong *song);
+ void Play(std::unique_ptr<DetachedSong> song);
/**
* see PlayerCommand::CANCEL
@@ -452,45 +452,31 @@ public:
*
* Caller must lock the object.
*/
- DetachedSong *ReadTaggedSong() noexcept {
- DetachedSong *result = tagged_song;
- tagged_song = nullptr;
- return result;
- }
+ std::unique_ptr<DetachedSong> ReadTaggedSong() noexcept;
/**
* Like ReadTaggedSong(), but locks and unlocks the object.
*/
- DetachedSong *LockReadTaggedSong() noexcept {
- const std::lock_guard<Mutex> protect(mutex);
- return ReadTaggedSong();
- }
+ std::unique_ptr<DetachedSong> LockReadTaggedSong() noexcept;
void LockStop() noexcept;
void LockUpdateAudio() noexcept;
private:
- void EnqueueSongLocked(DetachedSong *song) noexcept {
- assert(song != nullptr);
- assert(next_song == nullptr);
-
- next_song = song;
- seek_time = SongTime::zero();
- SynchronousCommand(PlayerCommand::QUEUE);
- }
+ void EnqueueSongLocked(std::unique_ptr<DetachedSong> song) noexcept;
/**
* Throws std::runtime_error or #Error on error.
*/
- void SeekLocked(DetachedSong *song, SongTime t);
+ void SeekLocked(std::unique_ptr<DetachedSong> song, SongTime t);
public:
/**
* @param song the song to be queued; the given instance will be owned
* and freed by the player
*/
- void LockEnqueueSong(DetachedSong *song) noexcept;
+ void LockEnqueueSong(std::unique_ptr<DetachedSong> song) noexcept;
/**
* Makes the player thread seek the specified song to a position.
@@ -500,7 +486,7 @@ public:
* @param song the song to be queued; the given instance will be owned
* and freed by the player
*/
- void LockSeek(DetachedSong *song, SongTime t);
+ void LockSeek(std::unique_ptr<DetachedSong> song, SongTime t);
void SetCrossFade(float cross_fade_seconds) noexcept;
diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx
index de8b80803..b9ffb281f 100644
--- a/src/player/Thread.cxx
+++ b/src/player/Thread.cxx
@@ -90,7 +90,7 @@ class Player {
/**
* the song currently being played
*/
- DetachedSong *song;
+ std::unique_ptr<DetachedSong> song;
/**
* Is cross-fading to the next song enabled?
@@ -413,9 +413,7 @@ Player::ActivateDecoder()
pc.ClearTaggedSong();
- delete song;
- song = pc.next_song;
- pc.next_song = nullptr;
+ song = std::exchange(pc.next_song, nullptr);
elapsed_time = pc.seek_time;
@@ -605,8 +603,7 @@ Player::SeekDecoder()
ClearAndReplacePipe(dc.pipe);
}
- delete pc.next_song;
- pc.next_song = nullptr;
+ pc.next_song.reset();
queued = false;
/* wait for the decoder to complete initialization
@@ -724,8 +721,7 @@ Player::ProcessCommand()
StopDecoder();
}
- delete pc.next_song;
- pc.next_song = nullptr;
+ pc.next_song.reset();
queued = false;
pc.CommandFinished();
break;
@@ -1119,7 +1115,7 @@ Player::Run()
if (song != nullptr) {
FormatDefault(player_domain, "played \"%s\"", song->GetURI());
- delete song;
+ song.reset();
}
pc.Lock();
@@ -1128,8 +1124,7 @@ Player::Run()
if (queued) {
assert(pc.next_song != nullptr);
- delete pc.next_song;
- pc.next_song = nullptr;
+ pc.next_song.reset();
}
pc.state = PlayerState::STOP;
@@ -1179,8 +1174,7 @@ PlayerControl::RunThread() noexcept
/* fall through */
case PlayerCommand::PAUSE:
- delete next_song;
- next_song = nullptr;
+ next_song.reset();
CommandFinished();
break;
@@ -1215,8 +1209,7 @@ PlayerControl::RunThread() noexcept
return;
case PlayerCommand::CANCEL:
- delete next_song;
- next_song = nullptr;
+ next_song.reset();
CommandFinished();
break;
diff --git a/src/queue/Playlist.cxx b/src/queue/Playlist.cxx
index 8cdcc9a74..0b68f0298 100644
--- a/src/queue/Playlist.cxx
+++ b/src/queue/Playlist.cxx
@@ -56,7 +56,7 @@ playlist::QueueSongOrder(PlayerControl &pc, unsigned order)
FormatDebug(playlist_domain, "queue song %i:\"%s\"",
queued, song.GetURI());
- pc.LockEnqueueSong(new DetachedSong(song));
+ pc.LockEnqueueSong(std::make_unique<DetachedSong>(song));
}
void
@@ -163,7 +163,7 @@ playlist::PlayOrder(PlayerControl &pc, unsigned order)
current = order;
- pc.Play(new DetachedSong(song));
+ pc.Play(std::make_unique<DetachedSong>(song));
SongStarted();
}
diff --git a/src/queue/PlaylistControl.cxx b/src/queue/PlaylistControl.cxx
index 4b17386ae..c744e42c8 100644
--- a/src/queue/PlaylistControl.cxx
+++ b/src/queue/PlaylistControl.cxx
@@ -234,7 +234,7 @@ playlist::SeekSongOrder(PlayerControl &pc, unsigned i, SongTime seek_time)
queued = -1;
try {
- pc.LockSeek(new DetachedSong(queue.GetOrder(i)), seek_time);
+ pc.LockSeek(std::make_unique<DetachedSong>(queue.GetOrder(i)), seek_time);
} catch (...) {
UpdateQueuedSong(pc, queued_song);
throw;