output/multiple: add "client" field, replacing the "client" parameter
By eliminating GetAnyClient(), we can have instances with no outputs at all.
This commit is contained in:
@@ -447,8 +447,7 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
|||||||
for (auto &partition : instance.partitions) {
|
for (auto &partition : instance.partitions) {
|
||||||
partition.outputs.Configure(instance.rtio_thread.GetEventLoop(),
|
partition.outputs.Configure(instance.rtio_thread.GetEventLoop(),
|
||||||
raw_config,
|
raw_config,
|
||||||
config.replay_gain,
|
config.replay_gain);
|
||||||
partition.pc);
|
|
||||||
partition.UpdateEffectiveReplayGainMode();
|
partition.UpdateEffectiveReplayGainMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -43,7 +43,7 @@ Partition::Partition(Instance &_instance,
|
|||||||
idle_monitor(instance.event_loop, BIND_THIS_METHOD(OnIdleMonitor)),
|
idle_monitor(instance.event_loop, BIND_THIS_METHOD(OnIdleMonitor)),
|
||||||
global_events(instance.event_loop, BIND_THIS_METHOD(OnGlobalEvent)),
|
global_events(instance.event_loop, BIND_THIS_METHOD(OnGlobalEvent)),
|
||||||
playlist(max_length, *this),
|
playlist(max_length, *this),
|
||||||
outputs(*this),
|
outputs(pc, *this),
|
||||||
pc(*this, outputs,
|
pc(*this, outputs,
|
||||||
instance.input_cache.get(),
|
instance.input_cache.get(),
|
||||||
buffer_chunks,
|
buffer_chunks,
|
||||||
|
@@ -106,8 +106,7 @@ handle_newpartition(Client &client, Request request, Response &response)
|
|||||||
ReplayGainConfig());
|
ReplayGainConfig());
|
||||||
auto &partition = instance.partitions.back();
|
auto &partition = instance.partitions.back();
|
||||||
partition.outputs.AddNullOutput(instance.io_thread.GetEventLoop(),
|
partition.outputs.AddNullOutput(instance.io_thread.GetEventLoop(),
|
||||||
ReplayGainConfig(),
|
ReplayGainConfig());
|
||||||
partition.pc);
|
|
||||||
partition.UpdateEffectiveReplayGainMode();
|
partition.UpdateEffectiveReplayGainMode();
|
||||||
|
|
||||||
instance.EmitIdle(IDLE_PARTITION);
|
instance.EmitIdle(IDLE_PARTITION);
|
||||||
|
@@ -35,8 +35,9 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
MultipleOutputs::MultipleOutputs(MixerListener &_mixer_listener) noexcept
|
MultipleOutputs::MultipleOutputs(AudioOutputClient &_client,
|
||||||
:mixer_listener(_mixer_listener)
|
MixerListener &_mixer_listener) noexcept
|
||||||
|
:client(_client), mixer_listener(_mixer_listener)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,8 +87,7 @@ LoadOutputControl(EventLoop &event_loop,
|
|||||||
void
|
void
|
||||||
MultipleOutputs::Configure(EventLoop &event_loop,
|
MultipleOutputs::Configure(EventLoop &event_loop,
|
||||||
const ConfigData &config,
|
const ConfigData &config,
|
||||||
const ReplayGainConfig &replay_gain_config,
|
const ReplayGainConfig &replay_gain_config)
|
||||||
AudioOutputClient &client)
|
|
||||||
{
|
{
|
||||||
const AudioOutputDefaults defaults(config);
|
const AudioOutputDefaults defaults(config);
|
||||||
FilterFactory filter_factory(config);
|
FilterFactory filter_factory(config);
|
||||||
@@ -119,8 +119,7 @@ MultipleOutputs::Configure(EventLoop &event_loop,
|
|||||||
|
|
||||||
void
|
void
|
||||||
MultipleOutputs::AddNullOutput(EventLoop &event_loop,
|
MultipleOutputs::AddNullOutput(EventLoop &event_loop,
|
||||||
const ReplayGainConfig &replay_gain_config,
|
const ReplayGainConfig &replay_gain_config)
|
||||||
AudioOutputClient &client)
|
|
||||||
{
|
{
|
||||||
const AudioOutputDefaults defaults;
|
const AudioOutputDefaults defaults;
|
||||||
|
|
||||||
@@ -147,8 +146,6 @@ void
|
|||||||
MultipleOutputs::Add(std::unique_ptr<FilteredAudioOutput> output,
|
MultipleOutputs::Add(std::unique_ptr<FilteredAudioOutput> output,
|
||||||
bool enable) noexcept
|
bool enable) noexcept
|
||||||
{
|
{
|
||||||
auto &client = GetAnyClient();
|
|
||||||
|
|
||||||
// TODO: this operation needs to be protected with a mutex
|
// TODO: this operation needs to be protected with a mutex
|
||||||
outputs.emplace_back(std::make_unique<AudioOutputControl>(std::move(output),
|
outputs.emplace_back(std::make_unique<AudioOutputControl>(std::move(output),
|
||||||
client));
|
client));
|
||||||
|
@@ -45,6 +45,8 @@ struct ReplayGainConfig;
|
|||||||
* keeps them synchronized.
|
* keeps them synchronized.
|
||||||
*/
|
*/
|
||||||
class MultipleOutputs final : public PlayerOutputs {
|
class MultipleOutputs final : public PlayerOutputs {
|
||||||
|
AudioOutputClient &client;
|
||||||
|
|
||||||
MixerListener &mixer_listener;
|
MixerListener &mixer_listener;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<AudioOutputControl>> outputs;
|
std::vector<std::unique_ptr<AudioOutputControl>> outputs;
|
||||||
@@ -68,17 +70,16 @@ public:
|
|||||||
* Load audio outputs from the configuration file and
|
* Load audio outputs from the configuration file and
|
||||||
* initialize them.
|
* initialize them.
|
||||||
*/
|
*/
|
||||||
MultipleOutputs(MixerListener &_mixer_listener) noexcept;
|
MultipleOutputs(AudioOutputClient &_client,
|
||||||
|
MixerListener &_mixer_listener) noexcept;
|
||||||
~MultipleOutputs() noexcept;
|
~MultipleOutputs() noexcept;
|
||||||
|
|
||||||
void Configure(EventLoop &event_loop,
|
void Configure(EventLoop &event_loop,
|
||||||
const ConfigData &config,
|
const ConfigData &config,
|
||||||
const ReplayGainConfig &replay_gain_config,
|
const ReplayGainConfig &replay_gain_config);
|
||||||
AudioOutputClient &client);
|
|
||||||
|
|
||||||
void AddNullOutput(EventLoop &event_loop,
|
void AddNullOutput(EventLoop &event_loop,
|
||||||
const ReplayGainConfig &replay_gain_config,
|
const ReplayGainConfig &replay_gain_config);
|
||||||
AudioOutputClient &client);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the total number of audio output devices, including
|
* Returns the total number of audio output devices, including
|
||||||
@@ -156,10 +157,6 @@ public:
|
|||||||
void SetSoftwareVolume(unsigned volume) noexcept;
|
void SetSoftwareVolume(unsigned volume) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AudioOutputClient &GetAnyClient() noexcept {
|
|
||||||
return outputs.front()->GetClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Was Open() called successfully?
|
* Was Open() called successfully?
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user