Commit 5eef1468 authored by Max Kellermann's avatar Max Kellermann

output/Internal: move several flags to struct AudioOutputControl

parent 2e65686f
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "mixer/MixerControl.hxx" #include "mixer/MixerControl.hxx"
#include "notify.hxx" #include "notify.hxx"
#include "filter/plugins/ReplayGainFilterPlugin.hxx" #include "filter/plugins/ReplayGainFilterPlugin.hxx"
#include "config/Block.hxx"
#include "Log.hxx" #include "Log.hxx"
#include <stdexcept> #include <stdexcept>
...@@ -47,7 +48,9 @@ AudioOutputControl::AudioOutputControl(AudioOutput *_output) ...@@ -47,7 +48,9 @@ AudioOutputControl::AudioOutputControl(AudioOutput *_output)
void void
AudioOutputControl::Configure(const ConfigBlock &block) AudioOutputControl::Configure(const ConfigBlock &block)
{ {
(void)block; tags = block.GetBlockValue("tags", true);
always_on = block.GetBlockValue("always_on", false);
enabled = block.GetBlockValue("enabled", true);
} }
const char * const char *
...@@ -69,20 +72,14 @@ AudioOutputControl::GetMixer() const ...@@ -69,20 +72,14 @@ AudioOutputControl::GetMixer() const
} }
bool bool
AudioOutputControl::IsEnabled() const
{
return output->IsEnabled();
}
bool
AudioOutputControl::LockSetEnabled(bool new_value) AudioOutputControl::LockSetEnabled(bool new_value)
{ {
const std::lock_guard<Mutex> protect(mutex); const std::lock_guard<Mutex> protect(mutex);
if (new_value == output->enabled) if (new_value == enabled)
return false; return false;
output->enabled = new_value; enabled = new_value;
return true; return true;
} }
...@@ -90,7 +87,7 @@ bool ...@@ -90,7 +87,7 @@ bool
AudioOutputControl::LockToggleEnabled() AudioOutputControl::LockToggleEnabled()
{ {
const std::lock_guard<Mutex> protect(mutex); const std::lock_guard<Mutex> protect(mutex);
return output->enabled = !output->enabled; return enabled = !enabled;
} }
bool bool
...@@ -170,10 +167,10 @@ AudioOutputControl::DisableAsync() ...@@ -170,10 +167,10 @@ AudioOutputControl::DisableAsync()
void void
AudioOutputControl::EnableDisableAsync() AudioOutputControl::EnableDisableAsync()
{ {
if (output->enabled == output->really_enabled) if (enabled == output->really_enabled)
return; return;
if (output->enabled) if (enabled)
EnableAsync(); EnableAsync();
else else
DisableAsync(); DisableAsync();
...@@ -188,7 +185,7 @@ AudioOutputControl::Open(const AudioFormat audio_format, const MusicPipe &mp) ...@@ -188,7 +185,7 @@ AudioOutputControl::Open(const AudioFormat audio_format, const MusicPipe &mp)
fail_timer.Reset(); fail_timer.Reset();
if (output->open && audio_format == request.audio_format) { if (output->open && audio_format == request.audio_format) {
assert(request.pipe == &mp || (output->always_on && output->pause)); assert(request.pipe == &mp || (always_on && output->pause));
if (!output->pause) if (!output->pause)
/* already open, already the right parameters /* already open, already the right parameters
...@@ -240,7 +237,7 @@ AudioOutputControl::LockUpdate(const AudioFormat audio_format, ...@@ -240,7 +237,7 @@ AudioOutputControl::LockUpdate(const AudioFormat audio_format,
{ {
const std::lock_guard<Mutex> protect(mutex); const std::lock_guard<Mutex> protect(mutex);
if (output->enabled && output->really_enabled) { if (enabled && output->really_enabled) {
if (force || !fail_timer.IsDefined() || if (force || !fail_timer.IsDefined() ||
fail_timer.Check(REOPEN_AFTER * 1000)) { fail_timer.Check(REOPEN_AFTER * 1000)) {
return Open(audio_format, mp); return Open(audio_format, mp);
...@@ -326,7 +323,7 @@ AudioOutputControl::LockAllowPlay() ...@@ -326,7 +323,7 @@ AudioOutputControl::LockAllowPlay()
void void
AudioOutputControl::LockRelease() AudioOutputControl::LockRelease()
{ {
if (output->always_on) if (always_on)
LockPauseAsync(); LockPauseAsync();
else else
LockCloseWait(); LockCloseWait();
......
...@@ -120,6 +120,24 @@ class AudioOutputControl { ...@@ -120,6 +120,24 @@ class AudioOutputControl {
} command = Command::NONE; } command = Command::NONE;
/** /**
* Will this output receive tags from the decoder? The
* default is true, but it may be configured to false to
* suppress sending tags to the output.
*/
bool tags;
/**
* Shall this output always play something (i.e. silence),
* even when playback is stopped?
*/
bool always_on;
/**
* Has the user enabled this device?
*/
bool enabled = true;
/**
* When this flag is set, the output thread will not do any * When this flag is set, the output thread will not do any
* playback. It will wait until the flag is cleared. * playback. It will wait until the flag is cleared.
* *
...@@ -172,8 +190,12 @@ public: ...@@ -172,8 +190,12 @@ public:
gcc_pure gcc_pure
Mixer *GetMixer() const; Mixer *GetMixer() const;
gcc_pure /**
bool IsEnabled() const; * Caller must lock the mutex.
*/
bool IsEnabled() const {
return enabled;
}
/** /**
* @return true if the value has been modified * @return true if the value has been modified
......
...@@ -171,10 +171,6 @@ AudioOutput::Configure(const ConfigBlock &block) ...@@ -171,10 +171,6 @@ AudioOutput::Configure(const ConfigBlock &block)
config_audio_format.Clear(); config_audio_format.Clear();
} }
tags = block.GetBlockValue("tags", true);
always_on = block.GetBlockValue("always_on", false);
enabled = block.GetBlockValue("enabled", true);
/* set up the filter chain */ /* set up the filter chain */
prepared_filter = filter_chain_new(); prepared_filter = filter_chain_new();
......
...@@ -55,24 +55,6 @@ struct AudioOutput { ...@@ -55,24 +55,6 @@ struct AudioOutput {
Mixer *mixer = nullptr; Mixer *mixer = nullptr;
/** /**
* Will this output receive tags from the decoder? The
* default is true, but it may be configured to false to
* suppress sending tags to the output.
*/
bool tags;
/**
* Shall this output always play something (i.e. silence),
* even when playback is stopped?
*/
bool always_on;
/**
* Has the user enabled this device?
*/
bool enabled = true;
/**
* Is this device actually enabled, i.e. the "enable" method * Is this device actually enabled, i.e. the "enable" method
* has succeeded? * has succeeded?
*/ */
...@@ -191,13 +173,6 @@ public: ...@@ -191,13 +173,6 @@ public:
/** /**
* Caller must lock the mutex. * Caller must lock the mutex.
*/ */
bool IsEnabled() const {
return enabled;
}
/**
* Caller must lock the mutex.
*/
bool IsOpen() const { bool IsOpen() const {
return open; return open;
} }
......
...@@ -270,7 +270,7 @@ try { ...@@ -270,7 +270,7 @@ try {
inline bool inline bool
AudioOutputControl::PlayChunk() AudioOutputControl::PlayChunk()
{ {
if (output->tags) { if (tags) {
const auto *tag = output->source.ReadTag(); const auto *tag = output->source.ReadTag();
if (tag != nullptr) { if (tag != nullptr) {
const ScopeUnlock unlock(mutex); const ScopeUnlock unlock(mutex);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment