summaryrefslogtreecommitdiff
path: root/mixer/load.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixer/load.c')
-rw-r--r--mixer/load.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/mixer/load.c b/mixer/load.c
new file mode 100644
index 00000000..4c2c3fb0
--- /dev/null
+++ b/mixer/load.c
@@ -0,0 +1,181 @@
+/* MATE Volume Applet
+ * Copyright (C) 2004 Ronald Bultje <[email protected]>
+ *
+ * load.c: applet boilerplate code
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <gst/audio/mixerutils.h>
+
+#include "applet.h"
+
+typedef struct _FilterHelper {
+ GList *names_list;
+ gint count;
+} FilterHelper;
+
+
+static gboolean
+_filter_func (GstMixer *mixer, gpointer data) {
+ GstElementFactory *factory;
+ const gchar *longname;
+ FilterHelper *helper = (FilterHelper *)data;
+ gchar *device = NULL;
+ gchar *name, *original;
+
+ /* fetch name */
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (mixer)), "device-name")) {
+ g_object_get (mixer, "device-name", &device, NULL);
+ GST_DEBUG ("device-name: %s", GST_STR_NULL (device));
+ } else {
+ GST_DEBUG ("no 'device-name' property: device name unknown");
+ }
+
+ factory = gst_element_get_factory (GST_ELEMENT (mixer));
+ longname = gst_element_factory_get_longname (factory);
+
+ if (device) {
+ GList *list;
+ gint duplicates = 0;
+
+ name = g_strdup_printf ("%s (%s)", device, longname);
+ g_free (device);
+
+ /* Devices are sorted by names, we must ensure that the names are unique */
+ for (list = helper->names_list; list != NULL; list = list->next) {
+ if (strcmp ((const gchar *) list->data, name) == 0)
+ duplicates++;
+ }
+
+ if (duplicates > 0) {
+ /*
+ * There is a duplicate name, so append an index to make the name
+ * unique within the list
+ */
+ original = name;
+ name = g_strdup_printf("%s #%d", name, duplicates + 1);
+ } else {
+ original = g_strdup(name);
+ }
+ } else {
+ gchar *title;
+
+ (helper->count)++;
+
+ title = g_strdup_printf (_("Unknown Volume Control %d"), helper->count);
+ name = g_strdup_printf ("%s (%s)", title, longname);
+ original = g_strdup(name);
+ g_free (title);
+ }
+
+ helper->names_list = g_list_prepend (helper->names_list, name);
+
+ GST_DEBUG ("Adding '%s' to the list of available mixers", name);
+
+ g_object_set_data_full (G_OBJECT (mixer),
+ "mate-volume-applet-name",
+ name,
+ (GDestroyNotify) g_free);
+
+ /* Is this even used anywhere? */
+ g_object_set_data_full (G_OBJECT(mixer),
+ "mate-volume-applet-origname",
+ original,
+ (GDestroyNotify) g_free);
+
+ name = NULL; /* no need to free, passed ownership to object data */
+ original = NULL; /* no need to free, passed ownership to object data */
+
+ gst_element_set_state (GST_ELEMENT (mixer), GST_STATE_NULL);
+
+ return TRUE;
+}
+
+GList *
+mate_volume_applet_create_mixer_collection (void)
+{
+ FilterHelper helper;
+ GList *mixer_list;
+
+ helper.count = 0;
+ helper.names_list = NULL;
+
+ mixer_list = gst_audio_default_registry_mixer_filter(_filter_func, FALSE, &helper);
+ g_list_free (helper.names_list);
+
+ return mixer_list;
+}
+
+static gboolean
+mate_volume_applet_toplevel_configure_handler (GtkWidget *widget,
+ GdkEventConfigure *event,
+ gpointer data)
+{
+ GList *elements;
+ static gboolean init = FALSE;
+
+ g_signal_handlers_disconnect_by_func (widget,
+ mate_volume_applet_toplevel_configure_handler,
+ data);
+
+ if (!init) {
+ gst_init (NULL, NULL);
+ init = TRUE;
+ }
+
+ elements = mate_volume_applet_create_mixer_collection ();
+ mate_volume_applet_setup (MATE_VOLUME_APPLET (data), elements);
+
+ return FALSE;
+}
+
+static gboolean
+mate_volume_applet_factory (MatePanelApplet *applet,
+ const gchar *iid,
+ gpointer data)
+{
+ /* we delay applet specific initialization until the applet
+ * is fully registered with the panel since gst_init() can block
+ * for longer than the service activation timeouts
+ *
+ * We use configure-event as a hook because after the applet is
+ * registered with b-a-s and the panel, the panel sets size hints
+ * on the applet and gives it an initial size.
+ *
+ * http://bugzilla.mate.org/show_bug.cgi?id=385305
+ */
+ g_signal_connect (gtk_widget_get_toplevel (GTK_WIDGET (applet)),
+ "configure-event",
+ G_CALLBACK (mate_volume_applet_toplevel_configure_handler),
+ applet);
+ return TRUE;
+}
+
+MATE_PANEL_APPLET_OUT_PROCESS_FACTORY (
+ "MixerAppletFactory",
+ MATE_TYPE_VOLUME_APPLET,
+ "mixer_applet2",
+ mate_volume_applet_factory,
+ NULL
+)