gnome-control-center/capplets/sound/mixer-support.c
Jan Arne Petersen 90b67faf65 Fixes #173035
2007-01-08  Jan Arne Petersen  <jpetersen@jpetersen.org>

	Fixes #173035

	* configure.in: updated sound capplet requirements.

	* gnome-settings-daemon/actions/Makefile.am:
	* gnome-settings-daemon/actions/acme-volume-gstreamer.c:
	(acme_volume_gstreamer_finalize), (acme_volume_gstreamer_set_mute),
	(update_state), (acme_volume_gstreamer_get_mute),
	(acme_volume_gstreamer_get_volume),
	(acme_volume_gstreamer_set_volume),
	(acme_volume_gstreamer_close_real), (_acme_set_mixer),
	(acme_volume_gstreamer_open), (acme_volume_gstreamer_init): added
	support for multiple mixer tracks. Added support for gconf device and
	track selection.

	* capplets/sound/Makefile.am, mixer-support.c, mixer-support.h: Add new files.
	* capplets/sound/sound-properties-capplet.c: (mixer_device_combobox_changed),
	(add_track_label_to_list), (mixer_tracks_selection_changed),
	(update_mixer_tracks_selection), (default_mixer_tracks_notify),
	(update_mixer_device_combobox), (default_mixer_device_notify),
	(setup_default_mixer), (setup_dialog):
	* capplets/sound/sound-properties.glade: added support for selecting mixer device and
	tracks in the capplet.


svn path=/trunk/; revision=7113
2007-01-08 22:50:39 +00:00

136 lines
3.7 KiB
C

/* mixer-support.c
*
* Copyright (C) 2007 Jan Arne Petersen <jap@gnome.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; 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/glist.h>
#include <glib/gi18n.h>
#include <gst/audio/mixerutils.h>
#include <gtk/gtkliststore.h>
#include "mixer-support.h"
GtkTreeModel *
create_mixer_device_tree_model (void)
{
GtkListStore *device_store;
GList *mixer_list, *l;
guint unknown = 0;
device_store = gtk_list_store_new (MIXER_DEVICE_MODEL_COLUMN_COUNT,
G_TYPE_STRING, G_TYPE_STRING, GST_TYPE_ELEMENT);
mixer_list = gst_audio_default_registry_mixer_filter(NULL, FALSE, NULL);
for (l = mixer_list; l != NULL; l = l->next) {
GstElement *mixer = GST_ELEMENT (l->data);
gchar *device_name = NULL, *device = NULL;
GstElementFactory *factory;
const gchar *longname, *factory_name;
gchar *name;
GtkTreeIter tree_iter;
gst_element_set_state (mixer, GST_STATE_READY);
/* fetch name */
if (g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (mixer)), "device-name")) {
g_object_get (mixer, "device-name", &device_name, NULL);
}
if (g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (mixer)), "device")) {
g_object_get (mixer, "device", &device, NULL);
}
factory = gst_element_get_factory (mixer);
longname = gst_element_factory_get_longname (factory);
factory_name = gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory));
/* gst_element_set_state (mixer, GST_STATE_NULL); */
if (device_name) {
name = g_strdup_printf ("%s (%s)", device_name, longname);
g_free (device_name);
} else {
gchar *title;
unknown++;
title = g_strdup_printf (_("Unknown Volume Control %d"), unknown);
name = g_strdup_printf ("%s (%s)", title, longname);
g_free (title);
}
if (device) {
gchar *tmp;
tmp = g_strdup_printf ("%s:%s", factory_name, device);
g_free (device);
device = tmp;
} else {
device = g_strdup (factory_name);
}
gtk_list_store_insert_with_values (device_store, &tree_iter, -1,
MIXER_DEVICE_MODEL_NAME_COLUMN, name,
MIXER_DEVICE_MODEL_DEVICE_COLUMN, device,
MIXER_DEVICE_MODEL_MIXER_COLUMN, mixer,
-1);
gst_element_set_state (mixer, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (mixer));
g_free (name);
g_free (device);
}
g_list_free (mixer_list);
return GTK_TREE_MODEL (device_store);
}
GtkTreeModel *
create_mixer_tracks_tree_model_for_mixer (GstMixer *mixer)
{
GtkListStore *tracks_store;
const GList *tracks, *l;
tracks_store = gtk_list_store_new (MIXER_TRACKS_MODEL_COLUMN_COUNT,
G_TYPE_STRING);
tracks = gst_mixer_list_tracks (mixer);
for (l = tracks; l != NULL; l = l->next) {
GstMixerTrack *track = l->data;
GtkTreeIter iter;
if (track->num_channels <= 0) {
continue;
}
gtk_list_store_insert_with_values (tracks_store, &iter, -1,
MIXER_TRACKS_MODEL_LABEL_COLUMN, track->label,
-1);
}
return GTK_TREE_MODEL (tracks_store);
}