summaryrefslogtreecommitdiff
path: root/plugins.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-12-11 22:16:34 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-12-11 22:16:34 +0100
commitf8fefd635ad9acda8f5affb0be77a168f78d56b4 (patch)
tree529afc545ea65680366aa6b1a21a1c14fabc2792 /plugins.c
parent47f7266baf4cc88c23e98c3f384d22a4780536e2 (diff)
implemented dynamic output plugin selection
Diffstat (limited to 'plugins.c')
-rw-r--r--plugins.c70
1 files changed, 53 insertions, 17 deletions
diff --git a/plugins.c b/plugins.c
index d8a1534f..54cff709 100644
--- a/plugins.c
+++ b/plugins.c
@@ -163,6 +163,7 @@ static DB_functions_t deadbeef_api = {
.conf_remove_items = conf_remove_items,
// plugin communication
.plug_get_decoder_list = plug_get_decoder_list,
+ .plug_get_output_list = plug_get_output_list,
.plug_get_list = plug_get_list,
.plug_activate = plug_activate,
};
@@ -592,23 +593,7 @@ plug_load_all (void) {
g_output_plugins[numoutput] = NULL;
// select output plugin
- const char *outplugname = conf_get_str ("output_plugin", "alsa");
- for (int i = 0; g_output_plugins[i]; i++) {
- DB_output_t *p = g_output_plugins[i];
- if (!strcmp (p->plugin.name, outplugname)) {
- fprintf (stderr, "selected output plugin: %s\n", outplugname);
- output_plugin = p;
- break;
- }
- }
- if (!output_plugin) {
- output_plugin = g_output_plugins[0];
- }
- if (output_plugin) {
- fprintf (stderr, "selected output plugin: %s\n", output_plugin->plugin.name);
- conf_set_str ("output_plugin", output_plugin->plugin.name);
- }
- else {
+ if (plug_select_output () < 0) {
fprintf (stderr, "failed to find output plugin!\n");
exit (-1);
}
@@ -619,7 +604,9 @@ plug_unload_all (void) {
while (plugins) {
plugin_t *next = plugins->next;
if (plugins->plugin->stop) {
+ fprintf (stderr, "stopping %s...", plugins->plugin->name);
plugins->plugin->stop ();
+ fprintf (stderr, " [OK]\n");
}
if (plugins->handle) {
dlclose (plugins->handle);
@@ -627,6 +614,7 @@ plug_unload_all (void) {
plugins = next;
}
mutex_free (mutex);
+ fprintf (stderr, "all plugins had been unloaded\n");
}
struct DB_decoder_s **
@@ -634,6 +622,11 @@ plug_get_decoder_list (void) {
return g_decoder_plugins;
}
+struct DB_output_s **
+plug_get_output_list (void) {
+ return g_output_plugins;
+}
+
struct DB_vfs_s **
plug_get_vfs_list (void) {
return g_vfs_plugins;
@@ -688,3 +681,46 @@ DB_output_t *
plug_get_output (void) {
return output_plugin;
}
+
+int
+plug_select_output (void) {
+ const char *outplugname = conf_get_str ("output_plugin", "ALSA output plugin");
+ for (int i = 0; g_output_plugins[i]; i++) {
+ DB_output_t *p = g_output_plugins[i];
+ if (!strcmp (p->plugin.name, outplugname)) {
+ fprintf (stderr, "selected output plugin: %s\n", outplugname);
+ output_plugin = p;
+ break;
+ }
+ }
+ if (!output_plugin) {
+ output_plugin = g_output_plugins[0];
+ if (output_plugin) {
+ fprintf (stderr, "selected output plugin: %s\n", output_plugin->plugin.name);
+ conf_set_str ("output_plugin", output_plugin->plugin.name);
+ }
+ }
+ if (!output_plugin) {
+ return -1;
+ }
+ return 0;
+}
+
+void
+plug_reinit_sound (void) {
+ int state = p_get_state ();
+
+ p_free ();
+
+ DB_output_t *prev = plug_get_output ();
+ if (plug_select_output () < 0) {
+ const char *outplugname = conf_get_str ("output_plugin", "ALSA output plugin");
+ fprintf (stderr, "failed to select output plugin %s\nreverted to %s\n", outplugname, prev->plugin.name);
+ output_plugin = prev;
+ }
+ p_init ();
+
+ if (state != OUTPUT_STATE_PAUSED && state != OUTPUT_STATE_STOPPED) {
+ p_play ();
+ }
+}