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
136 lines
3.7 KiB
C
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);
|
|
}
|