output/Multiple: move Wait() to struct PlayerControl

Eliminate a dependency from MultipleOutputs on PlayerControl.
This commit is contained in:
Max Kellermann 2016-12-14 12:54:19 +01:00
parent 7c6b0d5c31
commit ece5971027
5 changed files with 32 additions and 29 deletions

View File

@ -19,7 +19,6 @@
#include "config.h"
#include "MultipleOutputs.hxx"
#include "player/Control.hxx"
#include "Internal.hxx"
#include "Domain.hxx"
#include "MusicBuffer.hxx"
@ -331,22 +330,6 @@ MultipleOutputs::Check()
return 0;
}
bool
MultipleOutputs::Wait(PlayerControl &pc, unsigned threshold)
{
pc.Lock();
if (Check() < threshold) {
pc.Unlock();
return true;
}
pc.Wait();
pc.Unlock();
return Check() < threshold;
}
void
MultipleOutputs::Pause()
{

View File

@ -159,16 +159,6 @@ public:
*/
unsigned Check();
/**
* Checks if the size of the #MusicPipe is below the #threshold. If
* not, it attempts to synchronize with all output threads, and waits
* until another #MusicChunk is finished.
*
* @param threshold the maximum number of chunks in the pipe
* @return true if there are less than #threshold chunks in the pipe
*/
bool Wait(PlayerControl &pc, unsigned threshold);
/**
* Puts all audio outputs into pause mode. Most implementations will
* simply close it then.

View File

@ -21,6 +21,7 @@
#include "Control.hxx"
#include "Idle.hxx"
#include "DetachedSong.hxx"
#include "output/MultipleOutputs.hxx"
#include <algorithm>
@ -46,6 +47,18 @@ PlayerControl::~PlayerControl()
delete tagged_song;
}
bool
PlayerControl::WaitOutputConsumed(unsigned threshold)
{
bool result = outputs.Check() < threshold;
if (!result && command == PlayerCommand::NONE) {
Wait();
result = outputs.Check() < threshold;
}
return result;
}
void
PlayerControl::Play(DetachedSong *song)
{

View File

@ -280,6 +280,23 @@ struct PlayerControl {
CommandFinished();
}
/**
* Checks if the size of the #MusicPipe is below the #threshold. If
* not, it attempts to synchronize with all output threads, and waits
* until another #MusicChunk is finished.
*
* Caller must lock the mutex.
*
* @param threshold the maximum number of chunks in the pipe
* @return true if there are less than #threshold chunks in the pipe
*/
bool WaitOutputConsumed(unsigned threshold);
bool LockWaitOutputConsumed(unsigned threshold) {
const ScopeLock protect(mutex);
return WaitOutputConsumed(threshold);
}
private:
/**
* Wait for the command to be finished by the player thread.

View File

@ -500,7 +500,7 @@ Player::CheckDecoderStartup()
pc.Unlock();
if (output_open &&
!pc.outputs.Wait(pc, 1))
!pc.LockWaitOutputConsumed(1))
/* the output devices havn't finished playing
all chunks yet - wait for that */
return true;
@ -813,7 +813,7 @@ play_chunk(PlayerControl &pc,
inline bool
Player::PlayNextChunk()
{
if (!pc.outputs.Wait(pc, 64))
if (!pc.LockWaitOutputConsumed(64))
/* the output pipe is still large enough, don't send
another chunk */
return true;