Commit 2efa142e authored by Max Kellermann's avatar Max Kellermann

output/init: use the real-time I/O thread only for the ALSA plugin

parent 29b49dd6
...@@ -441,7 +441,8 @@ MainConfigured(const struct options &options, const ConfigData &raw_config) ...@@ -441,7 +441,8 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
command_init(); command_init();
for (auto &partition : instance.partitions) { for (auto &partition : instance.partitions) {
partition.outputs.Configure(instance.rtio_thread.GetEventLoop(), partition.outputs.Configure(instance.io_thread.GetEventLoop(),
instance.rtio_thread.GetEventLoop(),
raw_config, raw_config,
config.replay_gain); config.replay_gain);
partition.UpdateEffectiveReplayGainMode(); partition.UpdateEffectiveReplayGainMode();
......
...@@ -239,7 +239,7 @@ public: ...@@ -239,7 +239,7 @@ public:
* Throws on error. * Throws on error.
*/ */
std::unique_ptr<FilteredAudioOutput> std::unique_ptr<FilteredAudioOutput>
audio_output_new(EventLoop &event_loop, audio_output_new(EventLoop &event_loop, EventLoop &rt_event_loop,
const ReplayGainConfig &replay_gain_config, const ReplayGainConfig &replay_gain_config,
const ConfigBlock &block, const ConfigBlock &block,
const AudioOutputDefaults &defaults, const AudioOutputDefaults &defaults,
......
...@@ -264,7 +264,7 @@ FilteredAudioOutput::Setup(EventLoop &event_loop, ...@@ -264,7 +264,7 @@ FilteredAudioOutput::Setup(EventLoop &event_loop,
} }
std::unique_ptr<FilteredAudioOutput> std::unique_ptr<FilteredAudioOutput>
audio_output_new(EventLoop &event_loop, audio_output_new(EventLoop &normal_event_loop, EventLoop &rt_event_loop,
const ReplayGainConfig &replay_gain_config, const ReplayGainConfig &replay_gain_config,
const ConfigBlock &block, const ConfigBlock &block,
const AudioOutputDefaults &defaults, const AudioOutputDefaults &defaults,
...@@ -294,6 +294,14 @@ audio_output_new(EventLoop &event_loop, ...@@ -294,6 +294,14 @@ audio_output_new(EventLoop &event_loop,
plugin->name); plugin->name);
} }
/* use the real-time I/O thread only for the ALSA plugin;
other plugins like httpd don't need real-time so badly,
because they have larger buffers */
// TODO: don't hard-code the plugin name
auto &event_loop = StringIsEqual(plugin->name, "alsa")
? rt_event_loop
: normal_event_loop;
std::unique_ptr<AudioOutput> ao(ao_plugin_init(event_loop, *plugin, std::unique_ptr<AudioOutput> ao(ao_plugin_init(event_loop, *plugin,
block)); block));
assert(ao != nullptr); assert(ao != nullptr);
......
...@@ -49,14 +49,14 @@ MultipleOutputs::~MultipleOutputs() noexcept ...@@ -49,14 +49,14 @@ MultipleOutputs::~MultipleOutputs() noexcept
} }
static std::unique_ptr<FilteredAudioOutput> static std::unique_ptr<FilteredAudioOutput>
LoadOutput(EventLoop &event_loop, LoadOutput(EventLoop &event_loop, EventLoop &rt_event_loop,
const ReplayGainConfig &replay_gain_config, const ReplayGainConfig &replay_gain_config,
MixerListener &mixer_listener, MixerListener &mixer_listener,
const ConfigBlock &block, const ConfigBlock &block,
const AudioOutputDefaults &defaults, const AudioOutputDefaults &defaults,
FilterFactory *filter_factory) FilterFactory *filter_factory)
try { try {
return audio_output_new(event_loop, replay_gain_config, block, return audio_output_new(event_loop, rt_event_loop, replay_gain_config, block,
defaults, defaults,
filter_factory, filter_factory,
mixer_listener); mixer_listener);
...@@ -69,14 +69,15 @@ try { ...@@ -69,14 +69,15 @@ try {
} }
static std::unique_ptr<AudioOutputControl> static std::unique_ptr<AudioOutputControl>
LoadOutputControl(EventLoop &event_loop, LoadOutputControl(EventLoop &event_loop, EventLoop &rt_event_loop,
const ReplayGainConfig &replay_gain_config, const ReplayGainConfig &replay_gain_config,
MixerListener &mixer_listener, MixerListener &mixer_listener,
AudioOutputClient &client, const ConfigBlock &block, AudioOutputClient &client, const ConfigBlock &block,
const AudioOutputDefaults &defaults, const AudioOutputDefaults &defaults,
FilterFactory *filter_factory) FilterFactory *filter_factory)
{ {
auto output = LoadOutput(event_loop, replay_gain_config, auto output = LoadOutput(event_loop, rt_event_loop,
replay_gain_config,
mixer_listener, mixer_listener,
block, defaults, filter_factory); block, defaults, filter_factory);
auto control = std::make_unique<AudioOutputControl>(std::move(output), client); auto control = std::make_unique<AudioOutputControl>(std::move(output), client);
...@@ -85,7 +86,7 @@ LoadOutputControl(EventLoop &event_loop, ...@@ -85,7 +86,7 @@ LoadOutputControl(EventLoop &event_loop,
} }
void void
MultipleOutputs::Configure(EventLoop &event_loop, MultipleOutputs::Configure(EventLoop &event_loop, EventLoop &rt_event_loop,
const ConfigData &config, const ConfigData &config,
const ReplayGainConfig &replay_gain_config) const ReplayGainConfig &replay_gain_config)
{ {
...@@ -94,7 +95,7 @@ MultipleOutputs::Configure(EventLoop &event_loop, ...@@ -94,7 +95,7 @@ MultipleOutputs::Configure(EventLoop &event_loop,
for (const auto &block : config.GetBlockList(ConfigBlockOption::AUDIO_OUTPUT)) { for (const auto &block : config.GetBlockList(ConfigBlockOption::AUDIO_OUTPUT)) {
block.SetUsed(); block.SetUsed();
auto output = LoadOutputControl(event_loop, auto output = LoadOutputControl(event_loop, rt_event_loop,
replay_gain_config, replay_gain_config,
mixer_listener, mixer_listener,
client, block, defaults, client, block, defaults,
...@@ -110,6 +111,7 @@ MultipleOutputs::Configure(EventLoop &event_loop, ...@@ -110,6 +111,7 @@ MultipleOutputs::Configure(EventLoop &event_loop,
/* auto-detect device */ /* auto-detect device */
const ConfigBlock empty; const ConfigBlock empty;
outputs.emplace_back(LoadOutputControl(event_loop, outputs.emplace_back(LoadOutputControl(event_loop,
rt_event_loop,
replay_gain_config, replay_gain_config,
mixer_listener, mixer_listener,
client, empty, defaults, client, empty, defaults,
......
...@@ -74,7 +74,7 @@ public: ...@@ -74,7 +74,7 @@ public:
MixerListener &_mixer_listener) noexcept; MixerListener &_mixer_listener) noexcept;
~MultipleOutputs() noexcept; ~MultipleOutputs() noexcept;
void Configure(EventLoop &event_loop, void Configure(EventLoop &event_loop, EventLoop &rt_event_loop,
const ConfigData &config, const ConfigData &config,
const ReplayGainConfig &replay_gain_config); const ReplayGainConfig &replay_gain_config);
......
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