diff -Nur control-center-2.11.2/capplets/sound/Makefile.in control-center-2.11.2.new/capplets/sound/Makefile.in
--- control-center-2.11.2/capplets/sound/Makefile.in	2005-05-22 22:31:14.000000000 +0200
+++ control-center-2.11.2.new/capplets/sound/Makefile.in	2005-05-27 14:48:22.588789792 +0200
@@ -308,7 +308,7 @@
 gnome_sound_properties_OBJECTS = $(am_gnome_sound_properties_OBJECTS)
 gnome_sound_properties_DEPENDENCIES = \
 	$(top_builddir)/libsounds/libsounds.a
-gnome_sound_properties_LDFLAGS =
+gnome_sound_properties_LDFLAGS = -lasound
 
 DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
diff -Nur control-center-2.11.2/capplets/sound/sound-properties-capplet.c control-center-2.11.2.new/capplets/sound/sound-properties-capplet.c
--- control-center-2.11.2/capplets/sound/sound-properties-capplet.c	2005-05-22 21:29:14.000000000 +0200
+++ control-center-2.11.2.new/capplets/sound/sound-properties-capplet.c	2005-05-27 14:48:35.630807104 +0200
@@ -45,6 +45,9 @@
 #include <stdlib.h>
 #include <sys/types.h>
 
+#include <sys/wait.h>
+#include <alsa/asoundlib.h>
+
 #include "activate-settings-daemon.h"
 
 #define ENABLE_ESD_KEY             "/desktop/gnome/sound/enable_esd"
@@ -121,6 +124,95 @@
 	return new_value;
 }
 
+/* get_soundcards
+ *
+ * Put a list of all available sound cards into the given combo box
+ */
+static void
+get_soundcards (GtkComboBox* combo)
+{
+    int card = -1;
+    char* name = NULL;
+
+    for(;;) {
+        if (snd_card_next(&card) < 0 || card < 0)
+            break;
+        if (snd_card_get_name (card, &name) >= 0) {
+            gtk_combo_box_append_text (combo, name);
+            g_free (name);
+        }
+    }
+}
+
+/* get_default_soundcard
+ *
+ * Return the default sound card number, or -1 if sound card cannot be opened.
+ */
+static gint
+get_default_soundcard()
+{
+    snd_pcm_t *handle;
+    snd_pcm_info_t *info = NULL;
+    int card = -1;
+
+    if (snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK) < 0)
+        return -1;
+    if (snd_pcm_info_malloc (&info) < 0) {
+        snd_pcm_close (handle);
+        return -1;
+    }
+    if (snd_pcm_info (handle, info) >= 0) {
+        card = snd_pcm_info_get_card (info);
+        if (card == -1)
+            card = 0; /* default card cannot be detected for some reason */
+    }
+
+    snd_pcm_info_free (info);
+    snd_pcm_close (handle);
+    return card;
+}
+
+/* can_change_card
+ *
+ * Check whether set-default-soundcard is available and ~/asoundrc can be
+ * changed.
+ */
+static gboolean
+can_change_card() {
+    char* argv[] = { "/usr/bin/set-default-soundcard", "--check-markers", NULL };
+    gint exitcode;
+
+    if (!g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &exitcode,
+                NULL))
+        return FALSE;
+
+    return WIFEXITED (exitcode) && WEXITSTATUS (exitcode) == 0;
+}
+
+/* default_card_changed
+ *
+ * Callback for the "changed" signal of the default card combo box.
+ */
+static gboolean
+default_card_changed (GtkComboBox *c, gpointer data)
+{
+    char cardstr[10];
+    char* argv[] = { "/usr/bin/set-default-soundcard", cardstr, NULL };
+    gint exitcode;
+
+    gint card = gtk_combo_box_get_active (c);
+    if (card < 0)
+        return FALSE;
+
+    snprintf (cardstr, sizeof (cardstr), "%i", card);
+    if (!g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &exitcode,
+                NULL))
+        return FALSE;
+
+    return WIFEXITED (exitcode) && WEXITSTATUS (exitcode) == 0;
+}
+
+
 /* create_dialog
  *
  * Create the dialog box and return it as a GtkWidget
@@ -150,6 +242,21 @@
 	gtk_image_set_from_file (GTK_IMAGE (WID ("bell_image")),
 				 GNOMECC_DATA_DIR "/pixmaps/visual-bell.png");
 
+        /* setup available sound cards */
+        GtkComboBox* default_card_combo = GTK_COMBO_BOX (glade_xml_get_widget (dialog, "default_card_combo"));
+        gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (default_card_combo)));
+        gtk_widget_set_sensitive (GTK_WIDGET (default_card_combo), FALSE);
+        if (can_change_card()) {
+            int default_card = get_default_soundcard();
+            if (default_card >= 0) {
+                get_soundcards (default_card_combo);
+                gtk_combo_box_set_active (default_card_combo, default_card);
+                g_signal_connect (default_card_combo, "changed", 
+                    (GCallback) default_card_changed, NULL);
+                gtk_widget_set_sensitive (GTK_WIDGET (default_card_combo), TRUE);
+            }
+        }
+
 	gtk_widget_set_size_request (widget, -1, 250); /* Can this be right?  Seems broken for large fonts. */
 
 	if (!CheckXKB()) {
diff -Nur control-center-2.11.2/capplets/sound/sound-properties.glade control-center-2.11.2.new/capplets/sound/sound-properties.glade
--- control-center-2.11.2/capplets/sound/sound-properties.glade	2003-07-12 10:10:06.000000000 +0200
+++ control-center-2.11.2.new/capplets/sound/sound-properties.glade	2005-05-27 14:48:22.595788728 +0200
@@ -94,6 +94,71 @@
 	      <property name="fill">False</property>
 	    </packing>
 	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox6">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox5">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="default_card_label">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Default sound card:</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">10</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkComboBox" id="default_card_combo">
+		  <property name="visible">True</property>
+		  <property name="items" translatable="yes">Test</property>
+		  <property name="add_tearoffs">False</property>
+		  <property name="focus_on_click">True</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
 	</widget>
 	<packing>
 	  <property name="tab_expand">False</property>
