MixerPlugin: add EventLoop& init() parameter
This commit is contained in:
parent
4a28333039
commit
e8938b1069
|
@ -476,7 +476,8 @@ int mpd_main(int argc, char *argv[])
|
|||
initialize_decoder_and_player();
|
||||
volume_init();
|
||||
initAudioConfig();
|
||||
instance->partition->outputs.Configure(instance->partition->pc);
|
||||
instance->partition->outputs.Configure(*main_loop,
|
||||
instance->partition->pc);
|
||||
client_manager_init();
|
||||
replay_gain_global_init();
|
||||
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
#include <assert.h>
|
||||
|
||||
Mixer *
|
||||
mixer_new(const struct mixer_plugin *plugin, void *ao,
|
||||
mixer_new(EventLoop &event_loop,
|
||||
const mixer_plugin *plugin, void *ao,
|
||||
const config_param ¶m,
|
||||
Error &error)
|
||||
{
|
||||
|
@ -33,7 +34,7 @@ mixer_new(const struct mixer_plugin *plugin, void *ao,
|
|||
|
||||
assert(plugin != nullptr);
|
||||
|
||||
mixer = plugin->init(ao, param, error);
|
||||
mixer = plugin->init(event_loop, ao, param, error);
|
||||
|
||||
assert(mixer == nullptr || mixer->IsPlugin(*plugin));
|
||||
|
||||
|
|
|
@ -27,11 +27,12 @@
|
|||
|
||||
class Error;
|
||||
class Mixer;
|
||||
class EventLoop;
|
||||
struct mixer_plugin;
|
||||
struct config_param;
|
||||
|
||||
Mixer *
|
||||
mixer_new(const mixer_plugin *plugin, void *ao,
|
||||
mixer_new(EventLoop &event_loop, const mixer_plugin *plugin, void *ao,
|
||||
const config_param ¶m,
|
||||
Error &error);
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
struct config_param;
|
||||
class Mixer;
|
||||
class EventLoop;
|
||||
class Error;
|
||||
|
||||
struct mixer_plugin {
|
||||
|
@ -41,7 +42,8 @@ struct mixer_plugin {
|
|||
* nullptr to ignore errors
|
||||
* @return a mixer object, or nullptr on error
|
||||
*/
|
||||
Mixer *(*init)(void *ao, const config_param ¶m,
|
||||
Mixer *(*init)(EventLoop &event_loop, void *ao,
|
||||
const config_param ¶m,
|
||||
Error &error);
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include "mixer/MixerInternal.hxx"
|
||||
#include "output/OutputAPI.hxx"
|
||||
#include "GlobalEvents.hxx"
|
||||
#include "Main.hxx"
|
||||
#include "event/MultiSocketMonitor.hxx"
|
||||
#include "event/DeferredMonitor.hxx"
|
||||
#include "event/Loop.hxx"
|
||||
|
@ -62,6 +61,8 @@ private:
|
|||
};
|
||||
|
||||
class AlsaMixer final : public Mixer {
|
||||
EventLoop &event_loop;
|
||||
|
||||
const char *device;
|
||||
const char *control;
|
||||
unsigned int index;
|
||||
|
@ -75,7 +76,8 @@ class AlsaMixer final : public Mixer {
|
|||
AlsaMixerMonitor *monitor;
|
||||
|
||||
public:
|
||||
AlsaMixer():Mixer(alsa_mixer_plugin) {}
|
||||
AlsaMixer(EventLoop &_event_loop)
|
||||
:Mixer(alsa_mixer_plugin), event_loop(_event_loop) {}
|
||||
|
||||
void Configure(const config_param ¶m);
|
||||
bool Setup(Error &error);
|
||||
|
@ -162,10 +164,11 @@ AlsaMixer::Configure(const config_param ¶m)
|
|||
}
|
||||
|
||||
static Mixer *
|
||||
alsa_mixer_init(gcc_unused void *ao, const config_param ¶m,
|
||||
alsa_mixer_init(EventLoop &event_loop, gcc_unused void *ao,
|
||||
const config_param ¶m,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
AlsaMixer *am = new AlsaMixer();
|
||||
AlsaMixer *am = new AlsaMixer(event_loop);
|
||||
am->Configure(param);
|
||||
|
||||
return am;
|
||||
|
@ -237,7 +240,7 @@ AlsaMixer::Setup(Error &error)
|
|||
|
||||
snd_mixer_elem_set_callback(elem, alsa_mixer_elem_callback);
|
||||
|
||||
monitor = new AlsaMixerMonitor(*main_loop, handle);
|
||||
monitor = new AlsaMixerMonitor(event_loop, handle);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -96,7 +96,8 @@ OssMixer::Configure(const config_param ¶m, Error &error)
|
|||
}
|
||||
|
||||
static Mixer *
|
||||
oss_mixer_init(gcc_unused void *ao, const config_param ¶m,
|
||||
oss_mixer_init(gcc_unused EventLoop &event_loop, gcc_unused void *ao,
|
||||
const config_param ¶m,
|
||||
Error &error)
|
||||
{
|
||||
OssMixer *om = new OssMixer();
|
||||
|
|
|
@ -143,7 +143,8 @@ pulse_mixer_on_change(PulseMixer *pm,
|
|||
}
|
||||
|
||||
static Mixer *
|
||||
pulse_mixer_init(void *ao, gcc_unused const config_param ¶m,
|
||||
pulse_mixer_init(gcc_unused EventLoop &event_loop, void *ao,
|
||||
gcc_unused const config_param ¶m,
|
||||
Error &error)
|
||||
{
|
||||
PulseOutput *po = (PulseOutput *)ao;
|
||||
|
|
|
@ -34,7 +34,8 @@ struct RoarMixer final : public Mixer {
|
|||
};
|
||||
|
||||
static Mixer *
|
||||
roar_mixer_init(void *ao, gcc_unused const config_param ¶m,
|
||||
roar_mixer_init(gcc_unused EventLoop &event_loop, void *ao,
|
||||
gcc_unused const config_param ¶m,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
return new RoarMixer((RoarOutput *)ao);
|
||||
|
|
|
@ -67,7 +67,7 @@ struct SoftwareMixer final : public Mixer {
|
|||
};
|
||||
|
||||
static Mixer *
|
||||
software_mixer_init(gcc_unused void *ao,
|
||||
software_mixer_init(gcc_unused EventLoop &event_loop, gcc_unused void *ao,
|
||||
gcc_unused const config_param ¶m,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
|
|
|
@ -55,7 +55,8 @@ winmm_volume_encode(int volume)
|
|||
}
|
||||
|
||||
static Mixer *
|
||||
winmm_mixer_init(void *ao, gcc_unused const config_param ¶m,
|
||||
winmm_mixer_init(gcc_unused EventLoop &event_loop, void *ao,
|
||||
gcc_unused const config_param ¶m,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
assert(ao != nullptr);
|
||||
|
|
|
@ -112,7 +112,7 @@ audio_output_mixer_type(const config_param ¶m)
|
|||
}
|
||||
|
||||
static Mixer *
|
||||
audio_output_load_mixer(AudioOutput *ao,
|
||||
audio_output_load_mixer(EventLoop &event_loop, AudioOutput *ao,
|
||||
const config_param ¶m,
|
||||
const struct mixer_plugin *plugin,
|
||||
Filter &filter_chain,
|
||||
|
@ -129,10 +129,10 @@ audio_output_load_mixer(AudioOutput *ao,
|
|||
if (plugin == nullptr)
|
||||
return nullptr;
|
||||
|
||||
return mixer_new(plugin, ao, param, error);
|
||||
return mixer_new(event_loop, plugin, ao, param, error);
|
||||
|
||||
case MIXER_TYPE_SOFTWARE:
|
||||
mixer = mixer_new(&software_mixer_plugin, nullptr,
|
||||
mixer = mixer_new(event_loop, &software_mixer_plugin, nullptr,
|
||||
config_param(),
|
||||
IgnoreError());
|
||||
assert(mixer != nullptr);
|
||||
|
@ -211,7 +211,8 @@ AudioOutput::Configure(const config_param ¶m, Error &error)
|
|||
}
|
||||
|
||||
static bool
|
||||
audio_output_setup(AudioOutput *ao, const config_param ¶m,
|
||||
audio_output_setup(EventLoop &event_loop, AudioOutput *ao,
|
||||
const config_param ¶m,
|
||||
Error &error)
|
||||
{
|
||||
|
||||
|
@ -241,7 +242,7 @@ audio_output_setup(AudioOutput *ao, const config_param ¶m,
|
|||
/* set up the mixer */
|
||||
|
||||
Error mixer_error;
|
||||
ao->mixer = audio_output_load_mixer(ao, param,
|
||||
ao->mixer = audio_output_load_mixer(event_loop, ao, param,
|
||||
ao->plugin.mixer_plugin,
|
||||
*ao->filter, mixer_error);
|
||||
if (ao->mixer == nullptr && mixer_error.IsDefined())
|
||||
|
@ -277,7 +278,7 @@ audio_output_setup(AudioOutput *ao, const config_param ¶m,
|
|||
}
|
||||
|
||||
AudioOutput *
|
||||
audio_output_new(const config_param ¶m,
|
||||
audio_output_new(EventLoop &event_loop, const config_param ¶m,
|
||||
PlayerControl &pc,
|
||||
Error &error)
|
||||
{
|
||||
|
@ -316,7 +317,7 @@ audio_output_new(const config_param ¶m,
|
|||
if (ao == nullptr)
|
||||
return nullptr;
|
||||
|
||||
if (!audio_output_setup(ao, param, error)) {
|
||||
if (!audio_output_setup(event_loop, ao, param, error)) {
|
||||
ao_plugin_finish(ao);
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
class Error;
|
||||
class Filter;
|
||||
class MusicPipe;
|
||||
class EventLoop;
|
||||
struct music_chunk;
|
||||
struct config_param;
|
||||
struct PlayerControl;
|
||||
|
@ -422,7 +423,7 @@ private:
|
|||
extern struct notify audio_output_client_notify;
|
||||
|
||||
AudioOutput *
|
||||
audio_output_new(const config_param ¶m,
|
||||
audio_output_new(EventLoop &event_loop, const config_param ¶m,
|
||||
PlayerControl &pc,
|
||||
Error &error);
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ MultipleOutputs::~MultipleOutputs()
|
|||
}
|
||||
|
||||
static AudioOutput *
|
||||
LoadOutput(PlayerControl &pc, const config_param ¶m)
|
||||
LoadOutput(EventLoop &event_loop, PlayerControl &pc, const config_param ¶m)
|
||||
{
|
||||
Error error;
|
||||
AudioOutput *output = audio_output_new(param, pc, error);
|
||||
AudioOutput *output = audio_output_new(event_loop, param, pc, error);
|
||||
if (output == nullptr) {
|
||||
if (param.line > 0)
|
||||
FormatFatalError("line %i: %s",
|
||||
|
@ -67,12 +67,12 @@ LoadOutput(PlayerControl &pc, const config_param ¶m)
|
|||
}
|
||||
|
||||
void
|
||||
MultipleOutputs::Configure(PlayerControl &pc)
|
||||
MultipleOutputs::Configure(EventLoop &event_loop, PlayerControl &pc)
|
||||
{
|
||||
const config_param *param = nullptr;
|
||||
while ((param = config_get_next_param(CONF_AUDIO_OUTPUT,
|
||||
param)) != nullptr) {
|
||||
auto output = LoadOutput(pc, *param);
|
||||
auto output = LoadOutput(event_loop, pc, *param);
|
||||
if (FindByName(output->name) != nullptr)
|
||||
FormatFatalError("output devices with identical "
|
||||
"names: %s", output->name);
|
||||
|
@ -83,7 +83,7 @@ MultipleOutputs::Configure(PlayerControl &pc)
|
|||
if (outputs.empty()) {
|
||||
/* auto-detect device */
|
||||
const config_param empty;
|
||||
auto output = LoadOutput(pc, empty);
|
||||
auto output = LoadOutput(event_loop, pc, empty);
|
||||
outputs.push_back(output);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
struct AudioFormat;
|
||||
class MusicBuffer;
|
||||
class MusicPipe;
|
||||
class EventLoop;
|
||||
struct music_chunk;
|
||||
struct PlayerControl;
|
||||
struct AudioOutput;
|
||||
|
@ -72,7 +73,7 @@ public:
|
|||
MultipleOutputs();
|
||||
~MultipleOutputs();
|
||||
|
||||
void Configure(PlayerControl &pc);
|
||||
void Configure(EventLoop &event_loop, PlayerControl &pc);
|
||||
|
||||
/**
|
||||
* Returns the total number of audio output devices, including
|
||||
|
|
|
@ -35,8 +35,6 @@
|
|||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
EventLoop *main_loop;
|
||||
|
||||
#ifdef HAVE_PULSE
|
||||
#include "output/plugins/PulseOutputPlugin.hxx"
|
||||
|
||||
|
@ -115,10 +113,10 @@ int main(int argc, gcc_unused char **argv)
|
|||
g_thread_init(NULL);
|
||||
#endif
|
||||
|
||||
main_loop = new EventLoop;
|
||||
EventLoop event_loop;
|
||||
|
||||
Error error;
|
||||
Mixer *mixer = mixer_new(&alsa_mixer_plugin, nullptr,
|
||||
Mixer *mixer = mixer_new(event_loop, &alsa_mixer_plugin, nullptr,
|
||||
config_param(), error);
|
||||
if (mixer == NULL) {
|
||||
LogError(error, "mixer_new() failed");
|
||||
|
@ -135,8 +133,6 @@ int main(int argc, gcc_unused char **argv)
|
|||
mixer_close(mixer);
|
||||
mixer_free(mixer);
|
||||
|
||||
delete main_loop;
|
||||
|
||||
assert(volume >= -1 && volume <= 100);
|
||||
|
||||
if (volume < 0) {
|
||||
|
|
|
@ -45,8 +45,6 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
EventLoop *main_loop;
|
||||
|
||||
void
|
||||
GlobalEvents::Emit(gcc_unused Event event)
|
||||
{
|
||||
|
@ -80,7 +78,7 @@ PlayerControl::PlayerControl(gcc_unused MultipleOutputs &_outputs,
|
|||
PlayerControl::~PlayerControl() {}
|
||||
|
||||
static AudioOutput *
|
||||
load_audio_output(const char *name)
|
||||
load_audio_output(EventLoop &event_loop, const char *name)
|
||||
{
|
||||
const struct config_param *param;
|
||||
|
||||
|
@ -95,7 +93,8 @@ load_audio_output(const char *name)
|
|||
|
||||
Error error;
|
||||
AudioOutput *ao =
|
||||
audio_output_new(*param, dummy_player_control, error);
|
||||
audio_output_new(event_loop, *param, dummy_player_control,
|
||||
error);
|
||||
if (ao == nullptr)
|
||||
LogError(error);
|
||||
|
||||
|
@ -189,14 +188,14 @@ int main(int argc, char **argv)
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
main_loop = new EventLoop();
|
||||
EventLoop event_loop;
|
||||
|
||||
io_thread_init();
|
||||
io_thread_start();
|
||||
|
||||
/* initialize the audio output */
|
||||
|
||||
AudioOutput *ao = load_audio_output(argv[2]);
|
||||
AudioOutput *ao = load_audio_output(event_loop, argv[2]);
|
||||
if (ao == NULL)
|
||||
return 1;
|
||||
|
||||
|
@ -219,8 +218,6 @@ int main(int argc, char **argv)
|
|||
|
||||
io_thread_deinit();
|
||||
|
||||
delete main_loop;
|
||||
|
||||
config_global_finish();
|
||||
|
||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
|
|
Loading…
Reference in New Issue