player/Control: start thread on demand

Keep MPD's footprint small until playback is requested.
This commit is contained in:
Max Kellermann 2018-09-23 17:32:34 +02:00
parent bf372e3e1f
commit 2ec94c0497
4 changed files with 21 additions and 14 deletions

View File

@ -577,9 +577,6 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
ZeroconfInit(raw_config, instance->event_loop);
for (auto &partition : instance->partitions)
partition.pc.StartThread();
#ifdef ENABLE_DATABASE
if (create_db) {
/* the database failed to load: recreate the

View File

@ -109,8 +109,6 @@ handle_newpartition(Client &client, Request request, Response &response)
ReplayGainConfig(),
partition.pc);
partition.UpdateEffectiveReplayGainMode();
partition.pc.StartThread();
partition.pc.LockUpdateAudio();
instance.EmitIdle(IDLE_PARTITION);

View File

@ -60,6 +60,9 @@ PlayerControl::WaitOutputConsumed(unsigned threshold) noexcept
void
PlayerControl::Play(std::unique_ptr<DetachedSong> song)
{
if (!thread.IsDefined())
thread.Start();
assert(song != nullptr);
const std::lock_guard<Mutex> protect(mutex);
@ -74,6 +77,8 @@ PlayerControl::Play(std::unique_ptr<DetachedSong> song)
void
PlayerControl::LockCancel() noexcept
{
assert(thread.IsDefined());
LockSynchronousCommand(PlayerCommand::CANCEL);
assert(next_song == nullptr);
}
@ -81,6 +86,9 @@ PlayerControl::LockCancel() noexcept
void
PlayerControl::LockStop() noexcept
{
if (!thread.IsDefined())
return;
LockSynchronousCommand(PlayerCommand::CLOSE_AUDIO);
assert(next_song == nullptr);
@ -90,13 +98,17 @@ PlayerControl::LockStop() noexcept
void
PlayerControl::LockUpdateAudio() noexcept
{
if (!thread.IsDefined())
return;
LockSynchronousCommand(PlayerCommand::UPDATE_AUDIO);
}
void
PlayerControl::Kill() noexcept
{
assert(thread.IsDefined());
if (!thread.IsDefined())
return;
LockSynchronousCommand(PlayerCommand::EXIT);
thread.Join();
@ -123,6 +135,9 @@ PlayerControl::LockPause() noexcept
void
PlayerControl::LockSetPause(bool pause_flag) noexcept
{
if (!thread.IsDefined())
return;
const std::lock_guard<Mutex> protect(mutex);
switch (state) {
@ -154,7 +169,7 @@ PlayerControl::LockGetStatus() noexcept
PlayerStatus status;
const std::lock_guard<Mutex> protect(mutex);
if (!occupied)
if (!occupied && thread.IsDefined())
SynchronousCommand(PlayerCommand::REFRESH);
status.state = state;
@ -216,6 +231,7 @@ PlayerControl::LockReadTaggedSong() noexcept
void
PlayerControl::LockEnqueueSong(std::unique_ptr<DetachedSong> song) noexcept
{
assert(thread.IsDefined());
assert(song != nullptr);
const std::lock_guard<Mutex> protect(mutex);
@ -270,6 +286,9 @@ PlayerControl::SeekLocked(std::unique_ptr<DetachedSong> song, SongTime t)
void
PlayerControl::LockSeek(std::unique_ptr<DetachedSong> song, SongTime t)
{
if (!thread.IsDefined())
thread.Start();
assert(song != nullptr);
{

View File

@ -239,13 +239,6 @@ public:
const ReplayGainConfig &_replay_gain_config) noexcept;
~PlayerControl() noexcept;
/**
* Throws on error.
*/
void StartThread() {
thread.Start();
}
void Kill() noexcept;
/**