output/Control: Support always_off
outputs that are never used for playback
Add an `always_off` option to outputs that causes them to never start playback even if they're enabled. This allows placeholder `null` outputs to be defined for the purpose of having an external client react to the enabled state without the side effects of real outputs. Like an external mixer, the client can perform some action when an output is enabled. Normally `null` outputs can be used for playback so it's possible for MPD to continue playback silently if a problem occurs with all the real outputs (or there are none enabled).
This commit is contained in:
@@ -25,6 +25,7 @@ AudioOutputControl::AudioOutputControl(std::unique_ptr<FilteredAudioOutput> _out
|
||||
thread(BIND_THIS_METHOD(Task)),
|
||||
tags(block.GetBlockValue("tags", true)),
|
||||
always_on(block.GetBlockValue("always_on", false)),
|
||||
always_off(block.GetBlockValue("always_off", false)),
|
||||
enabled(block.GetBlockValue("enabled", true))
|
||||
{
|
||||
}
|
||||
@@ -36,7 +37,8 @@ AudioOutputControl::AudioOutputControl(AudioOutputControl &&src,
|
||||
client(_client),
|
||||
thread(BIND_THIS_METHOD(Task)),
|
||||
tags(src.tags),
|
||||
always_on(src.always_on)
|
||||
always_on(src.always_on),
|
||||
always_off(src.always_off)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -176,6 +178,9 @@ AudioOutputControl::EnableAsync()
|
||||
if (!output)
|
||||
return;
|
||||
|
||||
if (always_off)
|
||||
return;
|
||||
|
||||
if (!thread.IsDefined()) {
|
||||
if (!output->SupportsEnableDisable()) {
|
||||
/* don't bother to start the thread now if the
|
||||
|
@@ -143,6 +143,11 @@ class AudioOutputControl {
|
||||
*/
|
||||
const bool always_on;
|
||||
|
||||
/**
|
||||
* Should this output never play anything, even when enabled?
|
||||
*/
|
||||
const bool always_off;
|
||||
|
||||
/**
|
||||
* Has the user enabled this device?
|
||||
*/
|
||||
@@ -274,6 +279,10 @@ public:
|
||||
return !output;
|
||||
}
|
||||
|
||||
bool AlwaysOff() const noexcept {
|
||||
return always_off;
|
||||
}
|
||||
|
||||
/**
|
||||
* Caller must lock the mutex.
|
||||
*/
|
||||
|
@@ -215,6 +215,10 @@ MultipleOutputs::Open(const AudioFormat audio_format)
|
||||
for (const auto &ao : outputs) {
|
||||
const std::scoped_lock<Mutex> lock(ao->mutex);
|
||||
|
||||
/* can't play on this device even if it's enabled */
|
||||
if (ao->AlwaysOff())
|
||||
continue;
|
||||
|
||||
if (ao->IsEnabled())
|
||||
enabled = true;
|
||||
|
||||
|
Reference in New Issue
Block a user