Index: gvc-balance-bar.c
===================================================================
--- gvc-balance-bar.c	(revision 4173)
+++ gvc-balance-bar.c	(working copy)
@@ -37,6 +37,7 @@
 struct GvcBalanceBarPrivate
 {
         GvcChannelMap *channel_map;
+        GvcBalanceType btype;
         GtkWidget     *scale_box;
         GtkWidget     *start_box;
         GtkWidget     *end_box;
@@ -50,13 +51,17 @@
 enum
 {
         PROP_0,
-        PROP_CHANNEL_MAP
+        PROP_CHANNEL_MAP,
+        PROP_BALANCE_TYPE,
 };
 
 static void     gvc_balance_bar_class_init (GvcBalanceBarClass *klass);
 static void     gvc_balance_bar_init       (GvcBalanceBar      *balance_bar);
 static void     gvc_balance_bar_finalize   (GObject            *object);
 
+static void     on_adjustment_value_changed(GtkAdjustment      *adjustment,
+                                            GvcBalanceBar      *bar);
+
 G_DEFINE_TYPE (GvcBalanceBar, gvc_balance_bar, GTK_TYPE_HBOX)
 
 static GtkWidget *
@@ -86,16 +91,28 @@
 
         gtk_box_pack_start (GTK_BOX (sbox), priv->scale, TRUE, TRUE, 0);
 
-        str = g_strdup_printf ("<small>%s</small>", C_("balance", "Left"));
-        gtk_scale_add_mark (GTK_SCALE (priv->scale), adjustment->lower , 
-                            GTK_POS_BOTTOM, str);
-        g_free (str);
+        if (bar->priv->btype == BALANCE_TYPE_RL) {
+                str = g_strdup_printf ("<small>%s</small>", C_("balance", "Left"));
+                gtk_scale_add_mark (GTK_SCALE (priv->scale), adjustment->lower , 
+                                    GTK_POS_BOTTOM, str);
+                g_free (str);
 
-        str = g_strdup_printf ("<small>%s</small>", C_("balance", "Right"));
-        gtk_scale_add_mark (GTK_SCALE (priv->scale),  adjustment->upper, 
-                            GTK_POS_BOTTOM, str);
-        g_free (str);
+                str = g_strdup_printf ("<small>%s</small>", C_("balance", "Right"));
+                gtk_scale_add_mark (GTK_SCALE (priv->scale),  adjustment->upper, 
+                                    GTK_POS_BOTTOM, str);
+                g_free (str);
+        } else {
+                str = g_strdup_printf ("<small>%s</small>", C_("balance", "Front"));
+                gtk_scale_add_mark (GTK_SCALE (priv->scale), adjustment->lower , 
+                                    GTK_POS_BOTTOM, str);
+                g_free (str);
 
+                str = g_strdup_printf ("<small>%s</small>", C_("balance", "Rear"));
+                gtk_scale_add_mark (GTK_SCALE (priv->scale),  adjustment->upper, 
+                                    GTK_POS_BOTTOM, str);
+                g_free (str);
+        }
+
         gtk_scale_add_mark (GTK_SCALE (priv->scale), (adjustment->upper - adjustment->lower)/2 + adjustment->lower, 
                             GTK_POS_BOTTOM, NULL);
 
@@ -154,6 +171,53 @@
 }
 
 static void
+gvc_balance_bar_set_balance_type (GvcBalanceBar *bar,
+                                  GvcBalanceType btype)
+{
+        GtkWidget *frame;
+
+        g_return_if_fail (GVC_BALANCE_BAR (bar));
+
+        bar->priv->btype = btype;
+        bar->priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0,
+                                                                    -1.0,
+                                                                    1.0,
+                                                                    0.05,
+                                                                    0.1,
+                                                                    0.1));
+        g_object_ref_sink (bar->priv->adjustment);
+        g_signal_connect (bar->priv->adjustment,
+                          "value-changed",
+                          G_CALLBACK (on_adjustment_value_changed),
+                          bar);
+
+        if (bar->priv->btype == BALANCE_TYPE_RL) {
+                bar->priv->label = gtk_label_new_with_mnemonic (_("_Balance:"));
+        } else {
+                bar->priv->label = gtk_label_new_with_mnemonic (_("_Fade:"));
+        }
+        gtk_misc_set_alignment (GTK_MISC (bar->priv->label),
+                                0.0,
+                                0.5);
+        /* frame */
+        frame = gtk_frame_new (NULL);
+        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+        gtk_container_add (GTK_CONTAINER (bar), frame);
+
+        /* box with scale */
+        bar->priv->scale_box = _scale_box_new (bar);
+        gtk_container_add (GTK_CONTAINER (frame), bar->priv->scale_box);
+        gtk_widget_show_all (frame);
+
+        gtk_widget_set_direction (bar->priv->scale, GTK_TEXT_DIR_LTR);
+        gtk_label_set_mnemonic_widget (GTK_LABEL (bar->priv->label),
+                                       bar->priv->scale);
+
+
+        g_object_notify (G_OBJECT (bar), "balance-type");
+}
+
+static void
 gvc_balance_bar_set_property (GObject       *object,
                               guint          prop_id,
                               const GValue  *value,
@@ -165,6 +229,9 @@
         case PROP_CHANNEL_MAP:
                 gvc_balance_bar_set_channel_map (self, g_value_get_object (value));
                 break;
+        case PROP_BALANCE_TYPE:
+                gvc_balance_bar_set_balance_type (self, g_value_get_int (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                 break;
@@ -221,7 +288,13 @@
                                                               "The channel map",
                                                               GVC_TYPE_CHANNEL_MAP,
                                                               G_PARAM_READWRITE));
-
+        g_object_class_install_property (object_class,
+                                         PROP_BALANCE_TYPE,
+                                         g_param_spec_int ("balance-type",
+                                                           "balance type",
+                                                           "Whether the balance is right-left or front-rear",
+                                                           BALANCE_TYPE_RL, BALANCE_TYPE_FR, BALANCE_TYPE_RL,
+                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
         g_type_class_add_private (klass, sizeof (GvcBalanceBarPrivate));
 }
 
@@ -272,7 +345,6 @@
         left_v = 1.0;
         right_v = 1.0;
 
-        /* FIXME: handle RTOL locales */
         if (val > 0) {
                 left_v = 1.0 - val;
         } else if (val < 0) {
@@ -300,39 +372,7 @@
 static void
 gvc_balance_bar_init (GvcBalanceBar *bar)
 {
-        GtkWidget *frame;
-
         bar->priv = GVC_BALANCE_BAR_GET_PRIVATE (bar);
-
-        bar->priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0,
-                                                                    -1.0,
-                                                                    1.0,
-                                                                    0.05,
-                                                                    0.1,
-                                                                    0.1));
-        g_object_ref_sink (bar->priv->adjustment);
-        g_signal_connect (bar->priv->adjustment,
-                          "value-changed",
-                          G_CALLBACK (on_adjustment_value_changed),
-                          bar);
-
-        bar->priv->label = gtk_label_new_with_mnemonic (_("_Balance:"));
-        gtk_misc_set_alignment (GTK_MISC (bar->priv->label),
-                                0.0,
-                                0.5);
-        /* frame */
-        frame = gtk_frame_new (NULL);
-        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
-        gtk_container_add (GTK_CONTAINER (bar), frame);
-
-        /* box with scale */
-        bar->priv->scale_box = _scale_box_new (bar);
-        gtk_container_add (GTK_CONTAINER (frame), bar->priv->scale_box);
-        gtk_widget_show_all (frame);
-
-        gtk_widget_set_direction (bar->priv->scale, GTK_TEXT_DIR_LTR);
-        gtk_label_set_mnemonic_widget (GTK_LABEL (bar->priv->label),
-                                       bar->priv->scale);
 }
 
 static void
@@ -355,11 +395,12 @@
 }
 
 GtkWidget *
-gvc_balance_bar_new (GvcChannelMap *channel_map)
+gvc_balance_bar_new (GvcChannelMap *channel_map, GvcBalanceType btype)
 {
         GObject *bar;
         bar = g_object_new (GVC_TYPE_BALANCE_BAR,
                             "channel-map", channel_map,
+                            "balance-type", btype,
                             NULL);
         return GTK_WIDGET (bar);
 }
Index: gvc-balance-bar.h
===================================================================
--- gvc-balance-bar.h	(revision 4173)
+++ gvc-balance-bar.h	(working copy)
@@ -34,6 +34,11 @@
 #define GVC_IS_BALANCE_BAR_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_BALANCE_BAR))
 #define GVC_BALANCE_BAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_BALANCE_BAR, GvcBalanceBarClass))
 
+typedef enum {
+	BALANCE_TYPE_RL,
+	BALANCE_TYPE_FR,
+} GvcBalanceType;
+
 typedef struct GvcBalanceBarPrivate GvcBalanceBarPrivate;
 
 typedef struct
@@ -49,7 +54,8 @@
 
 GType               gvc_balance_bar_get_type            (void);
 
-GtkWidget *         gvc_balance_bar_new                 (GvcChannelMap *map);
+GtkWidget *         gvc_balance_bar_new                 (GvcChannelMap *map,
+                                                         GvcBalanceType btype);
 
 void                gvc_balance_bar_set_size_group      (GvcBalanceBar *bar,
                                                          GtkSizeGroup  *group,
Index: gvc-channel-map.c
===================================================================
--- gvc-channel-map.c	(revision 4173)
+++ gvc-channel-map.c	(working copy)
@@ -38,6 +38,8 @@
         guint                 num_channels;
         pa_channel_position_t positions[PA_CHANNELS_MAX];
         gdouble               gains[PA_CHANNELS_MAX];
+        gboolean              can_balance;
+        gboolean              can_fade;
 };
 
 enum {
@@ -74,6 +76,20 @@
         return map->priv->positions;
 }
 
+gboolean
+gvc_channel_map_can_balance (GvcChannelMap  *map)
+{
+        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE);
+        return TRUE;
+}
+
+gboolean
+gvc_channel_map_can_fade (GvcChannelMap  *map)
+{
+        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE);
+        return TRUE;
+}
+
 static void
 gvc_channel_map_class_init (GvcChannelMapClass *klass)
 {
@@ -136,6 +152,8 @@
         guint i;
 
         map->priv->num_channels = pa_map->channels;
+        //FIXME set ->can_balance;
+        //FIXME set ->can_fade
         for (i = 0; i < pa_map->channels; i++) {
                 map->priv->positions[i] = pa_map->map[i];
                 map->priv->gains[i] = 1.0;
Index: gvc-channel-map.h
===================================================================
--- gvc-channel-map.h	(revision 4173)
+++ gvc-channel-map.h	(working copy)
@@ -54,6 +54,8 @@
 guint                   gvc_channel_map_get_num_channels        (GvcChannelMap  *map);
 pa_channel_position_t * gvc_channel_map_get_positions           (GvcChannelMap  *map);
 gdouble *               gvc_channel_map_get_gains               (GvcChannelMap  *map);
+gboolean                gvc_channel_map_can_balance             (GvcChannelMap  *map);
+gboolean                gvc_channel_map_can_fade                (GvcChannelMap  *map);
 
 void                    gvc_channel_map_gains_changed           (GvcChannelMap  *map);
 
