summaryrefslogtreecommitdiff
path: root/mate-volume-control/src/gvc-mixer-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-volume-control/src/gvc-mixer-dialog.c')
-rw-r--r--mate-volume-control/src/gvc-mixer-dialog.c1543
1 files changed, 754 insertions, 789 deletions
diff --git a/mate-volume-control/src/gvc-mixer-dialog.c b/mate-volume-control/src/gvc-mixer-dialog.c
index 58840b1..a29bdc9 100644
--- a/mate-volume-control/src/gvc-mixer-dialog.c
+++ b/mate-volume-control/src/gvc-mixer-dialog.c
@@ -20,11 +20,6 @@
#include "config.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <math.h>
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
@@ -36,73 +31,63 @@
#include "gvc-channel-bar.h"
#include "gvc-balance-bar.h"
#include "gvc-combo-box.h"
-#include "gvc-mixer-control.h"
-#include "gvc-mixer-card.h"
-#include "gvc-mixer-sink.h"
-#include "gvc-mixer-source.h"
-#include "gvc-mixer-source-output.h"
#include "gvc-mixer-dialog.h"
#include "gvc-sound-theme-chooser.h"
#include "gvc-level-bar.h"
#include "gvc-speaker-test.h"
-
-#define SCALE_SIZE 128
+#include "mvc-helpers.h"
#define GVC_MIXER_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_DIALOG, GvcMixerDialogPrivate))
-struct GvcMixerDialogPrivate
+struct _GvcMixerDialogPrivate
{
- GvcMixerControl *mixer_control;
MateMixerControl *control;
- GHashTable *bars;
- GtkWidget *notebook;
- GtkWidget *output_bar;
- GtkWidget *input_bar;
- GtkWidget *input_level_bar;
- GtkWidget *effects_bar;
- GtkWidget *output_stream_box;
- GtkWidget *sound_effects_box;
- GtkWidget *hw_box;
- GtkWidget *hw_treeview;
- GtkWidget *hw_settings_box;
- GtkWidget *hw_profile_combo;
- GtkWidget *input_box;
- GtkWidget *output_box;
- GtkWidget *applications_box;
- GtkWidget *applications_scrolled_window;
- GtkWidget *no_apps_label;
- GtkWidget *output_treeview;
- GtkWidget *output_settings_box;
- GtkWidget *output_balance_bar;
- GtkWidget *output_fade_bar;
- GtkWidget *output_lfe_bar;
- GtkWidget *output_port_combo;
- GtkWidget *input_treeview;
- GtkWidget *input_port_combo;
- GtkWidget *input_settings_box;
- GtkWidget *sound_theme_chooser;
- GtkWidget *click_feedback_button;
- GtkWidget *audible_bell_button;
- GtkSizeGroup *size_group;
- GtkSizeGroup *apps_size_group;
-
- gdouble last_input_peak;
- guint num_apps;
+ GHashTable *bars;
+ GtkWidget *notebook;
+ GtkWidget *output_bar;
+ GtkWidget *input_bar;
+ GtkWidget *input_level_bar;
+ GtkWidget *effects_bar;
+ GtkWidget *output_stream_box;
+ GtkWidget *sound_effects_box;
+ GtkWidget *hw_box;
+ GtkWidget *hw_treeview;
+ GtkWidget *hw_settings_box;
+ GtkWidget *hw_profile_combo;
+ GtkWidget *input_box;
+ GtkWidget *output_box;
+ GtkWidget *applications_box;
+ GtkWidget *applications_scrolled_window;
+ GtkWidget *no_apps_label;
+ GtkWidget *output_treeview;
+ GtkWidget *output_settings_box;
+ GtkWidget *output_balance_bar;
+ GtkWidget *output_fade_bar;
+ GtkWidget *output_lfe_bar;
+ GtkWidget *output_port_combo;
+ GtkWidget *input_treeview;
+ GtkWidget *input_port_combo;
+ GtkWidget *input_settings_box;
+ GtkWidget *sound_theme_chooser;
+ GtkSizeGroup *size_group;
+ GtkSizeGroup *apps_size_group;
+ gdouble last_input_peak;
+ guint num_apps;
};
enum {
NAME_COLUMN,
+ DESCRIPTION_COLUMN,
DEVICE_COLUMN,
ACTIVE_COLUMN,
- ID_COLUMN,
SPEAKERS_COLUMN,
NUM_COLUMNS
};
enum {
- HW_ID_COLUMN,
HW_ICON_COLUMN,
HW_NAME_COLUMN,
+ HW_DESCRIPTION_COLUMN,
HW_STATUS_COLUMN,
HW_PROFILE_COLUMN,
HW_PROFILE_HUMAN_COLUMN,
@@ -110,6 +95,14 @@ enum {
HW_NUM_COLUMNS
};
+enum {
+ PAGE_EVENTS,
+ PAGE_HARDWARE,
+ PAGE_INPUT,
+ PAGE_OUTPUT,
+ PAGE_APPLICATIONS
+};
+
enum
{
PROP_0,
@@ -122,7 +115,7 @@ static void gvc_mixer_dialog_finalize (GObject *object);
static void bar_set_stream (GvcMixerDialog *dialog,
GtkWidget *bar,
- GvcMixerStream *stream);
+ MateMixerStream *stream);
static void on_adjustment_value_changed (GtkAdjustment *adjustment,
GvcMixerDialog *dialog);
@@ -144,59 +137,62 @@ update_default_input (GvcMixerDialog *dialog)
}
do {
gboolean toggled;
- gboolean is_default;
- guint id;
- GvcMixerStream *stream;
+ gboolean is_default = FALSE;
+ MateMixerStream *stream;
+ gchar *name;
gtk_tree_model_get (model, &iter,
- ID_COLUMN, &id,
+ NAME_COLUMN, &name,
ACTIVE_COLUMN, &toggled,
-1);
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id);
+ stream = mate_mixer_control_get_stream (dialog->priv->control, name);
if (stream == NULL) {
- g_warning ("Unable to find stream for id: %u", id);
+ g_warning ("Unable to find stream for id: %s", name);
+ g_free (name);
continue;
}
- is_default = FALSE;
- if (stream == gvc_mixer_control_get_default_source (dialog->priv->mixer_control)) {
+ if (stream == mate_mixer_control_get_default_input_stream (dialog->priv->control))
is_default = TRUE;
- }
gtk_list_store_set (GTK_LIST_STORE (model),
&iter,
ACTIVE_COLUMN, is_default,
-1);
+
+ g_free (name);
} while (gtk_tree_model_iter_next (model, &iter));
}
static void
update_description (GvcMixerDialog *dialog,
guint column,
- const char *value,
- GvcMixerStream *stream)
+ const gchar *value,
+ MateMixerStream *stream)
{
GtkTreeModel *model;
GtkTreeIter iter;
- guint id;
+ MateMixerStreamFlags flags;
+ const gchar *name;
+
+ flags = mate_mixer_stream_get_flags (stream);
- if (GVC_IS_MIXER_SOURCE (stream))
+ if (flags & MATE_MIXER_STREAM_INPUT)
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview));
- else if (GVC_IS_MIXER_SINK (stream))
+ else if (flags & MATE_MIXER_STREAM_OUTPUT)
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview));
else
g_assert_not_reached ();
+
gtk_tree_model_get_iter_first (model, &iter);
- id = gvc_mixer_stream_get_id (stream);
+ name = mate_mixer_stream_get_name (stream);
do {
- guint current_id;
+ const gchar *current_name;
- gtk_tree_model_get (model, &iter,
- ID_COLUMN, &current_id,
- -1);
- if (id != current_id)
+ gtk_tree_model_get (model, &iter, NAME_COLUMN, &current_name, -1);
+ if (!g_strcmp0 (name, current_name))
continue;
gtk_list_store_set (GTK_LIST_STORE (model),
@@ -208,28 +204,27 @@ update_description (GvcMixerDialog *dialog,
}
static void
-port_selection_changed (GvcComboBox *combo_box,
- const char *port,
+port_selection_changed (GvcComboBox *combo,
+ const gchar *port,
GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
- stream = g_object_get_data (G_OBJECT (combo_box), "stream");
+ stream = g_object_get_data (G_OBJECT (combo), "stream");
if (stream == NULL) {
g_warning ("Could not find stream for port combo box");
return;
}
- if (gvc_mixer_stream_change_port (stream, port) == FALSE) {
- g_warning ("Could not change port for stream");
- }
+
+ mate_mixer_stream_set_active_port (stream, port);
}
static void
update_output_settings (GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
- const GvcChannelMap *map;
- const GList *ports;
+ MateMixerStream *stream;
+ MateMixerStreamFlags flags;
+ const GList *ports;
g_debug ("Updating output settings");
if (dialog->priv->output_balance_bar != NULL) {
@@ -253,24 +248,20 @@ update_output_settings (GvcMixerDialog *dialog)
dialog->priv->output_port_combo = NULL;
}
- stream = gvc_mixer_control_get_default_sink (dialog->priv->mixer_control);
+ stream = mate_mixer_control_get_default_output_stream (dialog->priv->control);
if (stream == NULL) {
g_warning ("Default sink stream not found");
return;
}
+ flags = mate_mixer_stream_get_flags (stream);
+
gvc_channel_bar_set_base_volume (GVC_CHANNEL_BAR (dialog->priv->output_bar),
- gvc_mixer_stream_get_base_volume (stream));
+ mate_mixer_stream_get_base_volume (stream));
gvc_channel_bar_set_is_amplified (GVC_CHANNEL_BAR (dialog->priv->output_bar),
- gvc_mixer_stream_get_can_decibel (stream));
-
- map = gvc_mixer_stream_get_channel_map (stream);
- if (map == NULL) {
- g_warning ("Default sink stream has no channel map");
- return;
- }
+ flags & MATE_MIXER_STREAM_HAS_DECIBEL_VOLUME);
- dialog->priv->output_balance_bar = gvc_balance_bar_new (map, BALANCE_TYPE_RL);
+ dialog->priv->output_balance_bar = gvc_balance_bar_new (stream, BALANCE_TYPE_RL);
if (dialog->priv->size_group != NULL) {
gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_balance_bar),
dialog->priv->size_group,
@@ -281,8 +272,8 @@ update_output_settings (GvcMixerDialog *dialog)
FALSE, FALSE, 6);
gtk_widget_show (dialog->priv->output_balance_bar);
- if (gvc_channel_map_can_fade (map)) {
- dialog->priv->output_fade_bar = gvc_balance_bar_new (map, BALANCE_TYPE_FR);
+ if (flags & MATE_MIXER_STREAM_CAN_FADE) {
+ dialog->priv->output_fade_bar = gvc_balance_bar_new (stream, BALANCE_TYPE_FR);
if (dialog->priv->size_group != NULL) {
gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_fade_bar),
dialog->priv->size_group,
@@ -294,8 +285,8 @@ update_output_settings (GvcMixerDialog *dialog)
gtk_widget_show (dialog->priv->output_fade_bar);
}
- if (gvc_channel_map_has_lfe (map)) {
- dialog->priv->output_lfe_bar = gvc_balance_bar_new (map, BALANCE_TYPE_LFE);
+ if (mate_mixer_stream_has_position (stream, MATE_MIXER_CHANNEL_LFE)) {
+ dialog->priv->output_lfe_bar = gvc_balance_bar_new (stream, BALANCE_TYPE_LFE);
if (dialog->priv->size_group != NULL) {
gvc_balance_bar_set_size_group (GVC_BALANCE_BAR (dialog->priv->output_lfe_bar),
dialog->priv->size_group,
@@ -307,15 +298,19 @@ update_output_settings (GvcMixerDialog *dialog)
gtk_widget_show (dialog->priv->output_lfe_bar);
}
- ports = gvc_mixer_stream_get_ports (stream);
+ ports = mate_mixer_stream_list_ports (stream);
if (ports != NULL) {
- const GvcMixerStreamPort *port;
- port = gvc_mixer_stream_get_port (stream);
+ MateMixerPort *port;
+
+ port = mate_mixer_stream_get_active_port (stream);
dialog->priv->output_port_combo = gvc_combo_box_new (_("Co_nnector:"));
gvc_combo_box_set_ports (GVC_COMBO_BOX (dialog->priv->output_port_combo),
ports);
- gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->output_port_combo), port->port);
+
+ gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->output_port_combo),
+ mate_mixer_port_get_name (port));
+
g_object_set_data (G_OBJECT (dialog->priv->output_port_combo), "stream", stream);
g_signal_connect (G_OBJECT (dialog->priv->output_port_combo), "changed",
G_CALLBACK (port_selection_changed), dialog);
@@ -330,7 +325,7 @@ update_output_settings (GvcMixerDialog *dialog)
}
/* FIXME: We could make this into a "No settings" label instead */
- gtk_widget_set_sensitive (dialog->priv->output_balance_bar, gvc_channel_map_can_balance (map));
+ gtk_widget_set_sensitive (dialog->priv->output_balance_bar, flags & MATE_MIXER_STREAM_CAN_BALANCE);
}
static void
@@ -343,47 +338,44 @@ update_default_output (GvcMixerDialog *dialog)
gtk_tree_model_get_iter_first (model, &iter);
do {
gboolean toggled;
- gboolean is_default;
- guint id;
- GvcMixerStream *stream;
+ gboolean is_default = FALSE;
+ gchar *name;
+ MateMixerStream *stream;
gtk_tree_model_get (model, &iter,
- ID_COLUMN, &id,
+ NAME_COLUMN, &name,
ACTIVE_COLUMN, &toggled,
-1);
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id);
+ stream = mate_mixer_control_get_stream (dialog->priv->control, name);
if (stream == NULL) {
- g_warning ("Unable to find stream for id: %u", id);
+ g_warning ("Unable to find stream for id: %s", name);
+ g_free (name);
continue;
}
- is_default = FALSE;
- if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) {
+ if (stream == mate_mixer_control_get_default_output_stream (dialog->priv->control))
is_default = TRUE;
- }
gtk_list_store_set (GTK_LIST_STORE (model),
&iter,
ACTIVE_COLUMN, is_default,
-1);
+ g_free (name);
} while (gtk_tree_model_iter_next (model, &iter));
}
static void
-on_mixer_control_default_sink_changed (GvcMixerControl *control,
- guint id,
- GvcMixerDialog *dialog)
+on_control_default_output_notify (MateMixerControl *control,
+ GParamSpec *pspec,
+ GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
- g_debug ("GvcMixerDialog: default sink changed: %u", id);
+ g_debug ("Default output stream has changed");
+
+ stream = mate_mixer_control_get_default_output_stream (control);
- if (id == PA_INVALID_INDEX)
- stream = NULL;
- else
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control,
- id);
bar_set_stream (dialog, dialog->priv->output_bar, stream);
update_output_settings (dialog);
@@ -395,8 +387,7 @@ on_mixer_control_default_sink_changed (GvcMixerControl *control,
#define DECAY_STEP .15
static void
-update_input_peak (GvcMixerDialog *dialog,
- gdouble v)
+update_input_peak (GvcMixerDialog *dialog, gdouble v)
{
GtkAdjustment *adj;
@@ -417,18 +408,11 @@ update_input_peak (GvcMixerDialog *dialog,
}
static void
-update_input_meter (GvcMixerDialog *dialog,
- uint32_t source_index,
- uint32_t sink_input_idx,
- double v)
-{
- update_input_peak (dialog, v);
-}
-
-static void
on_monitor_suspended_callback (pa_stream *s,
void *userdata)
{
+ // XXX
+ /*
GvcMixerDialog *dialog;
dialog = userdata;
@@ -440,209 +424,122 @@ on_monitor_suspended_callback (pa_stream *s,
PA_INVALID_INDEX,
-1);
}
+ */
}
static void
-on_monitor_read_callback (pa_stream *s,
- size_t length,
- void *userdata)
-{
- GvcMixerDialog *dialog;
- const void *data;
- double v;
-
- dialog = userdata;
-
- if (pa_stream_peek (s, &data, &length) < 0) {
- g_warning ("Failed to read data from stream");
- return;
- }
-
- assert (length > 0);
- assert (length % sizeof (float) == 0);
-
- v = ((const float *) data)[length / sizeof (float) -1];
-
- pa_stream_drop (s);
-
- if (v < 0) {
- v = 0;
- }
- if (v > 1) {
- v = 1;
- }
-
- update_input_meter (dialog,
- pa_stream_get_device_index (s),
- pa_stream_get_monitor_stream (s),
- v);
-}
-
-static void
-create_monitor_stream_for_source (GvcMixerDialog *dialog,
- GvcMixerStream *stream)
-{
- pa_stream *s;
- char t[16];
- pa_buffer_attr attr;
- pa_sample_spec ss;
- pa_context *context;
- int res;
- pa_proplist *proplist;
- gboolean has_monitor;
-
- if (stream == NULL) {
- return;
- }
- has_monitor = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (stream), "has-monitor"));
- if (has_monitor != FALSE) {
- return;
- }
-
- g_debug ("Create monitor for %u",
- gvc_mixer_stream_get_index (stream));
-
- context = gvc_mixer_control_get_pa_context (dialog->priv->mixer_control);
-
- if (pa_context_get_server_protocol_version (context) < 13) {
- return;
- }
-
- ss.channels = 1;
- ss.format = PA_SAMPLE_FLOAT32;
- ss.rate = 25;
-
- memset (&attr, 0, sizeof (attr));
- attr.fragsize = sizeof (float);
- attr.maxlength = (uint32_t) -1;
-
- snprintf (t, sizeof (t), "%u", gvc_mixer_stream_get_index (stream));
-
- proplist = pa_proplist_new ();
- pa_proplist_sets (proplist, PA_PROP_APPLICATION_ID, "org.mate.VolumeControl");
- s = pa_stream_new_with_proplist (context, _("Peak detect"), &ss, NULL, proplist);
- pa_proplist_free (proplist);
- if (s == NULL) {
- g_warning ("Failed to create monitoring stream");
- return;
- }
-
- pa_stream_set_read_callback (s, on_monitor_read_callback, dialog);
- pa_stream_set_suspended_callback (s, on_monitor_suspended_callback, dialog);
-
- res = pa_stream_connect_record (s,
- t,
- &attr,
- (pa_stream_flags_t) (PA_STREAM_DONT_MOVE
- |PA_STREAM_PEAK_DETECT
- |PA_STREAM_ADJUST_LATENCY));
- if (res < 0) {
- g_warning ("Failed to connect monitoring stream");
- pa_stream_unref (s);
- } else {
- g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (TRUE));
- g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", s);
- g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", stream);
- }
-}
-
-static void
-stop_monitor_stream_for_source (GvcMixerDialog *dialog)
+on_stream_monitor_value (MateMixerStream *stream,
+ gdouble value,
+ GvcMixerDialog *dialog)
{
- pa_stream *s;
- pa_context *context;
- int res;
- GvcMixerStream *stream;
-
- s = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream");
- if (s == NULL)
- return;
- stream = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "stream");
- g_assert (stream != NULL);
-
- g_debug ("Stopping monitor for %u", pa_stream_get_index (s));
-
- context = gvc_mixer_control_get_pa_context (dialog->priv->mixer_control);
-
- if (pa_context_get_server_protocol_version (context) < 13) {
- return;
- }
-
- res = pa_stream_disconnect (s);
- if (res == 0)
- g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (FALSE));
- g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", NULL);
- g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", NULL);
+ g_debug ("Monitor %.2f", value);
+ update_input_peak (dialog, value);
}
static void
update_input_settings (GvcMixerDialog *dialog)
{
- const GList *ports;
- GvcMixerStream *stream;
+ MateMixerStream *stream;
+ MateMixerStreamFlags flags;
+ const GList *ports;
g_debug ("Updating input settings");
- stop_monitor_stream_for_source (dialog);
-
if (dialog->priv->input_port_combo != NULL) {
gtk_container_remove (GTK_CONTAINER (dialog->priv->input_settings_box),
dialog->priv->input_port_combo);
dialog->priv->input_port_combo = NULL;
}
- stream = gvc_mixer_control_get_default_source (dialog->priv->mixer_control);
+ stream = mate_mixer_control_get_default_input_stream (dialog->priv->control);
if (stream == NULL) {
g_debug ("Default source stream not found");
return;
}
+ mate_mixer_stream_monitor_set_name (stream, _("Peak detect"));
+
+ g_signal_connect (G_OBJECT (stream),
+ "monitor-value",
+ G_CALLBACK (on_stream_monitor_value),
+ dialog);
+
+ flags = mate_mixer_stream_get_flags (stream);
+
gvc_channel_bar_set_base_volume (GVC_CHANNEL_BAR (dialog->priv->input_bar),
- gvc_mixer_stream_get_base_volume (stream));
+ mate_mixer_stream_get_base_volume (stream));
+
+ // XXX probably wrong
gvc_channel_bar_set_is_amplified (GVC_CHANNEL_BAR (dialog->priv->input_bar),
- gvc_mixer_stream_get_can_decibel (stream));
+ flags & MATE_MIXER_STREAM_HAS_DECIBEL_VOLUME);
- ports = gvc_mixer_stream_get_ports (stream);
+ ports = mate_mixer_stream_list_ports (stream);
if (ports != NULL) {
- const GvcMixerStreamPort *port;
- port = gvc_mixer_stream_get_port (stream);
+ MateMixerPort *port;
+
+ port = mate_mixer_stream_get_active_port (stream);
dialog->priv->input_port_combo = gvc_combo_box_new (_("Co_nnector:"));
gvc_combo_box_set_ports (GVC_COMBO_BOX (dialog->priv->input_port_combo),
ports);
- gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->input_port_combo), port->port);
- g_object_set_data (G_OBJECT (dialog->priv->input_port_combo), "stream", stream);
- g_signal_connect (G_OBJECT (dialog->priv->input_port_combo), "changed",
- G_CALLBACK (port_selection_changed), dialog);
+ gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->input_port_combo),
+ mate_mixer_port_get_name (port));
+
+ g_object_set_data (G_OBJECT (dialog->priv->input_port_combo),
+ "stream",
+ stream);
+
+ g_signal_connect (G_OBJECT (dialog->priv->input_port_combo),
+ "changed",
+ G_CALLBACK (port_selection_changed),
+ dialog);
+
+ gvc_combo_box_set_size_group (GVC_COMBO_BOX (dialog->priv->input_port_combo),
+ dialog->priv->size_group,
+ FALSE);
- gvc_combo_box_set_size_group (GVC_COMBO_BOX (dialog->priv->input_port_combo), dialog->priv->size_group, FALSE);
gtk_box_pack_start (GTK_BOX (dialog->priv->input_settings_box),
dialog->priv->input_port_combo,
TRUE, TRUE, 0);
+
gtk_widget_show (dialog->priv->input_port_combo);
}
-
- create_monitor_stream_for_source (dialog, stream);
}
static void
-on_mixer_control_default_source_changed (GvcMixerControl *control,
- guint id,
- GvcMixerDialog *dialog)
+on_control_default_input_notify (MateMixerControl *control,
+ GParamSpec *pspec,
+ GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
+ MateMixerStream *current;
GtkAdjustment *adj;
- g_debug ("GvcMixerDialog: default source changed: %u", id);
+ stream = mate_mixer_control_get_default_input_stream (control);
- if (id == PA_INVALID_INDEX)
- stream = NULL;
- else
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id);
+ current = g_object_get_data (G_OBJECT (dialog->priv->input_bar), "gvc-mixer-dialog-stream");
+ if (current != NULL)
+ g_signal_handlers_disconnect_by_func (G_OBJECT (current),
+ on_stream_monitor_value,
+ dialog);
+
+ if (gtk_notebook_get_current_page (GTK_NOTEBOOK (dialog->priv->notebook)) == PAGE_INPUT) {
+ if (current != NULL)
+ mate_mixer_stream_monitor_stop (current);
+ if (stream != NULL)
+ mate_mixer_stream_monitor_start (stream);
+ }
+
+ // g_debug ("GvcMixerDialog: default source changed: %u", id);
+
+ // XXX is the default input reffed/unreffed anywhere?
/* Disconnect the adj, otherwise it might change if is_amplified changes */
adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (dialog->priv->input_bar)));
- g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog);
+
+ g_signal_handlers_disconnect_by_func (adj,
+ on_adjustment_value_changed,
+ dialog);
bar_set_stream (dialog, dialog->priv->input_bar, stream);
update_input_settings (dialog);
@@ -656,87 +553,10 @@ on_mixer_control_default_source_changed (GvcMixerControl *control,
}
static void
-gvc_mixer_dialog_set_mixer_control (GvcMixerDialog *dialog,
- GvcMixerControl *control)
-{
- g_return_if_fail (GVC_MIXER_DIALOG (dialog));
- g_return_if_fail (GVC_IS_MIXER_CONTROL (control));
-
- g_object_ref (control);
-
- if (dialog->priv->mixer_control != NULL) {
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
- G_CALLBACK (on_mixer_control_default_sink_changed),
- dialog);
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
- G_CALLBACK (on_mixer_control_default_source_changed),
- dialog);
- g_object_unref (dialog->priv->mixer_control);
- }
-
- dialog->priv->mixer_control = control;
-
- g_signal_connect (dialog->priv->mixer_control,
- "default-sink-changed",
- G_CALLBACK (on_mixer_control_default_sink_changed),
- dialog);
- g_signal_connect (dialog->priv->mixer_control,
- "default-source-changed",
- G_CALLBACK (on_mixer_control_default_source_changed),
- dialog);
-
- g_object_notify (G_OBJECT (dialog), "mixer-control");
-}
-
-static GvcMixerControl *
-gvc_mixer_dialog_get_mixer_control (GvcMixerDialog *dialog)
-{
- g_return_val_if_fail (GVC_IS_MIXER_DIALOG (dialog), NULL);
-
- return dialog->priv->mixer_control;
-}
-
-static void
-gvc_mixer_dialog_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GvcMixerDialog *self = GVC_MIXER_DIALOG (object);
-
- switch (prop_id) {
- case PROP_MIXER_CONTROL:
- gvc_mixer_dialog_set_mixer_control (self, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gvc_mixer_dialog_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GvcMixerDialog *self = GVC_MIXER_DIALOG (object);
-
- switch (prop_id) {
- case PROP_MIXER_CONTROL:
- g_value_set_object (value, gvc_mixer_dialog_get_mixer_control (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
on_adjustment_value_changed (GtkAdjustment *adjustment,
GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
stream = g_object_get_data (G_OBJECT (adjustment), "gvc-mixer-dialog-stream");
if (stream != NULL) {
@@ -755,10 +575,9 @@ on_adjustment_value_changed (GtkAdjustment *adjustment,
/* FIXME would need to do that in the balance bar really... */
/* Make sure we do not unmute muted streams, there's a button for that */
if (volume == 0.0)
- gvc_mixer_stream_set_is_muted (stream, TRUE);
- /* Only push the volume if it's actually changed */
- if (gvc_mixer_stream_set_volume(stream, (pa_volume_t) rounded) != FALSE)
- gvc_mixer_stream_push_volume (stream);
+ mate_mixer_stream_set_mute (stream, TRUE);
+
+ mate_mixer_stream_set_volume (stream, rounded);
}
}
@@ -768,13 +587,13 @@ on_bar_is_muted_notify (GObject *object,
GvcMixerDialog *dialog)
{
gboolean is_muted;
- GvcMixerStream *stream;
+ MateMixerStream *stream;
is_muted = gvc_channel_bar_get_is_muted (GVC_CHANNEL_BAR (object));
stream = g_object_get_data (object, "gvc-mixer-dialog-stream");
if (stream != NULL) {
- gvc_mixer_stream_change_is_muted (stream, is_muted);
+ mate_mixer_stream_set_mute (stream, is_muted);
} else {
char *name;
g_object_get (object, "name", &name, NULL);
@@ -784,30 +603,25 @@ on_bar_is_muted_notify (GObject *object,
}
static GtkWidget *
-lookup_bar_for_stream (GvcMixerDialog *dialog,
- GvcMixerStream *stream)
+lookup_bar_for_stream (GvcMixerDialog *dialog, MateMixerStream *stream)
{
- GtkWidget *bar;
-
- bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)));
-
- return bar;
+ return g_hash_table_lookup (dialog->priv->bars, mate_mixer_stream_get_name (stream));
}
static GtkWidget *
lookup_combo_box_for_stream (GvcMixerDialog *dialog,
- GvcMixerStream *stream)
+ MateMixerStream *stream)
{
- GvcMixerStream *combo_stream;
- guint id;
+ MateMixerStream *combo_stream;
+ const gchar *name;
- id = gvc_mixer_stream_get_id (stream);
+ name = mate_mixer_stream_get_name (stream);
if (dialog->priv->output_port_combo != NULL) {
combo_stream = g_object_get_data (G_OBJECT (dialog->priv->output_port_combo),
"stream");
if (combo_stream != NULL) {
- if (id == gvc_mixer_stream_get_id (combo_stream))
+ if (!g_strcmp0 (name, mate_mixer_stream_get_name (combo_stream)))
return dialog->priv->output_port_combo;
}
}
@@ -816,7 +630,7 @@ lookup_combo_box_for_stream (GvcMixerDialog *dialog,
combo_stream = g_object_get_data (G_OBJECT (dialog->priv->input_port_combo),
"stream");
if (combo_stream != NULL) {
- if (id == gvc_mixer_stream_get_id (combo_stream))
+ if (!g_strcmp0 (name, mate_mixer_stream_get_name (combo_stream)))
return dialog->priv->input_port_combo;
}
}
@@ -825,12 +639,12 @@ lookup_combo_box_for_stream (GvcMixerDialog *dialog,
}
static void
-on_stream_description_notify (GvcMixerStream *stream,
+on_stream_description_notify (MateMixerStream *stream,
GParamSpec *pspec,
GvcMixerDialog *dialog)
{
update_description (dialog, NAME_COLUMN,
- gvc_mixer_stream_get_description (stream),
+ mate_mixer_stream_get_description (stream),
stream);
}
@@ -839,23 +653,27 @@ on_stream_port_notify (GObject *object,
GParamSpec *pspec,
GvcMixerDialog *dialog)
{
- GvcComboBox *combo_box;
- char *port;
+ GvcComboBox *combo;
+ MateMixerPort *port;
- combo_box = GVC_COMBO_BOX (lookup_combo_box_for_stream (dialog, GVC_MIXER_STREAM (object)));
- if (combo_box == NULL)
+ combo = GVC_COMBO_BOX (lookup_combo_box_for_stream (dialog, MATE_MIXER_STREAM (object)));
+ if (combo == NULL)
return;
- g_signal_handlers_block_by_func (G_OBJECT (combo_box),
+ g_signal_handlers_block_by_func (G_OBJECT (combo),
port_selection_changed,
dialog);
- g_object_get (object, "port", &port, NULL);
- gvc_combo_box_set_active (GVC_COMBO_BOX (combo_box), port);
+ g_object_get (object, "active-port", &port, NULL);
+ // XXX is this correct?
+ if (port) {
+ gvc_combo_box_set_active (GVC_COMBO_BOX (combo),
+ mate_mixer_port_get_name (port));
+ }
- g_signal_handlers_unblock_by_func (G_OBJECT (combo_box),
- port_selection_changed,
- dialog);
+ g_signal_handlers_unblock_by_func (G_OBJECT (combo),
+ port_selection_changed,
+ dialog);
}
static void
@@ -863,17 +681,17 @@ on_stream_volume_notify (GObject *object,
GParamSpec *pspec,
GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
GtkWidget *bar;
GtkAdjustment *adj;
- stream = GVC_MIXER_STREAM (object);
+ stream = MATE_MIXER_STREAM (object);
bar = lookup_bar_for_stream (dialog, stream);
if (bar == NULL) {
g_warning ("Unable to find bar for stream %s in on_stream_volume_notify()",
- gvc_mixer_stream_get_name (stream));
+ mate_mixer_stream_get_name (stream));
return;
}
@@ -884,7 +702,7 @@ on_stream_volume_notify (GObject *object,
dialog);
gtk_adjustment_set_value (adj,
- gvc_mixer_stream_get_volume (stream));
+ mate_mixer_stream_get_volume (stream));
g_signal_handlers_unblock_by_func (adj,
on_adjustment_value_changed,
@@ -892,28 +710,27 @@ on_stream_volume_notify (GObject *object,
}
static void
-on_stream_is_muted_notify (GObject *object,
- GParamSpec *pspec,
- GvcMixerDialog *dialog)
+on_stream_mute_notify (GObject *object,
+ GParamSpec *pspec,
+ GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
+ MateMixerStream *stream;
GtkWidget *bar;
gboolean is_muted;
- stream = GVC_MIXER_STREAM (object);
+ stream = MATE_MIXER_STREAM (object);
bar = lookup_bar_for_stream (dialog, stream);
if (bar == NULL) {
g_warning ("Unable to find bar for stream %s in on_stream_is_muted_notify()",
- gvc_mixer_stream_get_name (stream));
+ mate_mixer_stream_get_name (stream));
return;
}
- is_muted = gvc_mixer_stream_get_is_muted (stream);
- gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (bar),
- is_muted);
+ is_muted = mate_mixer_stream_get_mute (stream);
+ gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (bar), is_muted);
- if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) {
+ if (stream == mate_mixer_control_get_default_output_stream (dialog->priv->control)) {
gtk_widget_set_sensitive (dialog->priv->applications_box,
!is_muted);
}
@@ -921,12 +738,12 @@ on_stream_is_muted_notify (GObject *object,
}
static void
-save_bar_for_stream (GvcMixerDialog *dialog,
- GvcMixerStream *stream,
- GtkWidget *bar)
+save_bar_for_stream (GvcMixerDialog *dialog,
+ MateMixerStream *stream,
+ GtkWidget *bar)
{
g_hash_table_insert (dialog->priv->bars,
- GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
+ (gpointer) mate_mixer_stream_get_name (stream),
bar);
}
@@ -956,14 +773,10 @@ create_bar (GvcMixerDialog *dialog,
}
static void
-bar_set_stream (GvcMixerDialog *dialog,
- GtkWidget *bar,
- GvcMixerStream *stream)
+bar_set_stream (GvcMixerDialog *dialog, GtkWidget *bar, MateMixerStream *stream)
{
- GtkAdjustment *adj;
- GvcMixerStream *old_stream;
-
- g_assert (bar != NULL);
+ GtkAdjustment *adj;
+ MateMixerStream *old_stream;
old_stream = g_object_get_data (G_OBJECT (bar), "gvc-mixer-dialog-stream");
if (old_stream != NULL) {
@@ -971,19 +784,21 @@ bar_set_stream (GvcMixerDialog *dialog,
g_object_get (bar, "name", &name, NULL);
g_debug ("Disconnecting old stream '%s' from bar '%s'",
- gvc_mixer_stream_get_name (old_stream), name);
+ mate_mixer_stream_get_name (old_stream), name);
g_free (name);
- g_signal_handlers_disconnect_by_func (old_stream, on_stream_is_muted_notify, dialog);
+ g_signal_handlers_disconnect_by_func (old_stream, on_stream_mute_notify, dialog);
g_signal_handlers_disconnect_by_func (old_stream, on_stream_volume_notify, dialog);
g_signal_handlers_disconnect_by_func (old_stream, on_stream_port_notify, dialog);
- g_hash_table_remove (dialog->priv->bars, GUINT_TO_POINTER (gvc_mixer_stream_get_id (old_stream)));
+
+ g_hash_table_remove (dialog->priv->bars, name);
}
gtk_widget_set_sensitive (bar, (stream != NULL));
adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar)));
+ // XXX already done in notify
g_signal_handlers_disconnect_by_func (adj, on_adjustment_value_changed, dialog);
g_object_set_data (G_OBJECT (bar), "gvc-mixer-dialog-stream", stream);
@@ -993,24 +808,23 @@ bar_set_stream (GvcMixerDialog *dialog,
if (stream != NULL) {
gboolean is_muted;
- is_muted = gvc_mixer_stream_get_is_muted (stream);
+ is_muted = mate_mixer_stream_get_mute (stream);
gvc_channel_bar_set_is_muted (GVC_CHANNEL_BAR (bar), is_muted);
save_bar_for_stream (dialog, stream, bar);
- gtk_adjustment_set_value (adj,
- gvc_mixer_stream_get_volume (stream));
+ gtk_adjustment_set_value (adj, mate_mixer_stream_get_volume (stream));
g_signal_connect (stream,
- "notify::is-muted",
- G_CALLBACK (on_stream_is_muted_notify),
+ "notify::mute",
+ G_CALLBACK (on_stream_mute_notify),
dialog);
g_signal_connect (stream,
"notify::volume",
G_CALLBACK (on_stream_volume_notify),
dialog);
g_signal_connect (stream,
- "notify::port",
+ "notify::active-port",
G_CALLBACK (on_stream_port_notify),
dialog);
g_signal_connect (adj,
@@ -1021,57 +835,120 @@ bar_set_stream (GvcMixerDialog *dialog,
}
static void
-add_stream (GvcMixerDialog *dialog,
- GvcMixerStream *stream)
+add_stream (GvcMixerDialog *dialog, MateMixerStream *stream)
{
- GtkWidget *bar;
- gboolean is_muted;
- gboolean is_default;
- GtkAdjustment *adj;
- const char *id;
+ GtkWidget *bar = NULL;
+ gboolean is_default = FALSE;
+ MateMixerClientStream *client = NULL;
+ MateMixerStreamFlags flags;
- g_assert (stream != NULL);
+ flags = mate_mixer_stream_get_flags (stream);
- if (gvc_mixer_stream_is_event_stream (stream) != FALSE)
+ if (flags & MATE_MIXER_STREAM_EVENT)
return;
+ if (flags & MATE_MIXER_STREAM_APPLICATION) {
+ const gchar *app_id;
- bar = NULL;
- is_default = FALSE;
- id = gvc_mixer_stream_get_application_id (stream);
+ client = MATE_MIXER_CLIENT_STREAM (stream);
+ app_id = mate_mixer_client_stream_get_app_id (client);
- if (stream == gvc_mixer_control_get_default_sink (dialog->priv->mixer_control)) {
- bar = dialog->priv->output_bar;
- is_muted = gvc_mixer_stream_get_is_muted (stream);
- is_default = TRUE;
- gtk_widget_set_sensitive (dialog->priv->applications_box,
- !is_muted);
- adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar)));
- g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog);
- update_output_settings (dialog);
- } else if (stream == gvc_mixer_control_get_default_source (dialog->priv->mixer_control)) {
- bar = dialog->priv->input_bar;
- adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar)));
- g_signal_handlers_disconnect_by_func(adj, on_adjustment_value_changed, dialog);
- update_input_settings (dialog);
- is_default = TRUE;
- } else if (stream == gvc_mixer_control_get_event_sink_input (dialog->priv->mixer_control)) {
- bar = dialog->priv->effects_bar;
- g_debug ("Adding effects stream");
- } else if (! GVC_IS_MIXER_SOURCE (stream)
- && !GVC_IS_MIXER_SINK (stream)
- && !gvc_mixer_stream_is_virtual (stream)
- && g_strcmp0 (id, "org.mate.VolumeControl") != 0
- && g_strcmp0 (id, "org.PulseAudio.pavucontrol") != 0) {
- const char *name;
+ /* These applications are not displayed on the Applications tab */
+ if (!g_strcmp0 (app_id, "org.mate.VolumeControl") ||
+ !g_strcmp0 (app_id, "org.gnome.VolumeControl") ||
+ !g_strcmp0 (app_id, "org.PulseAudio.pavucontrol"))
+ return;
+ }
+
+ if (client == NULL) {
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ MateMixerStream *input;
+ MateMixerStream *output;
+ GtkAdjustment *adj;
+
+ input = mate_mixer_control_get_default_input_stream (dialog->priv->control);
+ output = mate_mixer_control_get_default_output_stream (dialog->priv->control);
+
+ if (flags & MATE_MIXER_STREAM_INPUT) {
+ if (stream == input) {
+ bar = dialog->priv->input_bar;
+ adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar)));
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (adj),
+ on_adjustment_value_changed,
+ dialog);
+ update_input_settings (dialog);
+ is_default = TRUE;
+ }
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview));
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model),
+ &iter,
+ NAME_COLUMN, mate_mixer_stream_get_name (stream),
+ DESCRIPTION_COLUMN, mate_mixer_stream_get_description (stream),
+ DEVICE_COLUMN, "",
+ ACTIVE_COLUMN, is_default,
+ -1);
+ g_signal_connect (stream,
+ "notify::description",
+ G_CALLBACK (on_stream_description_notify),
+ dialog);
+ } else if (flags & MATE_MIXER_STREAM_OUTPUT) {
+ if (stream == output) {
+ bar = dialog->priv->output_bar;
+ adj = GTK_ADJUSTMENT (gvc_channel_bar_get_adjustment (GVC_CHANNEL_BAR (bar)));
+
+ gtk_widget_set_sensitive (dialog->priv->applications_box,
+ mate_mixer_stream_get_mute (stream) == FALSE);
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (adj),
+ on_adjustment_value_changed,
+ dialog);
+ update_output_settings (dialog);
+ is_default = TRUE;
+ }
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview));
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model),
+ &iter,
+ NAME_COLUMN, mate_mixer_stream_get_name (stream),
+ DESCRIPTION_COLUMN, mate_mixer_stream_get_description (stream),
+ DEVICE_COLUMN, "",
+ ACTIVE_COLUMN, is_default,
+ SPEAKERS_COLUMN, mvc_channel_map_to_pretty_string (stream),
+ -1);
+ g_signal_connect (stream,
+ "notify::description",
+ G_CALLBACK (on_stream_description_notify),
+ dialog);
+ }
+ } else {
+ const gchar *name;
+ const gchar *icon;
bar = create_bar (dialog, dialog->priv->apps_size_group, FALSE);
- name = gvc_mixer_stream_get_name (stream);
+ // FIXME:
+ // 1) We should ideally provide application name on the first line and
+ // description on a second line in italics
+ // 2) We should watch for name changes as it may include for example
+ // the name of the current song
+ name = mate_mixer_client_stream_get_app_name (client);
+ if (name == NULL)
+ name = mate_mixer_stream_get_description (stream);
+ if (name == NULL)
+ name = mate_mixer_stream_get_name (stream);
+
if (name == NULL || strchr (name, '_') == NULL) {
gvc_channel_bar_set_name (GVC_CHANNEL_BAR (bar), name);
} else {
char **tokens, *escaped;
+ // XXX why is this here?
tokens = g_strsplit (name, "_", -1);
escaped = g_strjoinv ("__", tokens);
g_strfreev (tokens);
@@ -1079,51 +956,18 @@ add_stream (GvcMixerDialog *dialog,
g_free (escaped);
}
- gvc_channel_bar_set_icon_name (GVC_CHANNEL_BAR (bar),
- gvc_mixer_stream_get_icon_name (stream));
+ icon = mate_mixer_client_stream_get_app_icon (client);
+ if (icon == NULL) {
+ /* If there is no name of the application icon, set a default */
+ icon = "applications-multimedia";
+ }
+
+ gvc_channel_bar_set_icon_name (GVC_CHANNEL_BAR (bar), icon);
gtk_box_pack_start (GTK_BOX (dialog->priv->applications_box), bar, FALSE, FALSE, 12);
- dialog->priv->num_apps++;
gtk_widget_hide (dialog->priv->no_apps_label);
- }
-
- if (GVC_IS_MIXER_SOURCE (stream)) {
- GtkTreeModel *model;
- GtkTreeIter iter;
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview));
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- gtk_list_store_set (GTK_LIST_STORE (model),
- &iter,
- NAME_COLUMN, gvc_mixer_stream_get_description (stream),
- DEVICE_COLUMN, "",
- ACTIVE_COLUMN, is_default,
- ID_COLUMN, gvc_mixer_stream_get_id (stream),
- -1);
- g_signal_connect (stream,
- "notify::description",
- G_CALLBACK (on_stream_description_notify),
- dialog);
- } else if (GVC_IS_MIXER_SINK (stream)) {
- GtkTreeModel *model;
- GtkTreeIter iter;
- const GvcChannelMap *map;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview));
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- map = gvc_mixer_stream_get_channel_map (stream);
- gtk_list_store_set (GTK_LIST_STORE (model),
- &iter,
- NAME_COLUMN, gvc_mixer_stream_get_description (stream),
- DEVICE_COLUMN, "",
- ACTIVE_COLUMN, is_default,
- ID_COLUMN, gvc_mixer_stream_get_id (stream),
- SPEAKERS_COLUMN, gvc_channel_map_get_mapping (map),
- -1);
- g_signal_connect (stream,
- "notify::description",
- G_CALLBACK (on_stream_description_notify),
- dialog);
+ dialog->priv->num_apps++;
}
if (bar != NULL) {
@@ -1133,56 +977,51 @@ add_stream (GvcMixerDialog *dialog,
}
static void
-on_control_stream_added (GvcMixerControl *control,
- guint id,
- GvcMixerDialog *dialog)
+on_control_stream_added (MateMixerControl *control,
+ const gchar *name,
+ GvcMixerDialog *dialog)
{
- GvcMixerStream *stream;
- GtkWidget *bar;
+ MateMixerStream *stream;
+ GtkWidget *bar;
- bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (id));
+ bar = g_hash_table_lookup (dialog->priv->bars, name);
if (bar != NULL) {
- g_debug ("GvcMixerDialog: Stream %u already added", id);
+ g_debug ("Ignoring already known stream %s", name);
return;
}
- stream = gvc_mixer_control_lookup_stream_id (control, id);
- if (stream != NULL) {
+ stream = mate_mixer_control_get_stream (control, name);
+ if (G_LIKELY (stream != NULL))
add_stream (dialog, stream);
- }
}
static gboolean
-find_item_by_id (GtkTreeModel *model,
- guint id,
- guint column,
- GtkTreeIter *iter)
+find_tree_item_by_name (GtkTreeModel *model,
+ const gchar *name,
+ guint column,
+ GtkTreeIter *iter)
{
- gboolean found_item;
-
- found_item = FALSE;
+ gboolean found = FALSE;
- if (!gtk_tree_model_get_iter_first (model, iter)) {
+ if (!gtk_tree_model_get_iter_first (model, iter))
return FALSE;
- }
do {
- guint t_id;
+ gchar *n;
- gtk_tree_model_get (model, iter,
- column, &t_id, -1);
+ gtk_tree_model_get (model, iter, column, &n, -1);
- if (id == t_id) {
- found_item = TRUE;
- }
- } while (!found_item && gtk_tree_model_iter_next (model, iter));
+ if (!g_strcmp0 (name, n))
+ found = TRUE;
+
+ g_free (n);
+ } while (!found && gtk_tree_model_iter_next (model, iter));
- return found_item;
+ return found;
}
static void
-remove_stream (GvcMixerDialog *dialog,
- guint id)
+remove_stream (GvcMixerDialog *dialog, const gchar *name)
{
GtkWidget *bar;
gboolean found;
@@ -1190,17 +1029,17 @@ remove_stream (GvcMixerDialog *dialog,
GtkTreeModel *model;
/* remove bars for applications and reset fixed bars */
- bar = g_hash_table_lookup (dialog->priv->bars, GUINT_TO_POINTER (id));
+ bar = g_hash_table_lookup (dialog->priv->bars, name);
if (bar == dialog->priv->output_bar
|| bar == dialog->priv->input_bar
- || bar == dialog->priv->effects_bar) {
- char *name;
- g_object_get (bar, "name", &name, NULL);
- g_debug ("Removing stream for bar '%s'", name);
- g_free (name);
+ || bar == dialog->priv->effects_bar) { // XXX effects bad? verify this!
+ char *bar_name;
+ g_object_get (bar, "name", &bar_name, NULL);
+ g_debug ("Removing stream for bar '%s'", bar_name);
+ g_free (bar_name);
bar_set_stream (dialog, bar, NULL);
} else if (bar != NULL) {
- g_hash_table_remove (dialog->priv->bars, GUINT_TO_POINTER (id));
+ g_hash_table_remove (dialog->priv->bars, name);
gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (bar)),
bar);
dialog->priv->num_apps--;
@@ -1211,12 +1050,12 @@ remove_stream (GvcMixerDialog *dialog,
/* remove from any models */
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview));
- found = find_item_by_id (GTK_TREE_MODEL (model), id, ID_COLUMN, &iter);
+ found = find_tree_item_by_name (GTK_TREE_MODEL (model), name, NAME_COLUMN, &iter);
if (found) {
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
}
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview));
- found = find_item_by_id (GTK_TREE_MODEL (model), id, ID_COLUMN, &iter);
+ found = find_tree_item_by_name (GTK_TREE_MODEL (model), name, NAME_COLUMN, &iter);
if (found) {
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
}
@@ -1224,76 +1063,138 @@ remove_stream (GvcMixerDialog *dialog,
static void
on_control_stream_removed (GvcMixerControl *control,
- guint id,
+ const gchar *name,
GvcMixerDialog *dialog)
{
- remove_stream (dialog, id);
+ remove_stream (dialog, name);
+}
+
+static gchar *
+card_profile_status (MateMixerDeviceProfile *profile)
+{
+ guint inputs;
+ guint outputs;
+ gchar *inputs_str = NULL;
+ gchar *outputs_str = NULL;
+
+ inputs = mate_mixer_device_profile_get_num_input_streams (profile);
+ outputs = mate_mixer_device_profile_get_num_output_streams (profile);
+
+ if (inputs == 0 && outputs == 0) {
+ /* translators:
+ * The device has been disabled */
+ return g_strdup (_("Disabled"));
+ }
+
+ if (outputs > 0) {
+ /* translators:
+ * The number of sound outputs on a particular device */
+ outputs_str = g_strdup_printf (ngettext ("%u Output",
+ "%u Outputs",
+ outputs),
+ outputs);
+ }
+
+ if (inputs > 0) {
+ /* translators:
+ * The number of sound inputs on a particular device */
+ inputs_str = g_strdup_printf (ngettext ("%u Input",
+ "%u Inputs",
+ inputs),
+ inputs);
+ }
+
+ if (inputs_str == NULL && outputs_str == NULL) {
+ gchar *ret = g_strdup_printf ("%s / %s",
+ outputs_str,
+ inputs_str);
+ g_free (outputs_str);
+ g_free (inputs_str);
+ return ret;
+ }
+
+ if (inputs_str != NULL)
+ return inputs_str;
+
+ return outputs_str;
}
static void
-add_card (GvcMixerDialog *dialog,
- GvcMixerCard *card)
+add_device (GvcMixerDialog *dialog, MateMixerDevice *device)
{
GtkTreeModel *model;
GtkTreeIter iter;
GtkTreeSelection *selection;
- GvcMixerCardProfile *profile;
+ MateMixerDeviceProfile *profile;
GIcon *icon;
- guint index;
+ const gchar *name;
+ const gchar *profile_name;
+ gchar *profile_status;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview));
- index = gvc_mixer_card_get_index (card);
- if (find_item_by_id (GTK_TREE_MODEL (model), index, HW_ID_COLUMN, &iter) == FALSE)
+ name = mate_mixer_device_get_name (device);
+
+ if (find_tree_item_by_name (GTK_TREE_MODEL (model), name, HW_NAME_COLUMN, &iter) == FALSE)
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- profile = gvc_mixer_card_get_profile (card);
+
+ profile = mate_mixer_device_get_active_profile (device);
g_assert (profile != NULL);
- icon = g_themed_icon_new_with_default_fallbacks (gvc_mixer_card_get_icon_name (card));
+ icon = g_themed_icon_new_with_default_fallbacks (mate_mixer_device_get_icon (device));
+
//FIXME we need the status (default for a profile?) here
+
+ profile_name = mate_mixer_device_profile_get_name (profile);
+ profile_status = card_profile_status (profile);
+
gtk_list_store_set (GTK_LIST_STORE (model),
&iter,
- HW_NAME_COLUMN, gvc_mixer_card_get_name (card),
- HW_ID_COLUMN, index,
+ HW_NAME_COLUMN, mate_mixer_device_get_name (device),
+ HW_DESCRIPTION_COLUMN, mate_mixer_device_get_description (device),
HW_ICON_COLUMN, icon,
- HW_PROFILE_COLUMN, profile->profile,
- HW_PROFILE_HUMAN_COLUMN, profile->human_profile,
- HW_STATUS_COLUMN, profile->status,
- HW_SENSITIVE_COLUMN, g_strcmp0 (profile->profile, "off") != 0,
+ HW_PROFILE_COLUMN, profile_name,
+ HW_PROFILE_HUMAN_COLUMN, mate_mixer_device_profile_get_description (profile),
+ HW_STATUS_COLUMN, profile_status,
+ HW_SENSITIVE_COLUMN, g_strcmp0 (profile_name, "off") != 0,
-1);
+ g_free (profile_status);
+
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->hw_treeview));
+
if (gtk_tree_selection_get_selected (selection, NULL, NULL) == FALSE) {
+ /* Select the currently added item if nothing is selected now */
gtk_tree_selection_select_iter (selection, &iter);
} else if (dialog->priv->hw_profile_combo != NULL) {
- GvcMixerCard *selected;
+ MateMixerDevice *selected;
/* Set the current profile if it changed for the selected card */
- selected = g_object_get_data (G_OBJECT (dialog->priv->hw_profile_combo), "card");
- if (gvc_mixer_card_get_index (selected) == gvc_mixer_card_get_index (card)) {
+ selected = g_object_get_data (G_OBJECT (dialog->priv->hw_profile_combo), "device");
+
+ if (!g_strcmp0 (mate_mixer_device_get_name (device),
+ mate_mixer_device_get_name (selected))) {
gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->hw_profile_combo),
- profile->profile);
+ profile_name);
+
g_object_set (G_OBJECT (dialog->priv->hw_profile_combo),
- "show-button", profile->n_sinks == 1,
+ "show-button",
+ mate_mixer_device_profile_get_num_output_streams (profile) >= 1,
NULL);
}
}
}
static void
-on_control_card_added (GvcMixerControl *control,
- guint id,
- GvcMixerDialog *dialog)
+on_control_device_added (MateMixerControl *control, const gchar *name, GvcMixerDialog *dialog)
{
- GvcMixerCard *card;
+ MateMixerDevice *device;
- card = gvc_mixer_control_lookup_card_id (control, id);
- if (card != NULL) {
- add_card (dialog, card);
- }
+ device = mate_mixer_control_get_device (control, name);
+ if (device != NULL)
+ add_device (dialog, device);
}
static void
-remove_card (GvcMixerDialog *dialog,
- guint id)
+remove_card (GvcMixerDialog *dialog, const gchar *name)
{
gboolean found;
GtkTreeIter iter;
@@ -1301,17 +1202,18 @@ remove_card (GvcMixerDialog *dialog,
/* remove from any models */
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview));
- found = find_item_by_id (GTK_TREE_MODEL (model), id, HW_ID_COLUMN, &iter);
+ found = find_tree_item_by_name (GTK_TREE_MODEL (model), name, HW_NAME_COLUMN, &iter);
if (found) {
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
}
}
+
static void
-on_control_card_removed (GvcMixerControl *control,
- guint id,
- GvcMixerDialog *dialog)
+on_control_device_removed (GvcMixerControl *control,
+ const gchar *name,
+ GvcMixerDialog *dialog)
{
- remove_card (dialog, id);
+ remove_card (dialog, name);
}
static void
@@ -1343,7 +1245,7 @@ on_input_radio_toggled (GtkCellRendererToggle *renderer,
GtkTreeIter iter;
GtkTreePath *path;
gboolean toggled;
- guint id;
+ gchar *name;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->input_treeview));
@@ -1352,23 +1254,21 @@ on_input_radio_toggled (GtkCellRendererToggle *renderer,
gtk_tree_path_free (path);
gtk_tree_model_get (model, &iter,
- ID_COLUMN, &id,
+ NAME_COLUMN, &name,
ACTIVE_COLUMN, &toggled,
-1);
- toggled ^= 1;
- if (toggled) {
- GvcMixerStream *stream;
+ if (toggled ^ 1) {
+ MateMixerStream *stream;
- g_debug ("Default input selected: %u", id);
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id);
- if (stream == NULL) {
- g_warning ("Unable to find stream for id: %u", id);
- return;
- }
+ g_debug ("Default input selected: %s", name);
+ stream = mate_mixer_control_get_stream (dialog->priv->control, name);
- gvc_mixer_control_set_default_source (dialog->priv->mixer_control, stream);
+ if (stream != NULL)
+ mate_mixer_control_set_default_input_stream (dialog->priv->control,
+ stream);
}
+ g_free (name);
}
static void
@@ -1380,7 +1280,7 @@ on_output_radio_toggled (GtkCellRendererToggle *renderer,
GtkTreeIter iter;
GtkTreePath *path;
gboolean toggled;
- guint id;
+ gchar *name;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->output_treeview));
@@ -1389,23 +1289,20 @@ on_output_radio_toggled (GtkCellRendererToggle *renderer,
gtk_tree_path_free (path);
gtk_tree_model_get (model, &iter,
- ID_COLUMN, &id,
+ NAME_COLUMN, &name,
ACTIVE_COLUMN, &toggled,
-1);
- toggled ^= 1;
- if (toggled) {
- GvcMixerStream *stream;
+ if (toggled ^ 1) {
+ MateMixerStream *stream;
- g_debug ("Default output selected: %u", id);
- stream = gvc_mixer_control_lookup_stream_id (dialog->priv->mixer_control, id);
- if (stream == NULL) {
- g_warning ("Unable to find stream for id: %u", id);
- return;
- }
-
- gvc_mixer_control_set_default_sink (dialog->priv->mixer_control, stream);
+ g_debug ("Default output selected: %s", name);
+ stream = mate_mixer_control_get_stream (dialog->priv->control, name);
+ if (stream != NULL)
+ mate_mixer_control_set_default_output_stream (dialog->priv->control,
+ stream);
}
+ g_free (name);
}
static void
@@ -1415,31 +1312,28 @@ name_to_text (GtkTreeViewColumn *column,
GtkTreeIter *iter,
gpointer user_data)
{
- char *name, *mapping;
+ char *description, *mapping;
- gtk_tree_model_get(model, iter,
- NAME_COLUMN, &name,
- SPEAKERS_COLUMN, &mapping,
- -1);
+ gtk_tree_model_get (model, iter,
+ DESCRIPTION_COLUMN, &description,
+ SPEAKERS_COLUMN, &mapping,
+ -1);
if (mapping == NULL) {
- g_object_set (cell, "text", name, NULL);
+ g_object_set (cell, "text", description, NULL);
} else {
- char *str;
+ gchar *str = g_strdup_printf ("%s\n<i>%s</i>", description, mapping);
- str = g_strdup_printf ("%s\n<i>%s</i>",
- name, mapping);
g_object_set (cell, "markup", str, NULL);
g_free (str);
}
- g_free (name);
+ g_free (description);
g_free (mapping);
}
static GtkWidget *
-create_stream_treeview (GvcMixerDialog *dialog,
- GCallback on_toggled)
+create_stream_treeview (GvcMixerDialog *dialog, GCallback on_toggled)
{
GtkWidget *treeview;
GtkListStore *store;
@@ -1452,27 +1346,30 @@ create_stream_treeview (GvcMixerDialog *dialog,
store = gtk_list_store_new (NUM_COLUMNS,
G_TYPE_STRING,
G_TYPE_STRING,
+ G_TYPE_STRING,
G_TYPE_BOOLEAN,
- G_TYPE_UINT,
G_TYPE_STRING);
+
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
GTK_TREE_MODEL (store));
renderer = gtk_cell_renderer_toggle_new ();
- gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (renderer),
- TRUE);
+ gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (renderer), TRUE);
+
column = gtk_tree_view_column_new_with_attributes (NULL,
renderer,
"active", ACTIVE_COLUMN,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+
g_signal_connect (renderer,
"toggled",
G_CALLBACK (on_toggled),
dialog);
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview), -1,
- _("Name"), gtk_cell_renderer_text_new (),
+ _("Name"),
+ gtk_cell_renderer_text_new (),
name_to_text, NULL, NULL);
#if 0
@@ -1487,54 +1384,41 @@ create_stream_treeview (GvcMixerDialog *dialog,
}
static void
-on_profile_changed (GvcComboBox *widget,
- const char *profile,
- gpointer user_data)
+on_profile_changed (GvcComboBox *widget, const gchar *profile, gpointer user_data)
{
- GvcMixerCard *card;
+ MateMixerDevice *device;
- card = g_object_get_data (G_OBJECT (widget), "card");
- if (card == NULL) {
+ device = g_object_get_data (G_OBJECT (widget), "device");
+ if (device == NULL) {
g_warning ("Could not find card for combobox");
return;
}
- g_debug ("Profile changed to %s for card %s", profile,
- gvc_mixer_card_get_name (card));
+ g_debug ("Profile changed to %s for device %s",
+ profile,
+ mate_mixer_device_get_name (device));
- gvc_mixer_card_change_profile (card, profile);
+ mate_mixer_device_set_active_profile (device, profile);
}
static void
-on_test_speakers_clicked (GvcComboBox *widget,
- gpointer user_data)
+on_test_speakers_clicked (GvcComboBox *widget, gpointer user_data)
{
GvcMixerDialog *dialog = GVC_MIXER_DIALOG (user_data);
- GvcMixerCard *card;
- GvcMixerCardProfile *profile;
MateMixerDevice *device;
GtkWidget *d, *speaker_test, *container;
char *title;
- device = mate_mixer_control_list_devices (dialog->priv->control)->data;
-
- card = g_object_get_data (G_OBJECT (widget), "card");
- if (card == NULL) {
+ device = g_object_get_data (G_OBJECT (widget), "device");
+ if (device == NULL) {
g_warning ("Could not find card for combobox");
return;
}
- profile = gvc_mixer_card_get_profile (card);
- g_debug ("XXX Start speaker testing for profile '%s', card %s XXX",
- profile->profile, gvc_mixer_card_get_name (card));
-
- title = g_strdup_printf (_("Speaker Testing for %s"), gvc_mixer_card_get_name (card));
+ title = g_strdup_printf (_("Speaker Testing for %s"), mate_mixer_device_get_name (device));
d = gtk_dialog_new_with_buttons (title,
GTK_WINDOW (dialog),
GTK_DIALOG_MODAL |
-#if !GTK_CHECK_VERSION (2, 21, 8)
- GTK_DIALOG_NO_SEPARATOR |
-#endif
GTK_DIALOG_DESTROY_WITH_PARENT,
NULL);
g_free (title);
@@ -1556,9 +1440,9 @@ on_card_selection_changed (GtkTreeSelection *selection,
GtkTreeModel *model;
GtkTreeIter iter;
const GList *profiles;
- guint id;
- GvcMixerCard *card;
- GvcMixerCardProfile *current_profile;
+ gchar *name;
+ MateMixerDevice *device;
+ MateMixerDeviceProfile *profile;
g_debug ("Card selection changed");
@@ -1568,42 +1452,78 @@ on_card_selection_changed (GtkTreeSelection *selection,
dialog->priv->hw_profile_combo = NULL;
}
- if (gtk_tree_selection_get_selected (selection,
- NULL,
- &iter) == FALSE) {
+ if (gtk_tree_selection_get_selected (selection, NULL, &iter) == FALSE)
return;
- }
model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->priv->hw_treeview));
gtk_tree_model_get (model, &iter,
- HW_ID_COLUMN, &id,
+ HW_NAME_COLUMN, &name,
-1);
- card = gvc_mixer_control_lookup_card_id (dialog->priv->mixer_control, id);
- if (card == NULL) {
- g_warning ("Unable to find card for id: %u", id);
+
+ device = mate_mixer_control_get_device (dialog->priv->control, name);
+ if (device == NULL) {
+ g_warning ("Unable to find card for id: %s", name);
+ g_free (name);
return;
}
+ g_free (name);
+
+ profile = mate_mixer_device_get_active_profile (device);
+ profiles = mate_mixer_device_list_profiles (device);
- current_profile = gvc_mixer_card_get_profile (card);
- profiles = gvc_mixer_card_get_profiles (card);
dialog->priv->hw_profile_combo = gvc_combo_box_new (_("_Profile:"));
- g_object_set (G_OBJECT (dialog->priv->hw_profile_combo), "button-label", _("Test Speakers"), NULL);
- gvc_combo_box_set_profiles (GVC_COMBO_BOX (dialog->priv->hw_profile_combo), profiles);
- gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->hw_profile_combo), current_profile->profile);
+
+ g_object_set (G_OBJECT (dialog->priv->hw_profile_combo),
+ "button-label",
+ _("Test Speakers"),
+ NULL);
+
+ gvc_combo_box_set_profiles (GVC_COMBO_BOX (dialog->priv->hw_profile_combo),
+ profiles);
+ gvc_combo_box_set_active (GVC_COMBO_BOX (dialog->priv->hw_profile_combo),
+ mate_mixer_device_profile_get_name (profile));
gtk_box_pack_start (GTK_BOX (dialog->priv->hw_settings_box),
dialog->priv->hw_profile_combo,
TRUE, TRUE, 6);
+
g_object_set (G_OBJECT (dialog->priv->hw_profile_combo),
- "show-button", current_profile->n_sinks == 1,
+ "show-button",
+ mate_mixer_device_profile_get_num_output_streams (profile) >= 1,
NULL);
+
gtk_widget_show (dialog->priv->hw_profile_combo);
- g_object_set_data (G_OBJECT (dialog->priv->hw_profile_combo), "card", card);
- g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo), "changed",
- G_CALLBACK (on_profile_changed), dialog);
- g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo), "button-clicked",
- G_CALLBACK (on_test_speakers_clicked), dialog);
+ g_object_set_data (G_OBJECT (dialog->priv->hw_profile_combo),
+ "device",
+ g_object_ref (device));
+
+ g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo),
+ "changed",
+ G_CALLBACK (on_profile_changed),
+ dialog);
+ g_signal_connect (G_OBJECT (dialog->priv->hw_profile_combo),
+ "button-clicked",
+ G_CALLBACK (on_test_speakers_clicked),
+ dialog);
+}
+
+static void
+on_notebook_switch_page (GtkNotebook *notebook,
+ GtkWidget *page,
+ guint page_num,
+ GvcMixerDialog *dialog)
+{
+ MateMixerStream *stream;
+
+ stream = mate_mixer_control_get_default_input_stream (dialog->priv->control);
+ if (stream == NULL)
+ return;
+
+ if (page_num == PAGE_INPUT)
+ mate_mixer_stream_monitor_start (stream);
+ else
+ mate_mixer_stream_monitor_stop (stream);
}
static void
@@ -1613,32 +1533,30 @@ card_to_text (GtkTreeViewColumn *column,
GtkTreeIter *iter,
gpointer user_data)
{
- char *name, *status, *profile, *str;
+ gchar *description, *status, *profile, *str;
gboolean sensitive;
- gtk_tree_model_get(model, iter,
- HW_NAME_COLUMN, &name,
- HW_STATUS_COLUMN, &status,
- HW_PROFILE_HUMAN_COLUMN, &profile,
- HW_SENSITIVE_COLUMN, &sensitive,
- -1);
+ gtk_tree_model_get (model, iter,
+ HW_DESCRIPTION_COLUMN, &description,
+ HW_STATUS_COLUMN, &status,
+ HW_PROFILE_HUMAN_COLUMN, &profile,
+ HW_SENSITIVE_COLUMN, &sensitive,
+ -1);
- str = g_strdup_printf ("%s\n<i>%s</i>\n<i>%s</i>",
- name, status, profile);
+ str = g_strdup_printf ("%s\n<i>%s</i>\n<i>%s</i>", description, status, profile);
g_object_set (cell,
"markup", str,
"sensitive", sensitive,
NULL);
g_free (str);
- g_free (name);
+ g_free (description);
g_free (status);
g_free (profile);
}
static GtkWidget *
-create_cards_treeview (GvcMixerDialog *dialog,
- GCallback on_changed)
+create_cards_treeview (GvcMixerDialog *dialog, GCallback on_changed)
{
GtkWidget *treeview;
GtkListStore *store;
@@ -1650,32 +1568,39 @@ create_cards_treeview (GvcMixerDialog *dialog,
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
- g_signal_connect (G_OBJECT (selection), "changed",
- on_changed, dialog);
+ g_signal_connect (G_OBJECT (selection),
+ "changed",
+ on_changed,
+ dialog);
store = gtk_list_store_new (HW_NUM_COLUMNS,
- G_TYPE_UINT,
G_TYPE_ICON,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
+ G_TYPE_STRING,
G_TYPE_BOOLEAN);
+
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
GTK_TREE_MODEL (store));
renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set (G_OBJECT (renderer), "stock-size", GTK_ICON_SIZE_DIALOG, NULL);
+
column = gtk_tree_view_column_new_with_attributes (NULL,
renderer,
"gicon", HW_ICON_COLUMN,
"sensitive", HW_SENSITIVE_COLUMN,
NULL);
+
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview), -1,
- _("Name"), gtk_cell_renderer_text_new (),
- card_to_text, NULL, NULL);
+ _("Name"),
+ gtk_cell_renderer_text_new (),
+ card_to_text,
+ NULL, NULL);
return treeview;
}
@@ -1701,9 +1626,8 @@ dialog_accel_cb (GtkAccelGroup *accelgroup,
}
}
- if (num != -1) {
+ if (num != -1)
gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook), num);
- }
}
static GObject *
@@ -1719,17 +1643,15 @@ gvc_mixer_dialog_constructor (GType type,
GtkWidget *box;
GtkWidget *sbox;
GtkWidget *ebox;
- GSList *streams;
- GSList *cards;
- GSList *l;
- GvcMixerStream *stream;
- GvcMixerCard *card;
+ GList *list;
GtkTreeSelection *selection;
GtkAccelGroup *accel_group;
GClosure *closure;
gint i;
- object = G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->constructor (type, n_construct_properties, construct_params);
+ object = G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_params);
self = GVC_MIXER_DIALOG (object);
gtk_dialog_add_button (GTK_DIALOG (self), "gtk-close", GTK_RESPONSE_OK);
@@ -1757,6 +1679,7 @@ gvc_mixer_dialog_constructor (GType type,
gtk_box_pack_start (GTK_BOX (main_vbox),
self->priv->notebook,
TRUE, TRUE, 0);
+
gtk_container_set_border_width (GTK_CONTAINER (self->priv->notebook), 5);
/* Set up accels (borrowed from Empathy) */
@@ -1987,40 +1910,109 @@ gvc_mixer_dialog_constructor (GType type,
self->priv->no_apps_label,
TRUE, TRUE, 0);
- g_signal_connect (self->priv->mixer_control,
+ gtk_widget_show_all (main_vbox);
+
+ list = (GList *) mate_mixer_control_list_streams (self->priv->control);
+ while (list) {
+ add_stream (self, MATE_MIXER_STREAM (list->data));
+ list = list->next;
+ }
+
+ list = (GList *) mate_mixer_control_list_devices (self->priv->control);
+ while (list) {
+ add_device (self, MATE_MIXER_DEVICE (list->data));
+ list = list->next;
+ }
+
+ g_signal_connect (G_OBJECT (self->priv->notebook),
+ "switch-page",
+ G_CALLBACK (on_notebook_switch_page),
+ self);
+
+ return object;
+}
+
+static MateMixerControl *
+gvc_mixer_dialog_get_control (GvcMixerDialog *dialog)
+{
+ return dialog->priv->control;
+}
+
+static void
+gvc_mixer_dialog_set_control (GvcMixerDialog *dialog, MateMixerControl *control)
+{
+ MateMixerState state;
+
+ state = mate_mixer_control_get_state (control);
+
+ if (G_UNLIKELY (state != MATE_MIXER_STATE_READY))
+ g_warn_if_reached ();
+
+ dialog->priv->control = g_object_ref (control);
+
+ g_signal_connect (dialog->priv->control,
"stream-added",
G_CALLBACK (on_control_stream_added),
- self);
- g_signal_connect (self->priv->mixer_control,
+ dialog);
+ g_signal_connect (dialog->priv->control,
"stream-removed",
G_CALLBACK (on_control_stream_removed),
- self);
- g_signal_connect (self->priv->mixer_control,
- "card-added",
- G_CALLBACK (on_control_card_added),
- self);
- g_signal_connect (self->priv->mixer_control,
- "card-removed",
- G_CALLBACK (on_control_card_removed),
- self);
+ dialog);
+ g_signal_connect (dialog->priv->control,
+ "device-added",
+ G_CALLBACK (on_control_device_added),
+ dialog);
+ g_signal_connect (dialog->priv->control,
+ "device-removed",
+ G_CALLBACK (on_control_device_removed),
+ dialog);
- gtk_widget_show_all (main_vbox);
+ g_signal_connect (dialog->priv->control,
+ "notify::default-output",
+ G_CALLBACK (on_control_default_output_notify),
+ dialog);
+ g_signal_connect (dialog->priv->control,
+ "notify::default-input",
+ G_CALLBACK (on_control_default_input_notify),
+ dialog);
- streams = gvc_mixer_control_get_streams (self->priv->mixer_control);
- for (l = streams; l != NULL; l = l->next) {
- stream = l->data;
- add_stream (self, stream);
- }
- g_slist_free (streams);
+ g_object_notify (G_OBJECT (dialog), "control");
+}
- cards = gvc_mixer_control_get_cards (self->priv->mixer_control);
- for (l = cards; l != NULL; l = l->next) {
- card = l->data;
- add_card (self, card);
+static void
+gvc_mixer_dialog_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GvcMixerDialog *self = GVC_MIXER_DIALOG (object);
+
+ switch (prop_id) {
+ case PROP_MIXER_CONTROL:
+ gvc_mixer_dialog_set_control (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
}
- g_slist_free (cards);
+}
- return object;
+static void
+gvc_mixer_dialog_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GvcMixerDialog *self = GVC_MIXER_DIALOG (object);
+
+ switch (prop_id) {
+ case PROP_MIXER_CONTROL:
+ g_value_set_object (value, gvc_mixer_dialog_get_control (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
@@ -2028,27 +2020,21 @@ gvc_mixer_dialog_dispose (GObject *object)
{
GvcMixerDialog *dialog = GVC_MIXER_DIALOG (object);
- if (dialog->priv->mixer_control != NULL) {
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
+ if (dialog->priv->control != NULL) {
+ g_signal_handlers_disconnect_by_func (dialog->priv->control,
on_control_stream_added,
dialog);
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
+ g_signal_handlers_disconnect_by_func (dialog->priv->control,
on_control_stream_removed,
dialog);
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
- on_control_card_added,
+ g_signal_handlers_disconnect_by_func (dialog->priv->control,
+ on_control_device_added,
dialog);
- g_signal_handlers_disconnect_by_func (dialog->priv->mixer_control,
- on_control_card_removed,
+ g_signal_handlers_disconnect_by_func (dialog->priv->control,
+ on_control_device_removed,
dialog);
- g_object_unref (dialog->priv->mixer_control);
- dialog->priv->mixer_control = NULL;
- }
-
- if (dialog->priv->bars != NULL) {
- g_hash_table_destroy (dialog->priv->bars);
- dialog->priv->bars = NULL;
+ g_clear_object (&dialog->priv->control);
}
G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->dispose (object);
@@ -2057,7 +2043,7 @@ gvc_mixer_dialog_dispose (GObject *object)
static void
gvc_mixer_dialog_class_init (GvcMixerDialogClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructor = gvc_mixer_dialog_constructor;
object_class->dispose = gvc_mixer_dialog_dispose;
@@ -2067,88 +2053,67 @@ gvc_mixer_dialog_class_init (GvcMixerDialogClass *klass)
g_object_class_install_property (object_class,
PROP_MIXER_CONTROL,
- g_param_spec_object ("mixer-control",
- "mixer control",
- "mixer control",
- GVC_TYPE_MIXER_CONTROL,
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
+ g_param_spec_object ("control",
+ "Control",
+ "MateMixer control",
+ MATE_MIXER_TYPE_CONTROL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
g_type_class_add_private (klass, sizeof (GvcMixerDialogPrivate));
}
-
static void
gvc_mixer_dialog_init (GvcMixerDialog *dialog)
{
dialog->priv = GVC_MIXER_DIALOG_GET_PRIVATE (dialog);
- dialog->priv->bars = g_hash_table_new (NULL, NULL);
+
+ dialog->priv->bars = g_hash_table_new (g_str_hash, g_str_equal);
dialog->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
dialog->priv->apps_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
- dialog->priv->control = mate_mixer_control_new ();
-
- mate_mixer_control_open (dialog->priv->control);
}
static void
gvc_mixer_dialog_finalize (GObject *object)
{
- GvcMixerDialog *mixer_dialog;
+ GvcMixerDialog *dialog;
- g_return_if_fail (object != NULL);
- g_return_if_fail (GVC_IS_MIXER_DIALOG (object));
+ dialog = GVC_MIXER_DIALOG (object);
- mixer_dialog = GVC_MIXER_DIALOG (object);
+ g_hash_table_destroy (dialog->priv->bars);
- g_return_if_fail (mixer_dialog->priv != NULL);
G_OBJECT_CLASS (gvc_mixer_dialog_parent_class)->finalize (object);
}
GvcMixerDialog *
-gvc_mixer_dialog_new (GvcMixerControl *control)
+gvc_mixer_dialog_new (MateMixerControl *control)
{
- GObject *dialog;
- dialog = g_object_new (GVC_TYPE_MIXER_DIALOG,
- "icon-name", "multimedia-volume-control",
- "title", _("Sound Preferences"),
-#if !GTK_CHECK_VERSION (3, 0, 0)
- "has-separator", FALSE,
-#endif
- "mixer-control", control,
- NULL);
- return GVC_MIXER_DIALOG (dialog);
+ return g_object_new (GVC_TYPE_MIXER_DIALOG,
+ "icon-name", "multimedia-volume-control",
+ "title", _("Sound Preferences"),
+ "control", control,
+ NULL);
}
-enum {
- PAGE_EVENTS,
- PAGE_HARDWARE,
- PAGE_INPUT,
- PAGE_OUTPUT,
- PAGE_APPLICATIONS
-};
-
gboolean
-gvc_mixer_dialog_set_page (GvcMixerDialog *self,
- const char *page)
+gvc_mixer_dialog_set_page (GvcMixerDialog *self, const gchar *page)
{
- guint num;
-
- g_return_val_if_fail (self != NULL, FALSE);
-
- if (page == NULL)
- num = 0;
- else if (g_str_equal (page, "effects"))
- num = PAGE_EVENTS;
- else if (g_str_equal (page, "hardware"))
- num = PAGE_HARDWARE;
- else if (g_str_equal (page, "input"))
- num = PAGE_INPUT;
- else if (g_str_equal (page, "output"))
- num = PAGE_OUTPUT;
- else if (g_str_equal (page, "applications"))
- num = PAGE_APPLICATIONS;
- else
- num = 0;
+ guint num = 0;
+
+ g_return_val_if_fail (GVC_IS_MIXER_DIALOG (self), FALSE);
+
+ if (page != NULL) {
+ if (g_str_equal (page, "effects"))
+ num = PAGE_EVENTS;
+ else if (g_str_equal (page, "hardware"))
+ num = PAGE_HARDWARE;
+ else if (g_str_equal (page, "input"))
+ num = PAGE_INPUT;
+ else if (g_str_equal (page, "output"))
+ num = PAGE_OUTPUT;
+ else if (g_str_equal (page, "applications"))
+ num = PAGE_APPLICATIONS;
+ }
gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook), num);