Index: libs/libmyth/audiooutputalsa.cpp
===================================================================
--- libs/libmyth/audiooutputalsa.cpp	(revision 8761)
+++ libs/libmyth/audiooutputalsa.cpp	(working copy)
@@ -450,6 +450,8 @@
 
 int AudioOutputALSA::GetVolumeChannel(int channel)
 {
+    snd_mixer_selem_id_t *sid;
+    snd_mixer_elem_t *elem;
     long actual_volume, volume;
 
     if (mixer_handle == NULL)
@@ -461,13 +463,22 @@
 
     if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
     {
-        Error(QString("mixer unable to find control %1").arg(mixer_control));
-        CloseMixer();
-        return 0;
+        VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1").arg(mixer_control));
+        return 100;
     }
 
-    GetVolumeRange();
+    if (!snd_mixer_selem_has_playback_channel(elem, (snd_mixer_selem_channel_id_t)channel))
+    {
+        snd_mixer_selem_id_set_index(sid, channel);
+        if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
+        {
+            VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1 %2").arg(mixer_control).arg(channel));
+            return 100;
+        }
+    }
 
+    GetVolumeRange(elem);
+
     snd_mixer_selem_get_playback_volume(elem, (snd_mixer_selem_channel_id_t)channel,
                                         &actual_volume);
     volume = (int)((actual_volume - playback_vol_min) *
@@ -482,6 +493,8 @@
 
 void AudioOutputALSA::SetCurrentVolume(QString control, int channel, int volume)
 {
+    snd_mixer_selem_id_t *sid;
+    snd_mixer_elem_t *elem;
     int err, set_vol;
 
     VERBOSE(VB_AUDIO, QString("Setting %1 volume to %2")
@@ -495,19 +508,29 @@
 
         if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
         {
-            Error(QString("mixer unable to find control %1").arg(control));
+            VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1").arg(control));
             return;
         }
 
-        GetVolumeRange();
+        if (!snd_mixer_selem_has_playback_channel(elem, (snd_mixer_selem_channel_id_t)channel))
+        {
+            snd_mixer_selem_id_set_index(sid, channel);
+            if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
+            {
+                VERBOSE(VB_IMPORTANT, QString("mixer unable to find control %1 %2").arg(control).arg(channel));
+                return;
+            }
+        }
 
+        GetVolumeRange(elem);
+
         set_vol = (int)(volume / volume_range_multiplier +
                         playback_vol_min + 0.5);
 
         if ((err = snd_mixer_selem_set_playback_volume(elem,
             (snd_mixer_selem_channel_id_t)channel, set_vol)) < 0)
         {
-            Error(QString("mixer set channel %1 err %2: %3")
+            VERBOSE(VB_IMPORTANT, QString("mixer set channel %1 err %2: %3")
                   .arg(channel).arg(err).arg(snd_strerror(err)));
             return;
         }
@@ -558,7 +581,6 @@
 
     VERBOSE(VB_AUDIO, QString("Opening mixer %1").arg(device));
 
-    // TODO: This is opening card 0. Fix for case of multiple soundcards
     if ((err = snd_mixer_open(&mixer_handle, 0)) < 0)
     {
         Error(QString("Mixer device open error %1: %2")
@@ -592,7 +614,7 @@
     }
 }
 
-inline void AudioOutputALSA::GetVolumeRange(void)
+inline void AudioOutputALSA::GetVolumeRange(snd_mixer_elem_t *elem)
 {
     snd_mixer_selem_get_playback_volume_range(elem, &playback_vol_min,
                                               &playback_vol_max);
Index: libs/libmyth/audiooutputalsa.h
===================================================================
--- libs/libmyth/audiooutputalsa.h	(revision 8761)
+++ libs/libmyth/audiooutputalsa.h	(working copy)
@@ -53,11 +53,9 @@
     void OpenMixer(bool setstartingvolume);
     void CloseMixer(void);
     void SetupMixer(void);
-    inline void GetVolumeRange(void);
+    inline void GetVolumeRange(snd_mixer_elem_t *elem);
 
     snd_mixer_t          *mixer_handle;
-    snd_mixer_elem_t     *elem;
-    snd_mixer_selem_id_t *sid;
 
     QString mixer_control;  // e.g. "PCM"
 
