Index: libs/libmyth/audiooutputbase.h
===================================================================
--- libs/libmyth/audiooutputbase.h	(revision 8871)
+++ libs/libmyth/audiooutputbase.h	(working copy)
@@ -52,8 +52,6 @@
     // Send output events showing current progress
     virtual void Status(void);
 
-    QString GetError() { return lastError; };
-
     virtual void SetSourceBitrate(int rate);
 
     //  Only really used by the AudioOutputNULL object
@@ -116,8 +114,6 @@
     bool buffer_output_data_for_use; //  used by AudioOutputNULL
     
  private:
-    QString lastError;
-
     // resampler
     bool need_resampler;
     SRC_STATE *src_ctx;
Index: libs/libmyth/audiooutputalsa.cpp
===================================================================
--- libs/libmyth/audiooutputalsa.cpp	(revision 8871)
+++ libs/libmyth/audiooutputalsa.cpp	(working copy)
@@ -455,19 +455,33 @@
     if (mixer_handle == NULL)
         return 100;
 
+    snd_mixer_selem_id_t *sid;
     snd_mixer_selem_id_alloca(&sid);
     snd_mixer_selem_id_set_index(sid, 0);
     snd_mixer_selem_id_set_name(sid, mixer_control.ascii());
 
-    if ((elem = snd_mixer_find_selem(mixer_handle, sid)) == NULL)
+    snd_mixer_elem_t *elem = snd_mixer_find_selem(mixer_handle, sid);
+    if (!elem)
     {
-        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();
+    snd_mixer_selem_channel_id_t chan = (snd_mixer_selem_channel_id_t) channel;
+    if (!snd_mixer_selem_has_playback_channel(elem, chan))
+    {
+        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,41 +496,54 @@
 
 void AudioOutputALSA::SetCurrentVolume(QString control, int channel, int volume)
 {
-    int err, set_vol;
-
     VERBOSE(VB_AUDIO, QString("Setting %1 volume to %2")
             .arg(control).arg(volume));
 
-    if (mixer_handle != NULL)
+    if (!mixer_handle)
+        return; // no mixer, nothing to do
+
+    snd_mixer_selem_id_t *sid;
+    snd_mixer_selem_id_alloca(&sid);
+    snd_mixer_selem_id_set_index(sid, 0);
+    snd_mixer_selem_id_set_name(sid, control.ascii());
+
+    snd_mixer_elem_t *elem = snd_mixer_find_selem(mixer_handle, sid);
+    if (!elem)
     {
-        snd_mixer_selem_id_alloca(&sid);
-        snd_mixer_selem_id_set_index(sid, 0);
-        snd_mixer_selem_id_set_name(sid, control.ascii());
+        VERBOSE(VB_IMPORTANT, QString("Mixer unable to find control %1")
+                .arg(control));
+        return;
+    }
 
+    snd_mixer_selem_channel_id_t chan = (snd_mixer_selem_channel_id_t) channel;
+    if (!snd_mixer_selem_has_playback_channel(elem, chan))
+    {
+        snd_mixer_selem_id_set_index(sid, channel);
         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 %2")
+                    .arg(control).arg(channel));
             return;
         }
+    }
 
-        GetVolumeRange();
+    GetVolumeRange(elem);
 
-        set_vol = (int)(volume / volume_range_multiplier +
+    int 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")
-                  .arg(channel).arg(err).arg(snd_strerror(err)));
-            return;
-        }
-        else
-        {
-            VERBOSE(VB_AUDIO, QString("channel %1 vol set to %2")
-                              .arg(channel).arg(set_vol));
-        }
+    int err = snd_mixer_selem_set_playback_volume(elem, chan, set_vol);
+    if (err < 0)
+    {
+        VERBOSE(VB_IMPORTANT, QString("mixer set channel %1 err %2: %3")
+                .arg(channel).arg(err).arg(snd_strerror(err)));
     }
+    else
+    {
+        VERBOSE(VB_AUDIO, QString("channel %1 vol set to %2")
+                .arg(channel).arg(set_vol));
+    }
 }
 
 void AudioOutputALSA::OpenMixer(bool setstartingvolume)
@@ -561,38 +588,39 @@
     // 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")
-              .arg(err).arg(snd_strerror(err)));
+        Warn(QString("Mixer device open error %1: %2")
+             .arg(err).arg(snd_strerror(err)));
         mixer_handle = NULL;
         return;
     }
 
     if ((err = snd_mixer_attach(mixer_handle, device.ascii())) < 0)
     {
-        Error(QString("Mixer attach error %1: %2\nCheck Mixer Name in Setup: %3")
-              .arg(err).arg(snd_strerror(err)).arg(device.ascii()));
+        Warn(QString("Mixer attach error %1: %2"
+                     "\n\t\t\tCheck Mixer Name in Setup: '%3'")
+             .arg(err).arg(snd_strerror(err)).arg(device));
         CloseMixer();
         return;
     }
 
     if ((err = snd_mixer_selem_register(mixer_handle, NULL, NULL)) < 0)
     {
-        Error(QString("Mixer register error %1: %2")
-              .arg(err).arg(snd_strerror(err)));
+        Warn(QString("Mixer register error %1: %2")
+             .arg(err).arg(snd_strerror(err)));
         CloseMixer();
         return;
     }
 
     if ((err = snd_mixer_load(mixer_handle)) < 0)
     {
-        Error(QString("Mixer load error %1: %2")
-              .arg(err).arg(snd_strerror(err)));
+        Warn(QString("Mixer load error %1: %2")
+             .arg(err).arg(snd_strerror(err)));
         CloseMixer();
         return;
     }
 }
 
-inline void AudioOutputALSA::GetVolumeRange(void)
+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/audiooutputbase.cpp
===================================================================
--- libs/libmyth/audiooutputbase.cpp	(revision 8871)
+++ libs/libmyth/audiooutputbase.cpp	(working copy)
@@ -15,7 +15,8 @@
 
 AudioOutputBase::AudioOutputBase(QString audiodevice, int, 
                                  int, int,
-                                 AudioOutputSource source, bool set_initial_vol)
+                                 AudioOutputSource source,
+                                 bool set_initial_vol)
 {
     pthread_mutex_init(&audio_buflock, NULL);
     pthread_mutex_init(&avsync_lock, NULL);
Index: libs/libmyth/audiooutput.h
===================================================================
--- libs/libmyth/audiooutput.h	(revision 8871)
+++ libs/libmyth/audiooutput.h	(working copy)
@@ -22,7 +22,10 @@
                                  int audio_channels, int audio_samplerate,
                                  AudioOutputSource source, bool set_initial_vol);
 
-    AudioOutput() : VolumeBase(), OutputListeners() { lastError = QString::null; };
+    AudioOutput() :
+        VolumeBase(),             OutputListeners(),
+        lastError(QString::null), lastWarn(QString::null) {}
+
     virtual ~AudioOutput() { };
 
     // reconfigure sound out for new params
@@ -55,19 +58,23 @@
 
     virtual void SetSourceBitrate(int ) { }
 
-    QString GetError() { return lastError; };
+    QString GetError(void)   const { return lastError; }
+    QString GetWarning(void) const { return lastWarn; }
 
     //  Only really used by the AudioOutputNULL object
     
     virtual void bufferOutputData(bool y) = 0;
     virtual int readOutputData(unsigned char *read_buffer, int max_length) = 0;
 
- protected:
+  protected:
     void Error(QString msg) 
-     { lastError = msg; VERBOSE(VB_IMPORTANT, lastError); };
+        { lastError = msg; VERBOSE(VB_IMPORTANT, "Error: " + lastError); }
+    void Warn(QString msg) 
+        { lastWarn  = msg; VERBOSE(VB_IMPORTANT, "Warning: " + lastWarn); }
 
- private:
+  protected:
     QString lastError;
+    QString lastWarn;
 };
 
 #endif
Index: libs/libmyth/audiooutputalsa.h
===================================================================
--- libs/libmyth/audiooutputalsa.h	(revision 8871)
+++ libs/libmyth/audiooutputalsa.h	(working copy)
@@ -53,11 +53,9 @@
     void OpenMixer(bool setstartingvolume);
     void CloseMixer(void);
     void SetupMixer(void);
-    inline void GetVolumeRange(void);
+    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"
 
