output/Internal: move enum AudioOutputCommand into the struct
This commit is contained in:
parent
54fc8f0e8c
commit
c5409d52f5
@ -58,7 +58,7 @@ AudioOutput::AudioOutput(const AudioOutputPlugin &_plugin)
|
|||||||
filter(nullptr),
|
filter(nullptr),
|
||||||
replay_gain_filter(nullptr),
|
replay_gain_filter(nullptr),
|
||||||
other_replay_gain_filter(nullptr),
|
other_replay_gain_filter(nullptr),
|
||||||
command(AudioOutputCommand::NONE)
|
command(Command::NONE)
|
||||||
{
|
{
|
||||||
assert(plugin.finish != nullptr);
|
assert(plugin.finish != nullptr);
|
||||||
assert(plugin.open != nullptr);
|
assert(plugin.open != nullptr);
|
||||||
|
@ -40,7 +40,8 @@ struct config_param;
|
|||||||
struct PlayerControl;
|
struct PlayerControl;
|
||||||
struct AudioOutputPlugin;
|
struct AudioOutputPlugin;
|
||||||
|
|
||||||
enum class AudioOutputCommand {
|
struct AudioOutput {
|
||||||
|
enum class Command {
|
||||||
NONE,
|
NONE,
|
||||||
ENABLE,
|
ENABLE,
|
||||||
DISABLE,
|
DISABLE,
|
||||||
@ -65,7 +66,6 @@ enum class AudioOutputCommand {
|
|||||||
KILL
|
KILL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AudioOutput {
|
|
||||||
/**
|
/**
|
||||||
* The device's configured display name.
|
* The device's configured display name.
|
||||||
*/
|
*/
|
||||||
@ -231,7 +231,7 @@ struct AudioOutput {
|
|||||||
/**
|
/**
|
||||||
* The next command to be performed by the output thread.
|
* The next command to be performed by the output thread.
|
||||||
*/
|
*/
|
||||||
AudioOutputCommand command;
|
Command command;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The music pipe which provides music chunks to be played.
|
* The music pipe which provides music chunks to be played.
|
||||||
@ -284,7 +284,7 @@ struct AudioOutput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool IsCommandFinished() const {
|
bool IsCommandFinished() const {
|
||||||
return command == AudioOutputCommand::NONE;
|
return command == Command::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -299,7 +299,7 @@ struct AudioOutput {
|
|||||||
*
|
*
|
||||||
* Caller must lock the mutex.
|
* Caller must lock the mutex.
|
||||||
*/
|
*/
|
||||||
void CommandAsync(AudioOutputCommand cmd);
|
void CommandAsync(Command cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a command to the #AudioOutput object and waits for
|
* Sends a command to the #AudioOutput object and waits for
|
||||||
@ -307,13 +307,13 @@ struct AudioOutput {
|
|||||||
*
|
*
|
||||||
* Caller must lock the mutex.
|
* Caller must lock the mutex.
|
||||||
*/
|
*/
|
||||||
void CommandWait(AudioOutputCommand cmd);
|
void CommandWait(Command cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lock the #AudioOutput object and execute the command
|
* Lock the #AudioOutput object and execute the command
|
||||||
* synchronously.
|
* synchronously.
|
||||||
*/
|
*/
|
||||||
void LockCommandWait(AudioOutputCommand cmd);
|
void LockCommandWait(Command cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables the device.
|
* Enables the device.
|
||||||
|
@ -46,7 +46,7 @@ AudioOutput::WaitForCommand()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioOutput::CommandAsync(AudioOutputCommand cmd)
|
AudioOutput::CommandAsync(Command cmd)
|
||||||
{
|
{
|
||||||
assert(IsCommandFinished());
|
assert(IsCommandFinished());
|
||||||
|
|
||||||
@ -55,14 +55,14 @@ AudioOutput::CommandAsync(AudioOutputCommand cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioOutput::CommandWait(AudioOutputCommand cmd)
|
AudioOutput::CommandWait(Command cmd)
|
||||||
{
|
{
|
||||||
CommandAsync(cmd);
|
CommandAsync(cmd);
|
||||||
WaitForCommand();
|
WaitForCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioOutput::LockCommandWait(AudioOutputCommand cmd)
|
AudioOutput::LockCommandWait(Command cmd)
|
||||||
{
|
{
|
||||||
const ScopeLock protect(mutex);
|
const ScopeLock protect(mutex);
|
||||||
CommandWait(cmd);
|
CommandWait(cmd);
|
||||||
@ -92,7 +92,7 @@ AudioOutput::LockEnableWait()
|
|||||||
StartThread();
|
StartThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
LockCommandWait(AudioOutputCommand::ENABLE);
|
LockCommandWait(Command::ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -109,7 +109,7 @@ AudioOutput::LockDisableWait()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LockCommandWait(AudioOutputCommand::DISABLE);
|
LockCommandWait(Command::DISABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
@ -134,7 +134,7 @@ AudioOutput::Open(const AudioFormat audio_format, const MusicPipe &mp)
|
|||||||
|
|
||||||
/* we're not using audio_output_cancel() here,
|
/* we're not using audio_output_cancel() here,
|
||||||
because that function is asynchronous */
|
because that function is asynchronous */
|
||||||
CommandWait(AudioOutputCommand::CANCEL);
|
CommandWait(Command::CANCEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -149,8 +149,8 @@ AudioOutput::Open(const AudioFormat audio_format, const MusicPipe &mp)
|
|||||||
StartThread();
|
StartThread();
|
||||||
|
|
||||||
CommandWait(open
|
CommandWait(open
|
||||||
? AudioOutputCommand::REOPEN
|
? Command::REOPEN
|
||||||
: AudioOutputCommand::OPEN);
|
: Command::OPEN);
|
||||||
const bool open2 = open;
|
const bool open2 = open;
|
||||||
|
|
||||||
if (open2 && mixer != nullptr) {
|
if (open2 && mixer != nullptr) {
|
||||||
@ -174,7 +174,7 @@ AudioOutput::CloseWait()
|
|||||||
assert(!open || !fail_timer.IsDefined());
|
assert(!open || !fail_timer.IsDefined());
|
||||||
|
|
||||||
if (open)
|
if (open)
|
||||||
CommandWait(AudioOutputCommand::CLOSE);
|
CommandWait(Command::CLOSE);
|
||||||
else
|
else
|
||||||
fail_timer.Reset();
|
fail_timer.Reset();
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ AudioOutput::LockPauseAsync()
|
|||||||
|
|
||||||
assert(allow_play);
|
assert(allow_play);
|
||||||
if (IsOpen())
|
if (IsOpen())
|
||||||
CommandAsync(AudioOutputCommand::PAUSE);
|
CommandAsync(Command::PAUSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -231,7 +231,7 @@ AudioOutput::LockDrainAsync()
|
|||||||
|
|
||||||
assert(allow_play);
|
assert(allow_play);
|
||||||
if (IsOpen())
|
if (IsOpen())
|
||||||
CommandAsync(AudioOutputCommand::DRAIN);
|
CommandAsync(Command::DRAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -241,7 +241,7 @@ AudioOutput::LockCancelAsync()
|
|||||||
|
|
||||||
if (IsOpen()) {
|
if (IsOpen()) {
|
||||||
allow_play = false;
|
allow_play = false;
|
||||||
CommandAsync(AudioOutputCommand::CANCEL);
|
CommandAsync(Command::CANCEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,7 +279,7 @@ AudioOutput::StopThread()
|
|||||||
assert(thread.IsDefined());
|
assert(thread.IsDefined());
|
||||||
assert(allow_play);
|
assert(allow_play);
|
||||||
|
|
||||||
LockCommandWait(AudioOutputCommand::KILL);
|
LockCommandWait(Command::KILL);
|
||||||
thread.Join();
|
thread.Join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@
|
|||||||
void
|
void
|
||||||
AudioOutput::CommandFinished()
|
AudioOutput::CommandFinished()
|
||||||
{
|
{
|
||||||
assert(command != AudioOutputCommand::NONE);
|
assert(command != Command::NONE);
|
||||||
command = AudioOutputCommand::NONE;
|
command = Command::NONE;
|
||||||
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
audio_output_client_notify.Signal();
|
audio_output_client_notify.Signal();
|
||||||
@ -342,7 +342,7 @@ AudioOutput::WaitForDelay()
|
|||||||
|
|
||||||
(void)cond.timed_wait(mutex, delay);
|
(void)cond.timed_wait(mutex, delay);
|
||||||
|
|
||||||
if (command != AudioOutputCommand::NONE)
|
if (command != Command::NONE)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -471,7 +471,7 @@ AudioOutput::PlayChunk(const MusicChunk *chunk)
|
|||||||
|
|
||||||
Error error;
|
Error error;
|
||||||
|
|
||||||
while (!data.IsEmpty() && command == AudioOutputCommand::NONE) {
|
while (!data.IsEmpty() && command == Command::NONE) {
|
||||||
if (!WaitForDelay())
|
if (!WaitForDelay())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -529,7 +529,7 @@ AudioOutput::Play()
|
|||||||
assert(!in_playback_loop);
|
assert(!in_playback_loop);
|
||||||
in_playback_loop = true;
|
in_playback_loop = true;
|
||||||
|
|
||||||
while (chunk != nullptr && command == AudioOutputCommand::NONE) {
|
while (chunk != nullptr && command == Command::NONE) {
|
||||||
assert(!current_chunk_finished);
|
assert(!current_chunk_finished);
|
||||||
|
|
||||||
current_chunk = chunk;
|
current_chunk = chunk;
|
||||||
@ -577,7 +577,7 @@ AudioOutput::Pause()
|
|||||||
Close(false);
|
Close(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (command == AudioOutputCommand::NONE);
|
} while (command == Command::NONE);
|
||||||
|
|
||||||
pause = false;
|
pause = false;
|
||||||
}
|
}
|
||||||
@ -594,30 +594,30 @@ AudioOutput::Task()
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case AudioOutputCommand::NONE:
|
case Command::NONE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::ENABLE:
|
case Command::ENABLE:
|
||||||
Enable();
|
Enable();
|
||||||
CommandFinished();
|
CommandFinished();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::DISABLE:
|
case Command::DISABLE:
|
||||||
Disable();
|
Disable();
|
||||||
CommandFinished();
|
CommandFinished();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::OPEN:
|
case Command::OPEN:
|
||||||
Open();
|
Open();
|
||||||
CommandFinished();
|
CommandFinished();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::REOPEN:
|
case Command::REOPEN:
|
||||||
Reopen();
|
Reopen();
|
||||||
CommandFinished();
|
CommandFinished();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::CLOSE:
|
case Command::CLOSE:
|
||||||
assert(open);
|
assert(open);
|
||||||
assert(pipe != nullptr);
|
assert(pipe != nullptr);
|
||||||
|
|
||||||
@ -625,7 +625,7 @@ AudioOutput::Task()
|
|||||||
CommandFinished();
|
CommandFinished();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioOutputCommand::PAUSE:
|
case Command::PAUSE:
|
||||||
if (!open) {
|
if (!open) {
|
||||||
/* the output has failed after
|
/* the output has failed after
|
||||||
audio_output_all_pause() has
|
audio_output_all_pause() has
|
||||||
@ -642,7 +642,7 @@ AudioOutput::Task()
|
|||||||
the new command first */
|
the new command first */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case AudioOutputCommand::DRAIN:
|
case Command::DRAIN:
|
||||||
if (open) {
|
if (open) {
|
||||||
assert(current_chunk == nullptr);
|
assert(current_chunk == nullptr);
|
||||||
assert(pipe->Peek() == nullptr);
|
assert(pipe->Peek() == nullptr);
|
||||||
@ -655,7 +655,7 @@ AudioOutput::Task()
|
|||||||
CommandFinished();
|
CommandFinished();
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case AudioOutputCommand::CANCEL:
|
case Command::CANCEL:
|
||||||
current_chunk = nullptr;
|
current_chunk = nullptr;
|
||||||
|
|
||||||
if (open) {
|
if (open) {
|
||||||
@ -667,7 +667,7 @@ AudioOutput::Task()
|
|||||||
CommandFinished();
|
CommandFinished();
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case AudioOutputCommand::KILL:
|
case Command::KILL:
|
||||||
current_chunk = nullptr;
|
current_chunk = nullptr;
|
||||||
CommandFinished();
|
CommandFinished();
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
@ -679,7 +679,7 @@ AudioOutput::Task()
|
|||||||
chunks in the pipe */
|
chunks in the pipe */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (command == AudioOutputCommand::NONE) {
|
if (command == Command::NONE) {
|
||||||
woken_for_play = false;
|
woken_for_play = false;
|
||||||
cond.wait(mutex);
|
cond.wait(mutex);
|
||||||
}
|
}
|
||||||
@ -696,7 +696,7 @@ AudioOutput::Task(void *arg)
|
|||||||
void
|
void
|
||||||
AudioOutput::StartThread()
|
AudioOutput::StartThread()
|
||||||
{
|
{
|
||||||
assert(command == AudioOutputCommand::NONE);
|
assert(command == Command::NONE);
|
||||||
|
|
||||||
Error error;
|
Error error;
|
||||||
if (!thread.Start(Task, this, error))
|
if (!thread.Start(Task, this, error))
|
||||||
|
Loading…
Reference in New Issue
Block a user