This is the patch I've been using, against gnome-media 2.14.2-1. -- Sam Morris http://robots.org.uk/
PGP key id 1024D/5EA01078 3412 EA18 1277 354B 991B C869 B219 7FDB 5EA0 1078
? cddb-slave2/.deps
? gnome-cd/.deps
? gnome-cd/.libs
? gnome-cd/GNOME_Media_CDDBSlave2-common.lo
? gnome-cd/GNOME_Media_CDDBSlave2-skels.lo
? gnome-cd/GNOME_Media_CDDBSlave2-stubs.lo
? gnome-cd/libgnomemedia-cddbslave2.la
? gnome-cd/access/.deps
? gnome-cd/access/.libs
? gnome-cd/access/cddisplayaccessible.lo
? gnome-cd/access/cddisplayaccessiblefactory.lo
? gnome-cd/access/factory.lo
? gnome-cd/access/libgnomecdaccess.la
? gnome-cd/access/pangoaccessible.lo
? gnome-cd/access/pangoaccessiblefactory.lo
? grecord/src/recent-files/.deps
? gst-mixer/src/.deps
? gst-mixer/src/.kdbgrc.gnome-volume-control
? gst-mixer/src/.libs
? gstreamer-properties/.deps
? po/.intltool-merge-cache
? po/stamp-it
? profiles/.deps
? profiles/glade/.deps
Index: gst-mixer/src/Makefile.am
===================================================================
RCS file: /cvs/gnome/gnome-media/gst-mixer/src/Makefile.am,v
retrieving revision 1.8
diff -p -u -r1.8 Makefile.am
--- gst-mixer/src/Makefile.am 16 Sep 2004 20:20:11 -0000 1.8
+++ gst-mixer/src/Makefile.am 1 Jun 2006 15:00:28 -0000
@@ -13,7 +13,8 @@ gnome_volume_control_SOURCES = \
preferences.c \
track.c \
volume.c \
- window.c
+ window.c \
+ misc.c
noinst_HEADERS = \
button.h \
@@ -23,7 +24,8 @@ noinst_HEADERS = \
stock.h \
track.h \
volume.h \
- window.h
+ window.h \
+ misc.h
gnome_volume_control_LDFLAGS = \
$(GSTMIXER_LIBS)
Index: gst-mixer/src/element.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gst-mixer/src/element.c,v
retrieving revision 1.7
diff -p -u -r1.7 element.c
--- gst-mixer/src/element.c 19 Jan 2006 23:52:21 -0000 1.7
+++ gst-mixer/src/element.c 1 Jun 2006 15:00:28 -0000
@@ -30,6 +30,7 @@
#include "keys.h"
#include "preferences.h"
#include "track.h"
+#include "misc.h"
static void gnome_volume_control_element_class_init (GnomeVolumeControlElementClass *klass);
static void gnome_volume_control_element_init (GnomeVolumeControlElement *el);
@@ -166,19 +167,6 @@ gnome_volume_control_element_whitelist (
* Hide/show notebook page.
*/
-static gint
-get_page_num (GstMixerTrack *track)
-{
- if (GST_IS_MIXER_OPTIONS (track))
- return 3;
- else if (track->num_channels == 0)
- return 2;
- else if (track->flags & GST_MIXER_TRACK_INPUT)
- return 1;
- else
- return 0;
-}
-
static void
update_tab_visibility (GnomeVolumeControlElement *el, gint page)
{
@@ -298,7 +286,7 @@ gnome_volume_control_element_change (Gno
/* visible? */
active = gnome_volume_control_element_whitelist (track, list);
- key = get_gconf_key (el->mixer, track->label);
+ key = get_gconf_key (el->mixer, track);
if ((value = gconf_client_get (el->client, key, NULL)) != NULL &&
value->type == GCONF_VALUE_BOOL) {
active = gconf_value_get_bool (value);
@@ -390,7 +378,7 @@ cb_gconf (GConfClient *client,
gpointer data)
{
GnomeVolumeControlElement *el = GNOME_VOLUME_CONTROL_ELEMENT (data);
- gchar *keybase = get_gconf_key (el->mixer, "");
+ gchar *keybase = get_gconf_key (el->mixer, NULL);
if (!strncmp (gconf_entry_get_key (entry),
keybase, strlen (keybase))) {
@@ -401,7 +389,7 @@ cb_gconf (GConfClient *client,
GstMixerTrack *track = item->data;
GnomeVolumeControlTrack *trkw =
g_object_get_data (G_OBJECT (track), "gnome-volume-control-trkw");
- gchar *key = get_gconf_key (el->mixer, track->label);
+ gchar *key = get_gconf_key (el->mixer, track);
if (!strcmp (gconf_entry_get_key (entry), key)) {
GConfValue *value = gconf_entry_get_value (entry);
Index: gst-mixer/src/misc.c
===================================================================
RCS file: gst-mixer/src/misc.c
diff -N gst-mixer/src/misc.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gst-mixer/src/misc.c 1 Jun 2006 15:00:28 -0000
@@ -0,0 +1,48 @@
+#include <gst/interfaces/mixer.h>
+#include <gst/interfaces/mixertrack.h>
+#include <gst/interfaces/mixeroptions.h>
+
+#include <glib.h>
+
+#define _(String) gettext((String))
+
+gint get_page_num (GstMixerTrack *track)
+{
+ /* GstMixerOptions derives from GstMixerTrack */
+ if (GST_IS_MIXER_OPTIONS (track)) {
+ return 3;
+ } else {
+ /* present tracks without channels as toggle switches */
+ if (track->num_channels == 0)
+ return 2;
+ else {
+ /* is it possible to have a track that does input and output? */
+ g_assert (! (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_INPUT)
+ && GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_OUTPUT)));
+
+ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_INPUT))
+ return 1;
+ else if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_OUTPUT))
+ return 0;
+ }
+ }
+
+ g_assert_not_reached ();
+}
+
+gchar *get_page_description (gint n)
+{
+ /* needs i18n work */
+ switch (n) {
+ case 0:
+ return _("Playback");
+ case 1:
+ return _("Capture");
+ case 2:
+ return _("Switch");
+ case 3:
+ return _("Option");
+ }
+
+ g_assert_not_reached ();
+}
Index: gst-mixer/src/misc.h
===================================================================
RCS file: gst-mixer/src/misc.h
diff -N gst-mixer/src/misc.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gst-mixer/src/misc.h 1 Jun 2006 15:00:28 -0000
@@ -0,0 +1,6 @@
+#include <glib.h>
+#include <gst/interfaces/mixertrack.h>
+
+gint get_page_num (GstMixerTrack *track);
+
+gchar *get_page_description (gint n);
Index: gst-mixer/src/preferences.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gst-mixer/src/preferences.c,v
retrieving revision 1.5
diff -p -u -r1.5 preferences.c
--- gst-mixer/src/preferences.c 19 Jan 2006 23:52:21 -0000 1.5
+++ gst-mixer/src/preferences.c 1 Jun 2006 15:00:28 -0000
@@ -30,11 +30,13 @@
#include "preferences.h"
#include "keys.h"
#include "track.h"
+#include "misc.h"
enum {
COL_ACTIVE,
COL_LABEL,
COL_TRACK,
+ COL_TYPE,
NUM_COLS
};
@@ -122,7 +124,7 @@ gnome_volume_control_preferences_init (G
gtk_widget_show (label);
store = gtk_list_store_new (NUM_COLS, G_TYPE_BOOLEAN,
- G_TYPE_STRING, G_TYPE_POINTER);
+ G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING);
prefs->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (prefs->treeview), FALSE);
gtk_label_set_mnemonic_widget (GTK_LABEL(label), GTK_WIDGET (prefs->treeview));
@@ -133,7 +135,7 @@ gnome_volume_control_preferences_init (G
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (view),
GTK_SHADOW_IN);
- gtk_widget_set_usize (view, -1, 150);
+ gtk_widget_set_size_request (view, -1, 250);
gtk_container_add (GTK_CONTAINER (view), prefs->treeview);
gtk_box_pack_start (GTK_BOX (box), view, TRUE, TRUE, 0);
@@ -160,6 +162,12 @@ gnome_volume_control_preferences_init (G
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (prefs->treeview), col);
+ render = gtk_cell_renderer_text_new ();
+ col = gtk_tree_view_column_new_with_attributes ("Type", render,
+ "text", COL_TYPE,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (prefs->treeview), col);
+
gtk_tree_view_set_search_column (GTK_TREE_VIEW (prefs->treeview), COL_LABEL);
/* and show */
@@ -230,29 +238,34 @@ gnome_volume_control_preferences_respons
gchar *
get_gconf_key (GstMixer *mixer,
- gchar *track_label)
+ GstMixerTrack *track)
{
- gchar *res;
- const gchar *dev = g_object_get_data (G_OBJECT (mixer),
- "gnome-volume-control-name");
- gint i, pos;
-
- pos = strlen (GNOME_VOLUME_CONTROL_KEY_DIR) + 1;
- res = g_new (gchar, pos + strlen (dev) + 1 + strlen (track_label) + 1);
- strcpy (res, GNOME_VOLUME_CONTROL_KEY_DIR "/");
-
- for (i = 0; dev[i] != '\0'; i++) {
- if (g_ascii_isalnum (dev[i]))
- res[pos++] = dev[i];
+ GString *key = g_string_sized_new (90);
+
+ g_string_append_printf (key, "%s/", GNOME_VOLUME_CONTROL_KEY_DIR);
+
+ gchar *device = g_object_get_data (G_OBJECT (mixer),
+ "gnome-volume-control-name");
+ gint i;
+ for (i = 0; device[i] != '\0'; i++) {
+ if (g_ascii_isalnum (device[i]))
+ g_string_append_c (key, device[i]);
}
- res[pos] = '/';
- for (i = 0; track_label[i] != '\0'; i++) {
- if (g_ascii_isalnum (track_label[i]))
- res[pos++] = track_label[i];
+
+ if (track != NULL) {
+ g_string_append_c (key, '-');
+
+ for (i = 0; track->label[i] != '\0'; i++) {
+ if (g_ascii_isalnum (track->label[i]))
+ g_string_append_c (key, track->label[i]);
+ }
+
+ g_string_append_printf (key, "-%d", get_page_num (track));
}
- res[pos] = '\0';
- return res;
+ gchar *result = g_strdup (key->str);
+ g_string_free (key, TRUE);
+ return result;
}
/*
@@ -277,6 +290,7 @@ gnome_volume_control_preferences_change
/* remove old */
while (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
gtk_list_store_remove (store, &iter);
+ /* does this free COL_TYPE? */
}
/* take/put reference */
@@ -286,21 +300,24 @@ gnome_volume_control_preferences_change
for (item = gst_mixer_list_tracks (mixer);
item != NULL; item = item->next) {
GstMixerTrack *track = item->data;
- gchar *key = get_gconf_key (mixer, track->label);
+ gchar *key = get_gconf_key (mixer, track);
GConfValue *value;
+ gchar *type;
gboolean active = gnome_volume_control_element_whitelist (track, list);
-
if ((value = gconf_client_get (prefs->client, key, NULL)) != NULL &&
value->type == GCONF_VALUE_BOOL) {
active = gconf_value_get_bool (value);
}
g_free (key);
+ type = get_page_description (get_page_num (track));
+
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COL_ACTIVE, active,
COL_LABEL, track->label,
COL_TRACK, track,
+ COL_TYPE, type,
-1);
}
}
@@ -335,7 +352,7 @@ cb_toggle (GtkCellRendererToggle *cell,
-1);
gtk_tree_path_free (path);
- key = get_gconf_key (prefs->mixer, track->label);
+ key = get_gconf_key (prefs->mixer, track);
value = gconf_value_new (GCONF_VALUE_BOOL);
gconf_value_set_bool (value, active);
gconf_client_set (prefs->client, key, value, NULL);
Index: gst-mixer/src/preferences.h
===================================================================
RCS file: /cvs/gnome/gnome-media/gst-mixer/src/preferences.h,v
retrieving revision 1.2
diff -p -u -r1.2 preferences.h
--- gst-mixer/src/preferences.h 19 Jan 2006 23:52:21 -0000 1.2
+++ gst-mixer/src/preferences.h 1 Jun 2006 15:00:28 -0000
@@ -69,7 +69,7 @@ void gnome_volume_control_preferences_ch
* GConf thingy. Escapes spaces and such.
*/
gchar * get_gconf_key (GstMixer *mixer,
- gchar *track_label);
+ GstMixerTrack *track);
G_END_DECLS
Index: gst-mixer/src/track.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gst-mixer/src/track.c,v
retrieving revision 1.8
diff -p -u -r1.8 track.c
--- gst-mixer/src/track.c 15 Apr 2005 12:59:37 -0000 1.8
+++ gst-mixer/src/track.c 1 Jun 2006 15:00:28 -0000
@@ -24,6 +24,7 @@
#endif
#include <gnome.h>
+#include <string.h>
#include "button.h"
#include "stock.h"
@@ -74,14 +75,29 @@ cb_record_toggled (GnomeVolumeControlBut
gnome_volume_control_button_get_active (button));
}
+/* Tells us whether toggling a switch should change the corresponding
+ * GstMixerTrack's MUTE or RECORD flag.
+ */
+static gboolean
+should_toggle_record_switch (const GstMixerTrack *track)
+{
+ return GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_INPUT);
+}
+
+
static void
cb_toggle_changed (GtkToggleButton *button,
gpointer data)
{
GnomeVolumeControlTrack *ctrl = data;
- gst_mixer_set_mute (ctrl->mixer, ctrl->track,
- !gtk_toggle_button_get_active (button));
+ if (should_toggle_record_switch (ctrl->track)) {
+ gst_mixer_set_record (ctrl->mixer, ctrl->track,
+ gtk_toggle_button_get_active (button));
+ } else {
+ gst_mixer_set_mute (ctrl->mixer, ctrl->track,
+ !gtk_toggle_button_get_active (button));
+ }
}
static void
@@ -109,6 +125,14 @@ static gboolean
cb_check (gpointer data)
{
GnomeVolumeControlTrack *trkw = data;
+
+ /* trigger an update of the mixer state */
+ if (! GST_IS_MIXER_OPTIONS (trkw->track)) {
+ gint *dummy = g_new (gint, 1);
+ gst_mixer_get_volume (trkw->mixer, GST_MIXER_TRACK (trkw->track), dummy);
+ g_free (dummy);
+ }
+
gboolean mute = GST_MIXER_TRACK_HAS_FLAG (trkw->track,
GST_MIXER_TRACK_MUTE) ? TRUE : FALSE,
record = GST_MIXER_TRACK_HAS_FLAG (trkw->track,
@@ -136,20 +160,20 @@ cb_check (gpointer data)
}
if (trkw->toggle) {
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (trkw->toggle)) ==
- mute) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (trkw->toggle), !mute);
+ if (should_toggle_record_switch (trkw->track)) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (trkw->toggle),
+ GST_MIXER_TRACK_HAS_FLAG (trkw->track, GST_MIXER_TRACK_RECORD));
+ } else {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (trkw->toggle),
+ !GST_MIXER_TRACK_HAS_FLAG (trkw->track, GST_MIXER_TRACK_MUTE));
}
}
/* FIXME:
* - options.
- * - we cannot check flags! We need a _get_*() function in the
- * mixer interface, because flags don't change if other
- * apps change device state.
*/
- return (trkw->mute || trkw->record);
+ return TRUE;
}
/*
@@ -180,7 +204,7 @@ gnome_volume_control_track_add_title (Gt
ctrl->visible = TRUE;
ctrl->table = table;
ctrl->pos = tab_pos;
- ctrl->id = g_timeout_add (100, cb_check, ctrl);
+ ctrl->id = g_timeout_add (200, cb_check, ctrl);
/* image (optional) */
for (i = 0; !found && pix[i].label != NULL; i++) {
@@ -398,9 +422,13 @@ gnome_volume_control_track_add_switch (G
GTK_ORIENTATION_HORIZONTAL,
mixer, track, l_sep, r_sep);
ctrl->toggle = gtk_check_button_new ();
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctrl->toggle),
- !GST_MIXER_TRACK_HAS_FLAG (ctrl->track,
- GST_MIXER_TRACK_MUTE));
+ if (should_toggle_record_switch (ctrl->track)) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctrl->toggle),
+ GST_MIXER_TRACK_HAS_FLAG (ctrl->track, GST_MIXER_TRACK_RECORD));
+ } else {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctrl->toggle),
+ !GST_MIXER_TRACK_HAS_FLAG (ctrl->track, GST_MIXER_TRACK_MUTE));
+ }
/* attach'n'show */
gtk_table_attach (GTK_TABLE (table), ctrl->toggle,
signature.asc
Description: This is a digitally signed message part

