Index: mythmusic/mythmusic/playbackbox.cpp
===================================================================
--- mythmusic/mythmusic/playbackbox.cpp	(revision 23492)
+++ mythmusic/mythmusic/playbackbox.cpp	(working copy)
@@ -98,12 +98,16 @@
 
     // Possibly (user-defined) control the volume
 
-    volume_control = false;
-    volume_display_timer = new QTimer(this);
-    if (gContext->GetNumSetting("MythControlsVolume", 0))
+    volume_control = VolumeControlManager::GetControl(gContext->GetSetting("MixerDevice"));
+    if (volume_control)
     {
-        volume_control = true;
+        connect(volume_control.data(), SIGNAL(changedVolume(int)),
+                this, SLOT(VolumeChanged(int)));
+        connect(volume_control.data(), SIGNAL(changedMute(bool)),
+                this, SLOT(MuteChanged(bool)));
     }
+
+    volume_display_timer = new QTimer(this);
     volume_display_timer->setSingleShot(true);
     volume_display_timer->start(2000);
     connect(volume_display_timer, SIGNAL(timeout()),
@@ -1171,15 +1175,14 @@
     waiting_for_playlists_timer->start(100); // Restart Timer
 }
 
-void PlaybackBoxMusic::changeVolume(bool up_or_down)
+void PlaybackBoxMusic::changeVolume(bool up)
 {
-    if (volume_control && gPlayer->getOutput())
+    if (volume_control)
     {
-        if (up_or_down)
-            gPlayer->getOutput()->AdjustCurrentVolume(2);
+        if (up)
+            volume_control->increaseVolume();
         else
-            gPlayer->getOutput()->AdjustCurrentVolume(-2);
-        showVolume(true);
+            volume_control->decreaseVolume();
     }
 }
 
@@ -1197,11 +1200,8 @@
 
 void PlaybackBoxMusic::toggleMute()
 {
-    if (volume_control && gPlayer->getOutput())
-    {
-        gPlayer->getOutput()->ToggleMute();
-        showVolume(true);
-    }
+    if (volume_control)
+        volume_control->setMute(!volume_control->mute());
 }
 
 void PlaybackBoxMusic::toggleUpmix()
@@ -1232,13 +1232,13 @@
         speed_status->refresh();
     }
 
-    if (volume_control && gPlayer->getOutput())
+    if (volume_control)
     {
         if (volume_status)
         {
             if (on_or_off)
             {
-                volume_status->SetUsed(gPlayer->getOutput()->GetCurrentVolume());
+                volume_status->SetUsed(volume_control->mute() ? 0 : volume_control->volume());
                 volume_status->SetOrder(0);
                 volume_status->refresh();
                 volume_display_timer->setSingleShot(true);
@@ -1247,7 +1247,7 @@
                     lcd->switchToVolume("Music");
 
                 volume_level =
-                    (gPlayer->IsMuted()) ? 0.0f : gPlayer->GetVolume() * 0.01f;
+                    (volume_control->mute()) ? 0.0f : volume_control->volume() * 0.01f;
 
                 if (class LCD *lcd = LCD::Get())
                     lcd->setVolumeLevel(volume_level);
@@ -2418,6 +2418,16 @@
     return true;
 }
 
+void PlaybackBoxMusic::VolumeChanged(int)
+{
+    showVolume(true);
+}
+
+void PlaybackBoxMusic::MuteChanged(bool)
+{
+    showVolume(true);
+}
+
 QString PlaybackBoxMusic::getTimeString(int exTime, int maxTime)
 {
     QString time_string;
Index: mythmusic/mythmusic/miniplayer.cpp
===================================================================
--- mythmusic/mythmusic/miniplayer.cpp	(revision 23492)
+++ mythmusic/mythmusic/miniplayer.cpp	(working copy)
@@ -1,6 +1,7 @@
 // mythtv
 #include <mythcontext.h>
 #include <lcddevice.h>
+#include <libmyth/audiooutput.h>
 
 // mythui
 #include <mythuitext.h>
@@ -25,6 +26,15 @@
     m_coverImage = NULL;
     m_progressBar = NULL;
 
+    m_volumeControl = VolumeControlManager::GetControl(gContext->GetSetting("MixerDevice"));
+    if (m_volumeControl)
+    {
+        connect(m_volumeControl.data(), SIGNAL(changedVolume(int)),
+                this, SLOT(VolumeChanged(int)));
+        connect(m_volumeControl.data(), SIGNAL(changedMute(bool)),
+                this, SLOT(MuteChanged(bool)));
+    }
+
     m_displayTimer = new QTimer(this);
     m_displayTimer->setSingleShot(true);
     connect(m_displayTimer, SIGNAL(timeout()), this, SLOT(timerTimeout()));
@@ -68,11 +78,11 @@
     m_coverImage = dynamic_cast<MythUIImage *> (GetChild("coverart"));
     m_progressBar = dynamic_cast<MythUIProgressBar *> (GetChild("progress"));
 
-    if (m_volText && gPlayer->getOutput())
+    if (m_volText && m_volumeControl)
     {
         m_volFormat = m_volText->GetText();
         m_volText->SetText(QString(m_volFormat)
-                .arg((int) gPlayer->getOutput()->GetCurrentVolume()));
+                .arg((int) m_volumeControl->volume()));
     }
 
     gPlayer->setListener(this);
@@ -172,30 +182,24 @@
         }
         else if (action == "VOLUMEDOWN")
         {
-            if (gPlayer->getOutput())
-            {
-                gPlayer->getOutput()->AdjustCurrentVolume(-2);
-                showVolume();
-            }
+            if (m_volumeControl)
+                m_volumeControl->decreaseVolume();
         }
         else if (action == "VOLUMEUP")
         {
-            if (gPlayer->getOutput())
-            {
-                gPlayer->getOutput()->AdjustCurrentVolume(2);
-                showVolume();
-            }
+            if (m_volumeControl)
+                m_volumeControl->increaseVolume();
         }
         else if (action == "MUTE")
         {
-            if (gPlayer->getOutput())
+            if (m_volumeControl)
             {
-                gPlayer->getOutput()->ToggleMute();
+                m_volumeControl->setMute(!m_volumeControl->mute());
 
                 if (m_infoText)
                 {
                     m_showingInfo = true;
-                    if (gPlayer->IsMuted())
+                    if (m_volumeControl->mute())
                         m_infoText->SetText(tr("Mute: On"));
                     else
                         m_infoText->SetText(tr("Mute: Off"));
@@ -209,11 +213,11 @@
 
                 if (m_volText)
                 {
-                    if (gPlayer->IsMuted())
+                    if (m_volumeControl->mute())
                         m_volText->SetText(QString(m_volFormat).arg(0));
                     else
                         m_volText->SetText(QString(m_volFormat)
-                                .arg((int) gPlayer->getOutput()->GetCurrentVolume()));
+                                .arg(m_volumeControl->volume()));
                 }
             }
         }
@@ -543,6 +547,16 @@
         lcd->switchToMusic(mdata->Artist(), mdata->Album(), mdata->Title());
 }
 
+void MiniPlayer::VolumeChanged(int)
+{
+    showVolume();
+}
+
+void MiniPlayer::MuteChanged(bool)
+{
+    showVolume();
+}
+
 void MiniPlayer::showShuffleMode(void)
 {
     if (m_infoText)
@@ -634,8 +648,8 @@
 
 void MiniPlayer::showVolume(void)
 {
-    float level = (float)gPlayer->getOutput()->GetCurrentVolume();
-    bool muted = gPlayer->IsMuted();
+    float level = static_cast<float>(m_volumeControl->volume());
+    bool muted = m_volumeControl->mute();
 
     if (m_infoText)
     {
Index: mythmusic/mythmusic/musicplayer.h
===================================================================
--- mythmusic/mythmusic/musicplayer.h	(revision 23492)
+++ mythmusic/mythmusic/musicplayer.h	(working copy)
@@ -22,10 +22,6 @@
     void setVisual(MainVisual *visual);
     void setCDDevice(const QString &dev) { m_CDdevice = dev; }
 
-    void mute(void) {};
-    void unMute(void) {};
-    void setVolume(void) {};
-
     void setSpeed(float speed);
     void incSpeed();
     void decSpeed();
@@ -52,9 +48,6 @@
 
     Decoder     *getDecoder(void) { return m_decoder; }
     AudioOutput *getOutput(void) { return m_output; }
-    MuteState    GetMuteState(void) const;
-    uint         GetVolume(void) const;
-    bool         IsMuted(void) const { return GetMuteState() == kMuteAll; }
 
     GenericTree *constructPlaylist(void);
     GenericTree *getPlaylistTree() { return m_playlistTree; }
Index: mythmusic/mythmusic/musicplayer.cpp
===================================================================
--- mythmusic/mythmusic/musicplayer.cpp	(revision 23492)
+++ mythmusic/mythmusic/musicplayer.cpp	(working copy)
@@ -359,7 +359,7 @@
 
     // TODO: Error checking that device is opened correctly!
     m_output = AudioOutput::OpenAudio(adevice, pdevice, 16, 2, 0, 44100,
-                                      AUDIOOUTPUT_MUSIC, true, false,
+                                      AUDIOOUTPUT_MUSIC, false,
                                       gContext->GetNumSetting("MusicDefaultUpmix", 0) + 1);
     m_output->setBufferSize(256 * 1024);
     m_output->SetBlocking(false);
@@ -842,17 +842,3 @@
     m_playSpeed -= 0.05;
     setSpeed(m_playSpeed);
 }
-
-uint MusicPlayer::GetVolume(void) const
-{
-    if (m_output)
-        return m_output->GetCurrentVolume();
-    return 0;
-}
-
-MuteState MusicPlayer::GetMuteState(void) const
-{
-    if (m_output)
-        return m_output->GetMuteState();
-    return kMuteAll;
-}
Index: mythmusic/mythmusic/playbackbox.h
===================================================================
--- mythmusic/mythmusic/playbackbox.h	(revision 23492)
+++ mythmusic/mythmusic/playbackbox.h	(working copy)
@@ -8,7 +8,7 @@
 // mythtv
 #include <mythwidgets.h>
 #include <dialogbox.h>
-#include <audiooutput.h>
+#include <libmyth/volumecontrolmanager.h>
 
 // mythmusic
 #include "mainvisual.h"
@@ -101,6 +101,10 @@
     bool getInsertPLOptions(InsertPLOption &insertOption,
                             PlayPLOption &playOption, bool &bRemoveDups);
 
+  protected slots:
+    void VolumeChanged(int volume);
+    void MuteChanged(bool mute);
+
   signals:
 
     void dummy();   // debugging
@@ -172,7 +176,7 @@
     bool show_album_art;
     bool show_whole_tree;
     bool keyboard_accelerators;
-    bool volume_control;
+    QSharedPointer<VolumeControl> volume_control; ///< Volume Control interface
 
     QString exit_action;
 
Index: mythmusic/mythmusic/miniplayer.h
===================================================================
--- mythmusic/mythmusic/miniplayer.h	(revision 23492)
+++ mythmusic/mythmusic/miniplayer.h	(working copy)
@@ -1,6 +1,7 @@
 #ifndef MINIPLAYER_H_
 #define MINIPLAYER_H_
 
+#include <libmyth/volumecontrolmanager.h>
 #include <mythscreentype.h>
 
 class MusicPlayer;
@@ -27,6 +28,10 @@
     void timerTimeout(void);
     void showInfoTimeout(void);
 
+  protected slots:
+    void VolumeChanged(int volume);
+    void MuteChanged(bool mute);
+
   private:
     QString getTimeString(int exTime, int maxTime);
     void    updateTrackInfo(Metadata *mdata);
@@ -44,6 +49,7 @@
     int           m_currTime, m_maxTime;
 
     MusicPlayer  *m_parentPlayer;
+    QSharedPointer<VolumeControl> m_volumeControl; ///< Volume Control interface
 
     QTimer       *m_displayTimer;
     QTimer       *m_infoTimer;
