Index: mythmusic/mythmusic/playbackbox.cpp
===================================================================
--- mythmusic/mythmusic/playbackbox.cpp	(revision 11568)
+++ mythmusic/mythmusic/playbackbox.cpp	(working copy)
@@ -86,6 +86,7 @@
     showrating = gContext->GetNumSetting("MusicShowRatings", 0);
     listAsShuffled = gContext->GetNumSetting("ListAsShuffled", 0);
     cycle_visualizer = gContext->GetNumSetting("VisualCycleOnSongChange", 0);
+    random_visualizer = gContext->GetNumSetting("VisualRandomize", 0);
 
     // Through the magic of themes, our "GUI" already exists we just need to 
     // wire up it
@@ -177,11 +178,13 @@
     else
         mainvisual->setGeometry(screenwidth + 10, screenheight + 10, 160, 160);
     mainvisual->show();   
- 
-    visual_mode = gContext->GetSetting("VisualMode");
-    visual_mode.simplifyWhiteSpace();
-    visual_mode.replace(QRegExp("\\s"), ",");
 
+    fullscreen_blank = false;
+    visual_modes = QStringList::split(';', gContext->GetSetting("VisualMode"));
+    if (!visual_modes.count())
+        visual_modes.push_front("Blank");
+    current_visual = random_visualizer ? rand() % visual_modes.count() : 0;
+
     QString visual_delay = gContext->GetSetting("VisualModeDelay");
     bool delayOK;
     visual_mode_delay = visual_delay.toInt(&delayOK);
@@ -201,7 +204,7 @@
     //
     // Suspicion: in most modes, SDL is not happy if the
     // window doesn't fully exist yet  (????)
-    
+
     mainvisual->setVisual("Blank");
 
     // Ready to go. Let's update the foreground just to be safe.
@@ -390,14 +393,6 @@
             if (action == "ESCAPE" || action == "4")
             {
                 visualizer_status = 1;
-                QString visual_workaround = mainvisual->getCurrentVisual();
- 
-                // We may have gotten to full screen by pushing 7
-                // (full screen blank). Or it may be blank because
-                // the user likes "Blank". Figure out what to do ...
-            
-                if (visual_workaround == "Blank" && visual_mode != "Blank")
-                    visual_workaround = visual_mode;
 
                 mainvisual->setVisual("Blank");
                 if (visual_blackhole)
@@ -407,7 +402,7 @@
                                             screenheight + 10, 
                                             160, 160);
                 setUpdatesEnabled(true);
-                mainvisual->setVisual(visual_workaround);
+                mainvisual->setVisual(visual_modes[current_visual]);
                 bannerDisable();
 
                 if (!m_parent->IsExitingToMain())
@@ -942,7 +937,7 @@
                 else
                     setContext(2);
                 updateForeground();
-                mainvisual->setVisual(visual_mode);
+                mainvisual->setVisual(visual_modes[current_visual]);
 
                 if (curMeta) 
                     updateTrackInfo(curMeta);
@@ -1177,61 +1172,39 @@
 
 void PlaybackBoxMusic::CycleVisualizer()
 {
-    QString new_visualizer;
-
     // Only change the visualizer if there is more than 1 visualizer
     // and the user currently has a visualizer active
-    if (mainvisual->numVisualizers() > 1 && visualizer_status > 0)
+    if (visual_modes.count() > 1 && visualizer_status > 0)
     {
-        QStringList allowed_modes = QStringList::split(",", visual_mode);
-        if (allowed_modes[0].stripWhiteSpace().endsWith("*"))
+        if (random_visualizer)
         {
-            //User has a favorite, but requested the next in the list
-            //Find the current position in the list
-            QString current_visual = mainvisual->getCurrentVisual();
-            unsigned int index = 0;
-            while ((index < allowed_modes.size()) &&
-                   (!allowed_modes[index++].stripWhiteSpace().startsWith(current_visual))) { }
-            // index is 1 greater than the current visualizer's index
-            if (index >= allowed_modes.size()) {
-                index = 0;
-            }
-            new_visualizer = allowed_modes[index].stripWhiteSpace();
-            // Make sure the asterisk isn't passed through
-            if (new_visualizer.endsWith("*")) {
-                new_visualizer.truncate(new_visualizer.length() - 1);
-            }
-        }
-        else if (visual_mode != "Random")
-        {
             //Find a visual thats not like the previous visual
+            unsigned int next_visualizer;
             do
-            {
-                new_visualizer =  allowed_modes[rand() % allowed_modes.size()];
-            } 
-            while (new_visualizer == mainvisual->getCurrentVisual() &&
-                   allowed_modes.count() > 1);
+                next_visualizer = rand() % visual_modes.count();
+            while (next_visualizer == current_visual);
+            current_visual = next_visualizer;
         }
         else
         {
-            new_visualizer = visual_mode;
+            //Change to the next selected visual
+            current_visual = (current_visual + 1) % visual_modes.count();
         }
 
         //Change to the new visualizer
         visual_mode_timer->stop();
         mainvisual->setVisual("Blank");
-        mainvisual->setVisual(new_visualizer);
-    } 
-    else if (mainvisual->numVisualizers() == 1 && visual_mode == "AlbumArt" && 
+        mainvisual->setVisual(visual_modes[current_visual]);
+    }
+    else if (visual_modes.count() == 1 && visual_modes[current_visual] == "AlbumArt" && 
              visualizer_status > 0) 
     {
         // If only the AlbumArt visualization is selected, then go ahead and
         // restart the visualization.  This will give AlbumArt the opportunity
         // to change images if there are multiple images available.
-        new_visualizer = visual_mode;
         visual_mode_timer->stop();
         mainvisual->setVisual("Blank");
-        mainvisual->setVisual(new_visualizer);
+        mainvisual->setVisual(visual_modes[current_visual]);
     }
 }
 
@@ -1757,7 +1730,7 @@
                     info_text->SetText(info_string);
                 if (current_visualization_text)
                 {
-                    current_visualization_text->SetText(mainvisual->getCurrentVisualDesc());
+                    current_visualization_text->SetText(visual_modes[current_visual]);
                     current_visualization_text->refresh();
                 }
             }
@@ -1928,9 +1901,10 @@
 
 void PlaybackBoxMusic::toggleFullBlankVisualizer()
 {
-    if( mainvisual->getCurrentVisual() == "Blank" &&
-        visualizer_status == 2)
+    if(fullscreen_blank)
     {
+        fullscreen_blank = false;
+
         //
         //  If we are already full screen and 
         //  blank, go back to regular dialog
@@ -1941,7 +1915,7 @@
         else
             mainvisual->setGeometry(screenwidth + 10, screenheight + 10, 
                                     160, 160);
-        mainvisual->setVisual(visual_mode);
+        mainvisual->setVisual(visual_modes[current_visual]);
         bannerDisable();
         visualizer_status = 1;
         if(visual_mode_delay > 0)
@@ -1950,7 +1924,7 @@
         }
         if (current_visualization_text)
         {
-            current_visualization_text->SetText(mainvisual->getCurrentVisualDesc());
+            current_visualization_text->SetText(visual_modes[current_visual]);
             current_visualization_text->refresh();
         }
         setUpdatesEnabled(true);
@@ -1961,6 +1935,7 @@
         //  Otherwise, go full screen blank
         //
 
+        fullscreen_blank = true;
         mainvisual->setVisual("Blank");
         mainvisual->setGeometry(0, 0, screenwidth, screenheight);
         visualizer_status = 2;
Index: mythmusic/mythmusic/synaesthesia.cpp
===================================================================
--- mythmusic/mythmusic/synaesthesia.cpp	(revision 11568)
+++ mythmusic/mythmusic/synaesthesia.cpp	(working copy)
@@ -684,20 +684,9 @@
 #endif
 }
 
-const QString &SynaesthesiaFactory::name(void) const
+static class SynaesthesiaFactory : public VisFactory
 {
-    static QString name("Synaesthesia");
-    return name;
-}
-
-const QString &SynaesthesiaFactory::description(void) const
-{
-    static QString name(QObject::tr("Synaesthesia"));
-    return name;
-}
-
-VisualBase *SynaesthesiaFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    return new Synaesthesia(winid);
-}
+public:
+    const QString& name() const {static QString name("Synaesthesia"); return name;}
+    VisualBase* create(MainVisual*, long int winid) const {return new Synaesthesia(winid);}
+} SynaesthesiaFactory;
Index: mythmusic/mythmusic/visualize.cpp
===================================================================
--- mythmusic/mythmusic/visualize.cpp	(revision 11568)
+++ mythmusic/mythmusic/visualize.cpp	(working copy)
@@ -275,25 +275,14 @@
     return true;
 }
 
-const QString &SpectrumFactory::name(void) const
+static class SpectrumFactory : public VisFactory
 {
-    static QString name("Spectrum");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("Spectrum"); return name;}
+    VisualBase* create(MainVisual*, long int) const {return new Spectrum;}
+} SpectrumFactory;
 
-const QString &SpectrumFactory::description(void) const
-{
-    static QString name(QObject::tr("Spectrum"));
-    return name;
-}
 
-VisualBase *SpectrumFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    (void)winid;
-    return new Spectrum();
-}
-
 AlbumArt::AlbumArt(MainVisual *parent)
 {
     pParent = parent;
@@ -385,25 +374,14 @@
     return true;
 }
 
-const QString &AlbumArtFactory::name(void) const
+static class AlbumArtFactory: public VisFactory
 {
-    static QString name("AlbumArt");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("AlbumArt"); return name;}
+    VisualBase* create(MainVisual* parent, long int) const {return new AlbumArt(parent);}
+} AlbumArtFactory;
 
-const QString &AlbumArtFactory::description(void) const
-{
-    static QString name("Displays album art from .folder.png during playback");
-    return name;
-}
 
-VisualBase *AlbumArtFactory::create(MainVisual *parent, long int winid)
-{
-    (void)winid;
-    return new AlbumArt(parent);
-}
-
-
 Blank::Blank()
     : VisualBase(true)
 {
@@ -433,25 +411,14 @@
     return true;
 }
 
-const QString &BlankFactory::name(void) const
+static class BlankFactory : public VisFactory
 {
-    static QString name("Blank");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("Blank"); return name;}
+    VisualBase* create(MainVisual*, long int) const {return new Blank;}
+} BlankFactory;
 
-const QString &BlankFactory::description(void) const
-{
-    static QString name(QObject::tr("Blank"));
-    return name;
-}
 
-VisualBase *BlankFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    (void)winid;
-    return new Blank();
-}
-
 Squares::Squares()
 {
     number_of_squares = 16;
@@ -531,25 +498,14 @@
     return true;
 }
 
-const QString &SquaresFactory::name(void) const
+static class SquaresFactory: public VisFactory
 {
-    static QString name("Squares");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("Squares"); return name;}
+    VisualBase* create(MainVisual*, long int) const {return new Squares;}
+} SquaresFactory;
 
-const QString &SquaresFactory::description(void) const
-{
-    static QString name("Square visualizer");
-    return name;
-}
 
-VisualBase *SquaresFactory::create(MainVisual *parent, long int winid)
-{
-    (void)winid;
-    (void)parent;
-    return new Squares();
-}
-
 #ifdef OPENGL_SUPPORT
 
 //        Need this for the Gears Object (below)
@@ -975,22 +931,11 @@
     drawTheGears();
 }
 
-const QString &GearsFactory::name(void) const
+static class GearsFactory: public VisFactory
 {
-    static QString name("Gears");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("Gears"); return name;}
+    VisualBase* create(MainVisual* parent, long int) const {return new Gears(parent);}
+} GearsFactory;
 
-const QString &GearsFactory::description(void) const
-{
-    static QString name(QObject::tr("Gears"));
-    return name;
-}
-
-VisualBase *GearsFactory::create(MainVisual *parent, long int winid)
-{
-    (void)winid;
-    return new Gears(parent);
-}
-
 #endif
Index: mythmusic/mythmusic/mainvisual.h
===================================================================
--- mythmusic/mythmusic/mainvisual.h	(revision 11568)
+++ mythmusic/mythmusic/mainvisual.h	(working copy)
@@ -19,14 +19,16 @@
 #include <qptrlist.h>
 #include <qstringlist.h>
 
+
 class Buffer;
 class Output;
 class VisualNode;
 class LogScale;
 class QTimer;
-class VisFactory;
 class InfoWidget;
+class MainVisual;
 
+
 class VisualNode
 {
 public:
@@ -66,6 +68,22 @@
     bool xscreensaverenable;
 };
 
+class VisFactory
+{
+public:
+    VisFactory() {m_pNextVisFactory = g_pVisFactories; g_pVisFactories = this;}
+
+    const VisFactory* next() const {return m_pNextVisFactory;}
+    virtual const QString &name(void) const = 0;
+    virtual VisualBase* create(MainVisual *parent, long int winid) const = 0;
+
+    static const VisFactory* VisFactories() {return g_pVisFactories;}
+
+protected:
+    static VisFactory* g_pVisFactories;
+    VisFactory*        m_pNextVisFactory;
+};
+
 // base class to handle things like frame rate...
 class MainVisual : public QWidget, public MythTV::Visual
 {
@@ -76,13 +94,8 @@
     virtual ~MainVisual();
 
     VisualBase *visual() const { return vis; }
-    void setVis( VisualBase *newvis );
-    void setVisual( const QString &visualname );
+    void setVisual(const QString &name);
 
-    QString getCurrentVisual() const;
-    QString getCurrentVisualDesc() const;
-    int numVisualizers() const;
-
     void add(uchar *, unsigned long, unsigned long, int, int);
     void prepare();
 
@@ -99,9 +112,7 @@
 
     void addInformation(const QString &);
 
-    static void registerVisFactory(VisFactory *);
-    static VisualBase *createVis(const QString &name,
-                                 MainVisual *parent, long int winid);
+    static QStringList VisFactories();
 
 public slots:
     void timeout();
@@ -119,7 +130,6 @@
     int fps;
 
     QString current_visual_name;
-    QStringList allowed_modes;
 };
 
 class InfoWidget : public QWidget
@@ -136,15 +146,6 @@
     QPixmap info_pixmap;
 };
 
-class VisFactory
-{
-  public:
-    virtual const QString &name(void) const = 0;
-    virtual const QString &description(void) const = 0;
-    virtual VisualBase *create(MainVisual *parent, long int winid) = 0;
-    virtual ~VisFactory() {}
-};
-
 class StereoScope : public VisualBase
 {
 public:
@@ -173,22 +174,7 @@
    bool draw( QPainter *p, const QColor &back );
 };  
 
-class StereoScopeFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
 
-class MonoScopeFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 class LogScale
 {
 public:
Index: mythmusic/mythmusic/globalsettings.cpp
===================================================================
--- mythmusic/mythmusic/globalsettings.cpp	(revision 11568)
+++ mythmusic/mythmusic/globalsettings.cpp	(working copy)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 
 #include "globalsettings.h"
+#include "mainvisual.h"
 #include <qfile.h>
 #include <qdialog.h>
 #include <qcursor.h>
@@ -328,11 +329,13 @@
 {
     HostComboBox *gc = new HostComboBox("PlayMode");
     gc->setLabel(QObject::tr("Play mode"));
-    gc->addSelection(QObject::tr("Normal"), "Normal");
-    gc->addSelection(QObject::tr("Random"), "Random");
-    gc->addSelection(QObject::tr("Intelligent"), "Intelligent");
+    gc->addSelection(QObject::tr("Normal"), "none");
+    gc->addSelection(QObject::tr("Random"), "random");
+    gc->addSelection(QObject::tr("Intelligent"), "intelligent");
+    gc->addSelection(QObject::tr("Album"), "album");
+    gc->setCurrent(0);
     gc->setHelpText(QObject::tr("Starting shuffle mode for the player.  Can be "
-                    "either normal, random, or intelligent (random)."));
+                    "either normal, random, intelligent (random), or Album."));
     return gc;
 };
 
@@ -352,10 +355,20 @@
     gc->setLabel(QObject::tr("Change Visualizer on each song"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Change the visualizer when the song "
-                    "change."));
+                    "changes."));
     return gc;
 };
 
+static HostCheckBox *VisualRandomize()
+{
+    HostCheckBox *gc = new HostCheckBox("VisualRandomize");
+    gc->setLabel(QObject::tr("Randomize Visualizer order"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("On changing the visualizer pick "
+                    "a new one at random."));
+    return gc;
+};
+
 static HostSpinBox *VisualScaleWidth()
 {
     HostSpinBox *gc = new HostSpinBox("VisualScaleWidth", 1, 2, 1);
@@ -380,16 +393,17 @@
     return gc;
 };
 
-static HostLineEdit *VisualizationMode()
+static HostListBox *VisualizationMode()
 {
-    HostLineEdit *gc = new HostLineEdit("VisualMode");
+    HostListBox *gc = new HostListBox("VisualMode", MythListBox::Multi);
     gc->setLabel(QObject::tr("Visualizations"));
-    gc->setValue("Random");
-    gc->setHelpText(QObject::tr("List of visualizations to use during playback. "
-                    "Possible values are space-separated list of ") + "Random, "
-                    "MonoScope, StereoScope, Spectrum, BumpScope, Goom, "
-                    "Synaesthesia, AlbumArt, Gears, Squares " + QObject::tr("and") +
-                    " Blank");
+
+    QStringList visualizations = MainVisual::VisFactories();
+    visualizations.sort();
+    for (unsigned i = 0; i < visualizations.size(); i++)
+        gc->SelectSetting::addSelection(visualizations[i]);
+
+    gc->setHelpText(QObject::tr("List of visualizations possible to use during playback."));
     return gc;
 };
 
@@ -566,6 +580,7 @@
     playersettings2->setLabel(QObject::tr("Visualization Settings"));
     playersettings2->addChild(VisualizationMode());
     playersettings2->addChild(VisualCycleOnSongChange());
+    playersettings2->addChild(VisualRandomize());
     playersettings2->addChild(VisualModeDelay());
     playersettings2->addChild(VisualScaleWidth());
     playersettings2->addChild(VisualScaleHeight());
Index: mythmusic/mythmusic/bumpscope.h
===================================================================
--- mythmusic/mythmusic/bumpscope.h	(revision 11568)
+++ mythmusic/mythmusic/bumpscope.h	(working copy)
@@ -63,14 +63,6 @@
     unsigned int icolor;
 };
 
-class BumpScopeFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 #endif
 
 #endif // __mainvisual_h
Index: mythmusic/mythmusic/synaesthesia.h
===================================================================
--- mythmusic/mythmusic/synaesthesia.h	(revision 11568)
+++ mythmusic/mythmusic/synaesthesia.h	(working copy)
@@ -75,13 +75,4 @@
 #endif
 };
 
-class SynaesthesiaFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
-
-#endif // __mainvisual_h
+#endif // SYNAETHESIA
Index: mythmusic/mythmusic/bumpscope.cpp
===================================================================
--- mythmusic/mythmusic/bumpscope.cpp	(revision 11568)
+++ mythmusic/mythmusic/bumpscope.cpp	(working copy)
@@ -581,22 +581,11 @@
     return false;
 }
 
-const QString &BumpScopeFactory::name(void) const
+static class BumpScopeFactory : public VisFactory
 {
-    static QString name("BumpScope");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("BumpScope"); return name;}
+    VisualBase* create(MainVisual*, long int winid) const {return new BumpScope(winid);}
+} BumpScopeFactory;
 
-const QString &BumpScopeFactory::description(void) const
-{
-    static QString name(QObject::tr("BumpScope"));
-    return name;
-}
-
-VisualBase *BumpScopeFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    return new BumpScope(winid);
-}
-
 #endif
Index: mythmusic/mythmusic/playbackbox.h
===================================================================
--- mythmusic/mythmusic/playbackbox.h	(revision 11568)
+++ mythmusic/mythmusic/playbackbox.h	(working copy)
@@ -158,7 +158,9 @@
 
     MainVisual *mainvisual;
 
-    QString visual_mode;
+    bool fullscreen_blank;
+    QStringList visual_modes;
+    unsigned int current_visual;
     int visual_mode_delay;
     QTimer *visual_mode_timer;
     QTimer *lcd_update_timer;
@@ -179,6 +181,7 @@
     GenericTree *playlist_tree;
     
     bool cycle_visualizer;
+    bool random_visualizer;
     bool show_whole_tree;
     bool keyboard_accelerators;
     bool volume_control;
Index: mythmusic/mythmusic/mainvisual.cpp
===================================================================
--- mythmusic/mythmusic/mainvisual.cpp	(revision 11568)
+++ mythmusic/mythmusic/mainvisual.cpp	(working copy)
@@ -7,10 +7,7 @@
 #include "mainvisual.h"
 #include "constants.h"
 #include <mythtv/audiooutput.h>
-#include "synaesthesia.h"
-#include "bumpscope.h"
 #include "visualize.h"
-#include "goom/mythgoom.h"
 
 #include <qtimer.h>
 #include <qpainter.h>
@@ -35,32 +32,8 @@
 #include <iostream>
 using namespace std;
 
-static QPtrList<VisFactory> *visfactories = 0;
+VisFactory* VisFactory::g_pVisFactories = 0;
 
-static void checkVisFactories(void)
-{
-    if (!visfactories)
-    {
-        visfactories = new QPtrList<VisFactory>;
-
-        MainVisual::registerVisFactory(new BlankFactory);
-
-        MainVisual::registerVisFactory(new MonoScopeFactory);
-        MainVisual::registerVisFactory(new StereoScopeFactory);
-        MainVisual::registerVisFactory(new SynaesthesiaFactory);
-        MainVisual::registerVisFactory(new SpectrumFactory);
-        MainVisual::registerVisFactory(new AlbumArtFactory);
-        MainVisual::registerVisFactory(new SquaresFactory);
-#ifdef OPENGL_SUPPORT
-        MainVisual::registerVisFactory(new GearsFactory);
-#endif
-#ifdef SDL_SUPPORT
-        MainVisual::registerVisFactory(new BumpScopeFactory);
-        MainVisual::registerVisFactory(new GoomFactory);
-#endif
-    }
-}
-
 VisualBase::VisualBase(bool screensaverenable)
     : xscreensaverenable(screensaverenable)
 {
@@ -137,93 +110,27 @@
     nodes.clear();
 }
 
-void MainVisual::setVisual( const QString &visualname )
+void MainVisual::setVisual(const QString &name)
 {
-    VisualBase *newvis = 0;
+    delete vis;
+    vis = 0;
 
-    allowed_modes = QStringList::split(",", visualname);
-
-    if (allowed_modes[0].stripWhiteSpace().endsWith("*"))
+    for (const VisFactory* pVisFactory = VisFactory::VisFactories(); pVisFactory; pVisFactory = pVisFactory->next())
     {
-        // User has a favorite
-        // The asterisk should only be passed in at startup, so start with
-        // the user's favorite
-
-        current_visual_name = allowed_modes[0].stripWhiteSpace();
-        current_visual_name.truncate(current_visual_name.length() - 1);
+        if (pVisFactory->name() == name)
+        {
+            vis = pVisFactory->create(this, winId());
+            vis->resize(size());
+            fps = vis->getDesiredFPS();
+            break;
+        }
     }
-    else if (allowed_modes.contains("Random"))
-    {
-        //
-        //  Pick anything from compile time options
-        //
 
-        checkVisFactories();
-        int numvis = visfactories->count() - 1;
-        int i = 1 + (int)((double)rand() / (RAND_MAX + 1.0) * numvis);
-        VisFactory *fact = visfactories->at(i);
-        current_visual_name = fact->name();
-        
-    }
-    else 
-    {
-        //
-        //  Pick anything from run time options
-        //
-        int vis_mode_index = 0;
-        if (allowed_modes.size() > 1)
-            vis_mode_index = rand() % allowed_modes.size();
-
-        current_visual_name = allowed_modes[vis_mode_index].stripWhiteSpace();
-    }
-    newvis = createVis(current_visual_name, this, winId());
-    setVis( newvis );
-}
-
-void MainVisual::setVis( VisualBase *newvis )
-{
-    if (vis)
-    {
-        delete vis;
-    }
-
-    vis = newvis;
-    if ( vis )
-    {
-        vis->resize( size() );
-        fps = vis->getDesiredFPS();
-    }
-
     // force an update
     timer->stop();
-    timer->start( 1000 / fps );
+    timer->start(1000 / fps);
 }
 
-int MainVisual::numVisualizers( void ) const
-{
-    QString visualname = gContext->GetSetting("VisualMode");
-    visualname.simplifyWhiteSpace();
-    visualname.replace(QRegExp("\\s"), ",");
-    QStringList visualizers = QStringList::split(",", visualname);
-
-    if (visualizers.contains("Random"))
-        return visfactories->count() - 1;
-    else
-        return visualizers.size();
-}
-
-QString MainVisual::getCurrentVisual(void) const
-{
-    return current_visual_name;
-}
-
-QString MainVisual::getCurrentVisualDesc(void) const
-{
-    /* XXX This should be changed to a real call to visual->description() 
-     * it works as long as ::name and ::desc uses the same string */
-    return QObject::tr(current_visual_name);
-}
-
 void MainVisual::prepare()
 {
     nodes.setAutoDelete(TRUE);
@@ -359,63 +266,26 @@
 
 void MainVisual::hideEvent(QHideEvent *e)
 {
-    setVis(0);
+    delete vis;
+    vis = 0;
     emit hidingVisualization();
     QWidget::hideEvent(e);
 }
 
-void MainVisual::registerVisFactory(VisFactory *vis)
-{
-    visfactories->append(vis);
-}
-
 void MainVisual::addInformation(const QString &new_info) {
     info_widget->addInformation(new_info);
 }
 
-VisualBase *MainVisual::createVis(const QString &name, MainVisual *parent,
-                                  long int winid)
+// static member function
+QStringList MainVisual::VisFactories()
 {
-    checkVisFactories();
-
-    VisualBase *vis = 0;
-
-    VisFactory *fact = visfactories->first();
-    while (fact)
-    {
-        if (fact->name() == name)
-        {
-            vis = fact->create(parent, winid);
-            break;
-        }
-        fact = visfactories->next();
-    }
-
-    return vis;
+    QStringList visualizations;
+    for (const VisFactory* pVisFactory = VisFactory::VisFactories(); pVisFactory; pVisFactory = pVisFactory->next())
+        visualizations.append(pVisFactory->name());
+    return visualizations;
 }
 
-/*
 
-VisualBase *MainVisual::randomVis(MainVisual *parent, long int winid)
-{
-    checkVisFactories();
-
-    VisualBase *vis = 0;
-
-    int numvis = visfactories->count() - 1;
-    int i = 1 + (int)((double)rand() / (RAND_MAX + 1.0) * numvis);
-
-    VisFactory *fact = visfactories->at(i);
-
-    if (fact)
-    {
-        vis = fact->create(parent, winid);
-    }    
-
-    return vis;
-}
-*/
-
 InfoWidget::InfoWidget(QWidget *parent)
     : QWidget( parent)
 {
@@ -834,44 +704,21 @@
     return true;
 }
 
-const QString &StereoScopeFactory::name(void) const
+class StereoScopeFactory : public VisFactory
 {
-    static QString name("StereoScope");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("StereoScope"); return name;}
+    VisualBase* create(MainVisual*, long int) const {return new StereoScope;}
+} StereoScopeFactory;
 
-const QString &StereoScopeFactory::description(void) const
+class MonoScopeFactory : public VisFactory
 {
-    static QString name(QObject::tr("StereoScope"));
-    return name;
-}
+public:
+    const QString& name() const {static QString name("MonoScope"); return name;}
+    VisualBase* create(MainVisual*, long int) const {return new MonoScope;}
+} MonoScopeFactory;
 
-VisualBase *StereoScopeFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    (void)winid;
-    return new StereoScope();
-}
 
-const QString &MonoScopeFactory::name(void) const
-{
-    static QString name("MonoScope");
-    return name;
-}
-
-const QString &MonoScopeFactory::description(void) const
-{
-    static QString name(QObject::tr("MonoScope"));
-    return name;
-}
-
-VisualBase *MonoScopeFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    (void)winid;
-    return new MonoScope();
-}
-
 LogScale::LogScale(int maxscale, int maxrange)
     : indices(0), s(0), r(0)
 {
Index: mythmusic/mythmusic/goom/mythgoom.cpp
===================================================================
--- mythmusic/mythmusic/goom/mythgoom.cpp	(revision 11568)
+++ mythmusic/mythmusic/goom/mythgoom.cpp	(working copy)
@@ -174,22 +174,11 @@
     return false;
 }
 
-const QString &GoomFactory::name(void) const
+static class GoomFactory : public VisFactory
 {
-    static QString name("Goom");
-    return name;
-}
+public:
+    const QString& name() const {static QString name("Goom"); return name;}
+    VisualBase* create(MainVisual*, long int winid) const {return new Goom(winid);}
+} GoomFactory;
 
-const QString &GoomFactory::description(void) const
-{
-    static QString name(QObject::tr("Goom"));
-    return name;
-}
-
-VisualBase *GoomFactory::create(MainVisual *parent, long int winid)
-{
-    (void)parent;
-    return new Goom(winid);
-}
-
 #endif
Index: mythmusic/mythmusic/goom/mythgoom.h
===================================================================
--- mythmusic/mythmusic/goom/mythgoom.h	(revision 11568)
+++ mythmusic/mythmusic/goom/mythgoom.h	(working copy)
@@ -28,14 +28,6 @@
     int scalew, scaleh;
 };
 
-class GoomFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 #endif
 
 #endif // __mainvisual_h
Index: mythmusic/mythmusic/visualize.h
===================================================================
--- mythmusic/mythmusic/visualize.h	(revision 11568)
+++ mythmusic/mythmusic/visualize.h	(working copy)
@@ -76,14 +76,6 @@
 #endif
 };
 
-class SpectrumFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 class AlbumArt : public VisualBase
 {
   public:
@@ -104,14 +96,6 @@
     QImage image;
 };
 
-class AlbumArtFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 class Blank : public VisualBase
 {
     // This draws ... well ... nothing	
@@ -127,14 +111,6 @@
     QSize size;
 };
 
-class BlankFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 class Squares : public Spectrum
 {
   public:
@@ -152,14 +128,6 @@
     int number_of_squares;
 };
 
-class SquaresFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
 #ifdef OPENGL_SUPPORT
 
 class Gears : public QGLWidget, public VisualBase
@@ -200,15 +168,6 @@
 #endif
 };
 
-class GearsFactory : public VisFactory
-{
-  public:
-    const QString &name(void) const;
-    const QString &description(void) const;
-    VisualBase *create(MainVisual *parent, long int winid);
-};
-
-
 #endif // opengl_support	
 
 #endif // __visualize_h

