output/Internal: move several flags to struct AudioOutputControl
This commit is contained in:
parent
2e65686fc0
commit
5eef146871
@ -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)
|
|||||||
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 *
|
||||||
@ -68,21 +71,15 @@ AudioOutputControl::GetMixer() const
|
|||||||
return output->mixer;
|
return output->mixer;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
AudioOutputControl::IsEnabled() const
|
|
||||||
{
|
|
||||||
return output->IsEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
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
|
|||||||
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()
|
|||||||
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)
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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()
|
|||||||
void
|
void
|
||||||
AudioOutputControl::LockRelease()
|
AudioOutputControl::LockRelease()
|
||||||
{
|
{
|
||||||
if (output->always_on)
|
if (always_on)
|
||||||
LockPauseAsync();
|
LockPauseAsync();
|
||||||
else
|
else
|
||||||
LockCloseWait();
|
LockCloseWait();
|
||||||
|
@ -119,6 +119,24 @@ class AudioOutputControl {
|
|||||||
KILL
|
KILL
|
||||||
} 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:
|
|||||||
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)
|
|||||||
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();
|
||||||
|
@ -54,24 +54,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?
|
||||||
@ -188,13 +170,6 @@ public:
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Caller must lock the mutex.
|
|
||||||
*/
|
|
||||||
bool IsEnabled() const {
|
|
||||||
return enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Caller must lock the mutex.
|
* Caller must lock the mutex.
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user