[mythtv] [PATCH] MythMusic Cycle Visualizer on song change

Dan M dan at milkcarton.com
Sat Apr 19 23:08:02 EDT 2003


Attached is a patch for MythMusic which changes the visualizer when the song changes (Either automaticly when the previous song ends, or the user presses the "Next" button.  Its mainly useful if you have VisualMode=Random or a list
(VisualMode=Goom,StereoScope,BumpScope,etc).  This updated version fixes a problem with visual_mode=Random.  This patch makes sure the same visualizer doesn't get run twice in a row (Except for VisualMode=Random as that's done inside of mainvisual.cpp.  Though, if there is enough support I'll investigate this and maybe impliment it).

This settings is configurable via MythMusic->Setup->Player Settings

-dan

-------------- next part --------------
Index: mythmusic/globalsettings.cpp
===================================================================
RCS file: /var/lib/cvs/mythmusic/mythmusic/globalsettings.cpp,v
retrieving revision 1.2
diff -u -d -r1.2 globalsettings.cpp
--- mythmusic/globalsettings.cpp	18 Apr 2003 18:13:37 -0000	1.2
+++ mythmusic/globalsettings.cpp	20 Apr 2003 05:56:36 -0000
@@ -189,6 +189,17 @@
         };
 };
 
+class VisualCycleOnSongChange: public CheckBoxSetting, public GlobalSetting {
+public:
+    VisualCycleOnSongChange():
+        GlobalSetting("VisualCycleOnSongChange") {
+        setLabel("Change Visualizer on each song");
+        setValue(true);
+        setHelpText("Change the visualizer when the song "
+                    "change.");
+    };
+};
+
 class VisualScaleWidth: public SpinBoxSetting, public GlobalSetting {
 public:
     VisualScaleWidth():
@@ -343,9 +354,14 @@
     playersettings->addChild(new PlayMode());
     playersettings->addChild(new UseShowRatings());
     playersettings->addChild(new UseListShuffled());
-    playersettings->addChild(new VisualizationMode());
-    playersettings->addChild(new VisualModeDelay());
-    playersettings->addChild(new VisualScaleWidth());
-    playersettings->addChild(new VisualScaleHeight());
     addChild(playersettings);
+
+    VerticalConfigurationGroup* playersettings2 = new VerticalConfigurationGroup(false);
+    playersettings2->setLabel("Visualization Settings");
+    playersettings2->addChild(new VisualizationMode());
+    playersettings2->addChild(new VisualCycleOnSongChange());
+    playersettings2->addChild(new VisualModeDelay());
+    playersettings2->addChild(new VisualScaleWidth());
+    playersettings2->addChild(new VisualScaleHeight());
+    addChild(playersettings2);
 }
Index: mythmusic/mainvisual.cpp
===================================================================
RCS file: /var/lib/cvs/mythmusic/mythmusic/mainvisual.cpp,v
retrieving revision 1.17
diff -u -d -r1.17 mainvisual.cpp
--- mythmusic/mainvisual.cpp	26 Feb 2003 23:41:11 -0000	1.17
+++ mythmusic/mainvisual.cpp	20 Apr 2003 05:56:36 -0000
@@ -24,6 +24,7 @@
 #include <qpixmap.h>
 #include <qimage.h>
 #include <qcursor.h>
+#include <qstring.h>
 
 #include <math.h>
 #include <stdio.h>
@@ -82,17 +83,22 @@
 void MainVisual::setVisual( const QString &visualname )
 {
     VisualBase *newvis = 0;
-
     allowed_modes = QStringList::split(",", visualname);
 
     if (allowed_modes.contains("Random"))
     {
         newvis = randomVis(this, winId());
     }
-    else 
-        newvis = createVis(allowed_modes[rand() % allowed_modes.size()], 
-                           this, winId());
-    	
+    else
+    {
+        int vis_mode_index = 0;
+        if ( allowed_modes.size() > 1)
+            rand() % allowed_modes.size();
+
+        current_visual_name = allowed_modes[vis_mode_index];
+        newvis = createVis(current_visual_name, this, winId());
+    }
+
     setVis( newvis );
 }
 
@@ -115,6 +121,22 @@
     timer->start( 1000 / fps );
 }
 
+int MainVisual::numVisualizers( void ) const
+{
+    QString visualname = gContext->GetSetting("VisualMode");
+    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;
+}
+
 void MainVisual::prepare()
 {
     nodes.setAutoDelete(TRUE);
Index: mythmusic/mainvisual.h
===================================================================
RCS file: /var/lib/cvs/mythmusic/mythmusic/mainvisual.h,v
retrieving revision 1.9
diff -u -d -r1.9 mainvisual.h
--- mythmusic/mainvisual.h	26 Feb 2003 23:41:11 -0000	1.9
+++ mythmusic/mainvisual.h	20 Apr 2003 05:56:37 -0000
@@ -73,6 +73,8 @@
     VisualBase *visual() const { return vis; }
     void setVis( VisualBase *newvis );
     void setVisual( const QString &visualname );
+    QString getCurrentVisual() const;
+    int numVisualizers() const;
 
     void add(Buffer *, unsigned long, int, int);
     void prepare();
@@ -111,6 +113,8 @@
     QTimer *timer;
     bool playing;
     int fps;
+
+    QString current_visual_name;
 
     QStringList allowed_modes;
 };
Index: mythmusic/playbackbox.cpp
===================================================================
RCS file: /var/lib/cvs/mythmusic/mythmusic/playbackbox.cpp,v
retrieving revision 1.40
diff -u -d -r1.40 playbackbox.cpp
--- mythmusic/playbackbox.cpp	12 Apr 2003 04:31:18 -0000	1.40
+++ mythmusic/playbackbox.cpp	20 Apr 2003 05:56:37 -0000
@@ -1011,6 +1011,35 @@
     }
 }
 
+void PlaybackBox::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_is_active )
+    {
+        if ( visual_mode != "Random" )
+        {
+            QStringList allowed_modes = QStringList::split(",", visual_mode);
+            //Find a visual thats not like the previous visual
+            do
+            {
+                new_visualizer =  allowed_modes[rand() % allowed_modes.size()];
+            } while ( new_visualizer == mainvisual->getCurrentVisual() );
+        }
+        else
+            new_visualizer = visual_mode;
+
+        //Change to the new visualizer
+        visual_mode_timer->stop();
+        mainvisual->setVisual("Blank");
+        mainvisual->showFullScreen();
+        mainvisual->setVisual(new_visualizer);
+        visualizer_is_active = true;
+    }
+}
+
 void PlaybackBox::pause(void)
 {
     if(plist->count() < 1)
@@ -1162,13 +1191,19 @@
     listlock.unlock();
 
     play();
+
+    //Call CycleVisualizer to cycle the visualizer IF: Its currently on,
+    // and the user wants to cycle the visualizer when the song changes
+    int cycle_visualizer = gContext->GetNumSetting("VisualCycleOnSongChange", 0);
+    if (visualizer_is_active && cycle_visualizer)
+        CycleVisualizer();
 }
 
 void PlaybackBox::next()
 {
     if(plist->count() < 1)
         return;
-        
+
     listlock.lock();
 
     plElapsed += curMeta->Length() / 1000;
@@ -1190,6 +1225,12 @@
         stop();
     else
         play();
+
+    //Call CycleVisualizer to cycle the visualizer IF: Its currently on,
+    // and the user wants to cycle the visualizer when the song changes
+    int cycle_visualizer = gContext->GetNumSetting("VisualCycleOnSongChange", 0);
+    if (visualizer_is_active && cycle_visualizer)
+        CycleVisualizer();
 }
 
 void PlaybackBox::nextAuto()
Index: mythmusic/playbackbox.h
===================================================================
RCS file: /var/lib/cvs/mythmusic/mythmusic/playbackbox.h,v
retrieving revision 1.22
diff -u -d -r1.22 playbackbox.h
--- mythmusic/playbackbox.h	12 Apr 2003 04:31:18 -0000	1.22
+++ mythmusic/playbackbox.h	20 Apr 2003 05:56:37 -0000
@@ -67,6 +67,7 @@
     void togglePlaylistView();
     void nextAuto();
     void visEnable();
+    void CycleVisualizer();
     void resetTimer();
     void restartTimer();
     void jumpToItem(QListViewItem *curItem);


More information about the mythtv-dev mailing list