Commit 4df98466 authored by Max Kellermann's avatar Max Kellermann

output/multiple: add "client" field, replacing the "client" parameter

By eliminating GetAnyClient(), we can have instances with no outputs at all.
parent ff2e584b
...@@ -447,8 +447,7 @@ MainConfigured(const struct options &options, const ConfigData &raw_config) ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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; ...@@ -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: ...@@ -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: ...@@ -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?
* *
......
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