[vlc-commits] [Git][videolan/vlc][master] visualization: update projectM module to support libprojectM v4

Steve Lhomme (@robUx4) gitlab at videolan.org
Sat Apr 18 04:53:39 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
13fb39ea by Thibault Fraigneau at 2026-04-18T04:16:03+00:00
visualization: update projectM module to support libprojectM v4

- - - - -


2 changed files:

- configure.ac
- modules/visualization/projectm.cpp


Changes:

=====================================
configure.ac
=====================================
@@ -4671,15 +4671,23 @@ AC_ARG_ENABLE([projectm],
   AS_HELP_STRING([--enable-projectm], [projectM visualization plugin (default enabled)]))
 AS_IF([test "${enable_projectm}" != "no"],
   [
-    PKG_CHECK_MODULES(PROJECTM, libprojectM,
+    PKG_CHECK_MODULES(PROJECTM, [projectM-4],
     [
       VLC_ADD_PLUGIN([projectm])
-      PKG_CHECK_EXISTS([libprojectM >= 2.0.0],
-        [ AC_DEFINE([HAVE_PROJECTM2], 1, [Define to 1 if using libprojectM 2.x]) ],
-        [ AC_MSG_WARN( [Using libprojectM version 1] )
+      AC_DEFINE([HAVE_PROJECTM4], 1, [Define to 1 if using libprojectM 4.x])
+    ],
+    [
+      PKG_CHECK_MODULES(PROJECTM, [libprojectM],
+      [
+        VLC_ADD_PLUGIN([projectm])
+        PKG_CHECK_EXISTS([libprojectM >= 2.0.0],
+          [ AC_DEFINE([HAVE_PROJECTM2], 1, [Define to 1 if using libprojectM 2.x]) ],
+          [ AC_MSG_WARN( [Using libprojectM version 1] ) ]
+        )
+      ],
+      [
+        AC_MSG_WARN([${PROJECTM_PKG_ERRORS}.])
       ])
-    ],[
-      AC_MSG_WARN([${PROJECTM_PKG_ERRORS}.])
     ])
   ])
 


=====================================
modules/visualization/projectm.cpp
=====================================
@@ -34,7 +34,11 @@
 #include <vlc_filter.h>
 #include <vlc_rand.h>
 
-#include <libprojectM/projectM.hpp>
+#ifdef HAVE_PROJECTM4
+# include <projectM-4/projectM.h>
+#else
+# include <libprojectM/projectM.hpp>
+#endif
 
 #ifndef _WIN32
 # include <locale.h>
@@ -282,7 +286,13 @@ static void *Thread( void *p_data )
     locale_t loc;
     locale_t oldloc;
 
+#ifdef HAVE_PROJECTM4
+    projectm_handle p_projectm; 
+#else
     projectM *p_projectm;
+#endif
+
+#ifndef HAVE_PROJECTM4
 #ifndef HAVE_PROJECTM2
     char *psz_config;
 #else
@@ -290,6 +300,7 @@ static void *Thread( void *p_data )
     char *psz_title_font;
     char *psz_menu_font;
     projectM::Settings settings;
+#endif
 #endif
 
     if( vlc_gl_MakeCurrent( gl ) != VLC_SUCCESS )
@@ -303,17 +314,23 @@ static void *Thread( void *p_data )
     oldloc = uselocale (loc);
 
     /* Create the projectM object */
+#ifdef HAVE_PROJECTM4
+    p_projectm = projectm_create();
+    projectm_set_window_size(p_projectm, 
+                             var_InheritInteger( p_filter, "projectm-width" ), 
+                             var_CreateGetInteger( p_filter, "projectm-height" ));
+#else
 #ifndef HAVE_PROJECTM2
     psz_config = var_InheritString( p_filter, "projectm-config" );
     p_projectm = new projectM( psz_config );
     free( psz_config );
 #else
     psz_preset_path = var_InheritString( p_filter, "projectm-preset-path" );
+
 #ifdef _WIN32
     if ( psz_preset_path == NULL )
         psz_preset_path = config_GetSysPath(VLC_PKG_DATA_DIR, "visualization");
 #endif
-
     psz_title_font                = var_InheritString( p_filter, "projectm-title-font" );
     psz_menu_font                 = var_InheritString( p_filter, "projectm-menu-font" );
 
@@ -340,14 +357,23 @@ static void *Thread( void *p_data )
     free( psz_title_font );
     free( psz_preset_path );
 #endif /* HAVE_PROJECTM2 */
+#endif /* HAVE_PROJECTM4 */
+
+#ifdef HAVE_PROJECTM4
+    p_sys->i_buffer_size = projectm_pcm_get_max_samples();
 
+#else
     p_sys->i_buffer_size = p_projectm->pcm()->maxsamples;
+
+#endif
     p_sys->p_buffer = (float*)calloc( p_sys->i_buffer_size,
                                       sizeof( float ) );
 
     /* Choose a preset randomly or projectM will always show the first one */
+#ifndef HAVE_PROJECTM4 
     if ( p_projectm->getPlaylistSize() > 0 )
         p_projectm->selectPreset( (unsigned)vlc_mrand48() % p_projectm->getPlaylistSize() );
+#endif
 
     /* */
     for( ;; )
@@ -359,14 +385,28 @@ static void *Thread( void *p_data )
         bool quit;
 
         if( vlc_gl_surface_CheckSize( gl, &width, &height ) )
+        {
+#ifdef HAVE_PROJECTM4
+            projectm_set_window_size( p_projectm, width, height );
+
+#else
             p_projectm->projectM_resetGL( width, height );
 
+#endif
+        }
+
         /* Render the image and swap the buffers */
         vlc_mutex_lock( &p_sys->lock );
         if( p_sys->i_nb_samples > 0 )
         {
+#ifdef HAVE_PROJECTM4
+            projectm_pcm_add_float( p_projectm, p_sys->p_buffer, p_sys->i_nb_samples, (projectm_channels)1 );
+        
+#else
             p_projectm->pcm()->addPCMfloat( p_sys->p_buffer,
                                             p_sys->i_nb_samples );
+                
+#endif
             p_sys->i_nb_samples = 0;
         }
         quit = p_sys->b_quit;
@@ -375,16 +415,28 @@ static void *Thread( void *p_data )
         if( quit )
             break;
 
+#ifdef HAVE_PROJECTM4
+        projectm_opengl_render_frame( p_projectm );
+
+#else
         p_projectm->renderFrame();
 
+#endif
+
         /* */
         vlc_tick_wait( i_deadline );
 
         vlc_gl_Swap( gl );
     }
 
+#ifdef HAVE_PROJECTM4
+    projectm_destroy( p_projectm );
+
+#else
     delete p_projectm;
 
+#endif
+
     if (loc != (locale_t)0)
     {
         uselocale (oldloc);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/13fb39ea54971deba8c52ce6eb9d635fa8c5cbfa

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/13fb39ea54971deba8c52ce6eb9d635fa8c5cbfa
You're receiving this email because of your account on code.videolan.org.




More information about the vlc-commits mailing list