output/Multiple: move Wait() to struct PlayerControl
Eliminate a dependency from MultipleOutputs on PlayerControl.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
@@ -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.
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user