summaryrefslogtreecommitdiff
path: root/gst-mixer/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-mixer/src/main.c')
-rw-r--r--gst-mixer/src/main.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/gst-mixer/src/main.c b/gst-mixer/src/main.c
new file mode 100644
index 0000000..f039af8
--- /dev/null
+++ b/gst-mixer/src/main.c
@@ -0,0 +1,177 @@
+/* MATE Volume Control
+ * Copyright (C) 2003-2004 Ronald Bultje <[email protected]>
+ *
+ * main.c: intialization, window setup
+ *
+ * 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 <getopt.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+#include <gst/audio/mixerutils.h>
+
+#include "keys.h"
+#include "window.h"
+
+static gchar* page = NULL;
+static GOptionEntry entries[] =
+{
+ { "page", 'p', 0, G_OPTION_ARG_STRING, &page, N_("Startup page"), "playback|recording|switches|options" }
+};
+
+/*
+ * Probe for mixer elements. Set up GList * with elements,
+ * where each element has a GObject data node set of the
+ * name "mate-volume-control-name" with the value being
+ * the human-readable name of the element.
+ *
+ * All elements in the returned GList * are in state
+ * GST_STATE_NULL.
+ */
+
+static gboolean
+mixer_filter_func (GstMixer * mixer, gpointer user_data)
+{
+ GstElementFactory *factory;
+ const gchar *long_name;
+ gchar *devname = NULL;
+ gchar *name;
+ gint *p_count = (gint *) user_data;
+
+ /* fetch name */
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (mixer)),
+ "device-name")) {
+ g_object_get (mixer, "device-name", &devname, NULL);
+ GST_DEBUG ("device name: %s", GST_STR_NULL (devname));
+ } else {
+ devname = NULL;
+ GST_DEBUG ("device name unknown, no 'device-name' property");
+ }
+
+ factory = gst_element_get_factory (GST_ELEMENT (mixer));
+ long_name = gst_element_factory_get_longname (factory);
+
+ if (devname) {
+ name = g_strdup_printf ("%s (%s)", devname, long_name);
+ g_free (devname);
+ } else {
+ gchar *title;
+
+ *p_count += 1;
+
+ title = g_strdup_printf (_("Unknown Volume Control %d"), *p_count);
+ name = g_strdup_printf ("%s (%s)", title, long_name);
+ g_free (title);
+ }
+
+ g_object_set_data_full (G_OBJECT (mixer),
+ "mate-volume-control-name",
+ name,
+ (GDestroyNotify) g_free);
+
+ GST_DEBUG ("Adding '%s' to list of available mixers", name);
+
+ gst_element_set_state (GST_ELEMENT (mixer), GST_STATE_NULL);
+
+ return TRUE; /* add mixer to list */
+}
+
+static GList *
+create_mixer_collection (void)
+{
+ GList *mixer_list;
+ gint counter = 0;
+
+ mixer_list = gst_audio_default_registry_mixer_filter (mixer_filter_func,
+ FALSE,
+ &counter);
+
+ return mixer_list;
+}
+
+static void
+cb_destroy (GtkWidget *widget,
+ gpointer data)
+{
+ gtk_main_quit ();
+}
+
+static void
+cb_check_resize (GtkContainer *container,
+ gpointer user_data)
+{
+ MateConfClient *client;
+ gint width, height;
+
+ client = mateconf_client_get_default();
+ gtk_window_get_size (GTK_WINDOW (container), &width, &height);
+ mateconf_client_set_int (client, PREF_UI_WINDOW_WIDTH, width, NULL);
+ mateconf_client_set_int (client, PREF_UI_WINDOW_HEIGHT, height, NULL);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GOptionContext *ctx;
+ GtkWidget *win;
+ GList *elements;
+
+ /* i18n */
+ bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ g_thread_init (NULL);
+ ctx = g_option_context_new ("mate-volume-control");
+ g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ g_option_context_parse(ctx, &argc, &argv, NULL);
+ g_option_context_free(ctx);
+
+ gtk_init (&argc, &argv);
+
+ gtk_window_set_default_icon_name ("multimedia-volume-control");
+
+ if (!(elements = create_mixer_collection ())) {
+ win = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ _("No volume control GStreamer plugins and/or devices found."));
+ gtk_widget_show (win);
+ gtk_dialog_run (GTK_DIALOG (win));
+ gtk_widget_destroy (win);
+ return -1;
+ }
+
+ /* window contains everything automagically */
+ win = mate_volume_control_window_new (elements);
+ if (page != NULL)
+ mate_volume_control_window_set_page(win, page);
+ g_signal_connect (win, "destroy", G_CALLBACK (cb_destroy), NULL);
+ g_signal_connect (win, "check_resize", G_CALLBACK (cb_check_resize), NULL);
+
+ gtk_widget_show (win);
+ gtk_main ();
+
+ return 0;
+}