output/init: use the real-time I/O thread only for the ALSA plugin
This commit is contained in:
@@ -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:
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
/* 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:
|
|||||||
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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user