Reintegrate projectM Visualizer
-
Hi,
I'm a maintainer of the projectM visualizer library. We've been working on making projectM better in many ways over the past two years or so, and finally released a new major version (4.0) back in April '23. This new version fixed a few bugs and improved the rendering quality, but was mainly focused on rewriting the build system (now only using CMake) and creating a proper API. libprojectM now supports building as a shared library on all platforms, and has a stable and clean C API instead of requiring direct access to the internal C++ code, which was a big issue for devs in all previous releases.
Clementine used a forked copy of a very old projectM version, which was never updated and had numerous bugs and performance issues, so removing it from Strawberry was surely a good thing. Yet I think many users would like to have a visualizer again, and with the upcoming 4.1 release projectM will be (mostly) compatible with the latest Milkdrop release, support previously unimplemented preset features like loops and megabuf.
The API won't change between 4.0 and 4.1, so if anyone has time to integrate it into Strawberry, you may start right away. If there are any questions, head over to our Discord or post in our GitHub discussion board, I'll be notified there. I try to check this forum from time to time, but expect longer delays here.
-
Hi, @kblaschke
I, for one, would love to have this visualisation implemented into Strawberry. That's what would give it that additional oomph. Clementine indeed had an inferior version of ProjectM. so I'm delighted to see that development is continuing.
I sadly am not (yet) capable of undergoing a complex task such as adding ProjectM to Strawberry, but here's to hoping that there is a willing, competent enthusiast out there. If anyone has experience with visualisation tools or software development, your contribution could make a significant difference.
Here is the most obvious resource for anyone interested:
https://github.com/projectM-visualizer/projectm/wiki -
That's something I'd really like to happen so I'm on it
the logic behind my promise is a little fuzzy: Give me a little bit of time.... since bits are just one's or zero's, "a little bit" is quite controversial.. LoLanyway
let's do this !
-
@kblaschke Sorry for the clueless question, but... what does it do? I have followed like 10 links from the wiki of the project hoping to see a screenshot, but to no avail.
Thx!
-
@tagomago Maybe this helps? https://github.com/projectM-visualizer/projectm
-
Well, this will be much harder than I tought.
I started last week to read the integration tutorial from projectM
I don't think we could integrate into strawberry as a widget
IT requires, per example, an OpenGL context. Also, it would require to be programmed in a completely different way that the other analyzers are functioning right now. dunno.
And I think that if this would be rendered into last say, another window
then ppl could just run projectM-SDL together with the music playerWhen I have more time I'll dive into this. It would really be an awesome feature.
-
@Jellby It did, thank you!!
-
If someone is familiar with Qt and OpenGL and want to resolve this, then it might be a chance it can be added.
https://github.com/strawberrymusicplayer/strawberry/pull/1467
-
(gdb) bt #0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 #1 0x00007ffff4094a63 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78 #2 0x00007ffff4041176 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x00007ffff4028917 in __GI_abort () at abort.c:79 #4 0x00007ffff44adc4d in __gnu_cxx::__verbose_terminate_handler() () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:95 #5 0x00007ffff44bf21c in __cxxabiv1::__terminate(void (*)()) (handler=<optimized out>) at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48 #6 0x00007ffff44ad7f5 in std::terminate() () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:58 #7 0x00007ffff44bf4a8 in __cxxabiv1::__cxa_throw(void*, std::type_info*, void (*)(void*)) (obj=<optimized out>, tinfo=0x7ffff4648d78 <typeinfo for std::logic_error>, dest=0x7ffff44d3730 <std::logic_error::~logic_error()>) at ../../../../libstdc++-v3/libsupc++/eh_throw.cc:98 #8 0x00007ffff44b035c in std::__throw_logic_error(char const*) (__s=__s@entry=0x7ffff47c1280 "basic_string: construction from null is not valid") at ../../../../../libstdc++-v3/src/c++11/functexcept.cc:70 #9 0x00007ffff472bfe2 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) [clone .part.0] [clone .lto_priv.0] (__a=<optimized out>, __s=<optimized out>, this=<optimized out>) at /usr/include/c++/13/bits/basic_string.h:646 #10 0x00007ffff479848d in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (__a=<optimized out>, __s=<optimized out>, this=0x7fffffffa4d0) at Renderer/StaticGlShaders.cpp:845 #11 StaticGlShaders::QueryGlslVersion() (this=this@entry=0x510bc20) at Renderer/StaticGlShaders.cpp:789 #12 0x00007ffff47984c9 in StaticGlShaders::StaticGlShaders(bool) (this=0x510bc20, use_gles=<optimized out>, this=<optimized out>, use_gles=<optimized out>) at Renderer/StaticGlShaders.cpp:756 #13 0x00007ffff4781693 in StaticGlShaders::Get() () at Renderer/StaticGlShaders.h:18 #14 0x00007ffff4781796 in ShaderEngine::ShaderEngine() (this=0x51351a0, this=<optimized out>) at Renderer/ShaderEngine.cpp:25 #15 0x00007ffff4781d51 in Renderer::Renderer(int, int, int, int, BeatDetect*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (this=this@entry=0x5134fa0, width=width@entry=512, height=height@entry=512, gx=gx@entry=32, gy=gy@entry=24, _beatDetect=0x50fab70, _presetURL="/usr/share/projectM/presets", _titlefontURL="", _menufontURL="", datadir="", this=<optimized out>, width=<optimized out>, height=<optimized out>, gx=<optimized out>, gy=<optimized out>, _beatDetect=<optimized out>, _presetURL=Python Exception <class 'gdb.error'>: value has been optimized out , _titlefontURL=Python Exception <class 'gdb.error'>: value has been optimized out , _menufontURL=Python Exception <class 'gdb.error'>: value has been optimized out , datadir=<optimized out>) at Renderer/Renderer.cpp:160 #16 0x00007ffff473d36d in projectM::projectM_init(int, int, int, int, int, int) (this=this@entry=0x50fa710, gx=32, gy=24, fps=35, texsize=<optimized out>, width=512, height=512) at /usr/src/debug/projectm-3.1.12/src/libprojectM/projectM.cpp:568 #17 0x00007ffff473f32c in projectM::readSettings(projectM::Settings const&) (this=this@entry=0x50fa710, settings=...) at /usr/src/debug/projectm-3.1.12/src/libprojectM/projectM.cpp:278 #18 0x00007ffff473f4d1 in projectM::projectM(projectM::Settings, int) (this=0x50fa710, settings=..., flags=0, this=<optimized out>, settings=..., flags=<optimized out>) at /usr/src/debug/projectm-3.1.12/src/libprojectM/projectM.cpp:130 #19 0x0000000000dc7f65 in std::make_unique<projectM, projectM::Settings&>(projectM::Settings&) () at /usr/include/c++/13/bits/unique_ptr.h:1070 #20 0x0000000000dc60ae in ProjectMVisualisation::InitProjectM() (this=0x506a8a0) at /home/jonas/Projects/strawberry/strawberry/src/visualisations/projectmvisualisation.cpp:115 #21 0x0000000000dc6618 in ProjectMVisualisation::drawBackground(QPainter*, QRectF const&) (this=0x506a8a0, p=0x7fffffffb190, rect=...) at /home/jonas/Projects/strawberry/strawberry/src/visualisations/projectmvisualisation.cpp:140 #22 0x00007ffff6b782a7 in QGraphicsView::drawBackground(QPainter*, QRectF const&) (this=<optimized out>, painter=0x7fffffffb190, rect=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/graphicsview/qgraphicsview.cpp:3716 #23 0x00007ffff6b7bafa in operator()() const (__closure=__closure@entry=0x7fffffffb1c0) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/graphicsview/qgraphicsview.cpp:3481 #24 0x00007ffff6b7f4d1 in QGraphicsView::paintEvent(QPaintEvent*) (this=0x4fc6b50, event=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/graphicsview/qgraphicsview.cpp:3570 #25 0x00007ffff67f5db2 in QWidget::event(QEvent*) (this=this@entry=0x4fc6b50, event=event@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:9112 #26 0x00007ffff688aa96 in QFrame::event(QEvent*) (this=this@entry=0x4fc6b50, e=e@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/widgets/qframe.cpp:521 #27 0x00007ffff6888310 in QAbstractScrollArea::viewportEvent(QEvent*) (this=this@entry=0x4fc6b50, e=e@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/widgets/qabstractscrollarea.cpp:1064 #28 0x00007ffff6b7e395 in QGraphicsView::viewportEvent(QEvent*) (this=0x4fc6b50, event=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/graphicsview/qgraphicsview.cpp:2936 #29 0x00007ffff6888a87 in QAbstractScrollAreaPrivate::viewportEvent(QEvent*) (event=<optimized out>, this=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/widgets/qabstractscrollarea_p.h:74 #30 QAbstractScrollAreaFilter::eventFilter(QObject*, QEvent*) (this=<optimized out>, o=<optimized out>, e=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/widgets/qabstractscrollarea_p.h:85 #31 0x00007ffff5363722 in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) (receiver=receiver@entry=0x4eaaf10, event=event@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qcoreapplication.cpp:1293 #32 0x00007ffff679a1b9 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=this@entry=0x167e3f0, receiver=receiver@entry=0x4eaaf10, e=e@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qapplication.cpp:3288 #33 0x00007ffff679ffdb in QApplication::notify(QObject*, QEvent*) (this=0x7fffffffcba0, receiver=0x4eaaf10, e=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qapplication.cpp:3241 #34 0x00007ffff5363b5b in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=receiver@entry=0x4eaaf10, event=event@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qcoreapplication.cpp:1154 #35 0x00007ffff5363c5d in QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) (receiver=receiver@entry=0x4eaaf10, event=event@entry=0x7fffffffb680) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qcoreapplication.cpp:1612 #36 0x00007ffff67ede41 in QWidgetPrivate::sendPaintEvent(QRegion const&) (this=this@entry=0x50c32d0, toBePainted=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:5655 #37 0x00007ffff67eec46 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (this=this@entry=0x50c32d0, pdev=pdev@entry=0x50f8530, rgn=..., offset=..., flags=flags@entry=..., sharedPainter=sharedPainter@entry=0x0, repaintManager=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:5605 #38 0x00007ffff67ef5d2 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (this=this@entry=0x50b6a80, pdev=pdev@entry=0x50f8530, siblings=..., index=<optimized out>, rgn=..., offset=..., flags=..., sharedPainter=0x0, repaintManager=0x50e7990) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:5784 #39 0x00007ffff67eef2f in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (this=this@entry=0x50b6a80, pdev=<optimized out>, rgn=..., offset=..., flags=..., flags@entry=..., sharedPainter=sharedPainter@entry=0x0, repaintManager=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:5646 #40 0x00007ffff6804d9a in QWidgetRepaintManager::paintAndFlush() (this=this@entry=0x50e7990) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidgetrepaintmanager.cpp:907 #41 0x00007ffff6805044 in QWidgetRepaintManager::sync(QWidget*, QRegion const&) (this=0x50e7990, exposedWidget=0x4fc6b50, exposedRegion=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidgetrepaintmanager.cpp:632 #42 0x00007ffff67ef261 in QWidgetPrivate::syncBackingStore(QRegion const&) (this=this@entry=0x50b6a80, region=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidget.cpp:1774 #43 0x00007ffff680d103 in QWidgetWindow::handleExposeEvent(QExposeEvent*) (this=this@entry=0x50e7070, event=event@entry=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidgetwindow.cpp:1029 #44 0x00007ffff680d83f in QWidgetWindow::event(QEvent*) (this=0x50e7070, event=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qwidgetwindow.cpp:342 #45 0x00007ffff679a1c9 in QApplicationPrivate::notify_helper(QObject*, QEvent*) (this=this@entry=0x167e3f0, receiver=receiver@entry=0x50e7070, e=e@entry=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qapplication.cpp:3294 #46 0x00007ffff67a192d in QApplication::notify(QObject*, QEvent*) (this=0x7fffffffcba0, receiver=0x50e7070, e=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/widgets/kernel/qapplication.cpp:3245 #47 0x00007ffff5363b5b in QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=receiver@entry=0x50e7070, event=event@entry=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qcoreapplication.cpp:1154 #48 0x00007ffff5363c5d in QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) (receiver=receiver@entry=0x50e7070, event=event@entry=0x7fffffffc110) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qcoreapplication.cpp:1612 #49 0x00007ffff5dc7ddc in QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent*) (e=0x510f1b0) at /home/jonas/Projects/Qt/qtbase/qtbase/src/gui/kernel/qguiapplication.cpp:3394 #50 0x00007ffff5dc8b58 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) (e=e@entry=0x510f1b0) at /home/jonas/Projects/Qt/qtbase/qtbase/src/gui/kernel/qguiapplication.cpp:2190 #51 0x00007ffff5e2989a in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) (flags=flags@entry=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/gui/kernel/qwindowsysteminterface.cpp:1114 #52 0x00007fffef9866c4 in xcbSourceDispatch(GSource*, GSourceFunc, gpointer) (source=<optimized out>) at /home/jonas/Projects/Qt/qtbase/qtbase/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp:57 #53 0x00007ffff491e740 in g_main_dispatch (context=0x16cde10) at ../glib/gmain.c:3344 #54 g_main_context_dispatch_unlocked (context=context@entry=0x16cde10) at ../glib/gmain.c:4152 #55 0x00007ffff4920388 in g_main_context_iterate_unlocked (context=context@entry=0x16cde10, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4217 #56 0x00007ffff4920a3c in g_main_context_iteration (context=0x16cde10, may_block=1) at ../glib/gmain.c:4282 #57 0x00007ffff55e8465 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x1728d60, flags=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:395 #58 0x00007fffef986a94 in QXcbGlibEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=<optimized out>, flags=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp:96 --Type <RET> for more, q to quit, c to continue without paging-- #59 0x00007ffff536e044 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=this@entry=0x7fffffffc430, flags=flags@entry=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/kernel/qeventloop.cpp:100 #60 0x00007ffff536e88b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=this@entry=0x7fffffffc430, flags=flags@entry=...) at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/global/qflags.h:34 #61 0x00007ffff53673e5 in QCoreApplication::exec() () at /home/jonas/Projects/Qt/qtbase/qtbase/src/corelib/global/qflags.h:74 #62 0x00000000004b38e6 in main(int, char**) (argc=1, argv=0x7fffffffd668) at /home/jonas/Projects/strawberry/strawberry/src/main.cpp:322
-
I managed to fix the crash by moving the Init function to the constructor. But the animations still doesn't look right.
-
@jonas way to go!!!!! That was fast. I got sick in bed these days just saw that right now.
Have you tried forcing 44100 Hz sample rate?
Here my projectMSDL only runs like this:
Recording audio from device "Default capturing device" (ID -1).
Opened audio recording device "System default capturing device" (ID -1) with 2 channels at 44100 Hz. -
@Gustavo-L-Conte
It wasn't as fast as I thought, I thought it would be easier to just port the code from Clementine, but turns out there are two issues,QGLWidget
being deprecated, and projectm API completely changed to a plain C API in version 4.
All projectm visualizations works fine when I use Qt 5 withQGLWidget
. But once I switch toQOpenGLWidget
, only some visualizations work correctly, same issue with both Qt 5 and 6.And for ProjectM, everything works fine with version 3, I've added support for version 4 to by using ifdef's in the code, but nothing works yet, I'm missing some things, like what replaces
projectM_resetGL
inProjectMVisualisation::SceneRectChanged
, I don't see anything.The songs I'm testing with are already 44100Hz/16bit. Also the buffer is converted to 16 bit anyway in
GstEnginePipeline::BufferProbeCallback
, so I don't think that's an issue.Anyway, it took a lot longer to do this than anticipated, so if you or someone else wants to look into it, it would be appreciated. The main issue now is getting it to work with,
QOpenGLWidget
, if that's fixed then we can merge the code without the projectm 4 support. -
Might be worth to mention, no Linux distros seem to have projectm version 4 yet, so it's not a major issue if we continue to use version 3 for a while longer.
-
@jonas I started to fiddle with this last week, got into some issues.... first of all It looks like I need Qt 5.6 to compile it, have to get it so I can test the Qt 5 part, as Ubuntu still has 5.3 even on 24.04 LTS
Using libprojectM 4 and Qt6, it segfaults exactly when it is supposed to start rendering to the opengl context. It looks like if it initializes it, but when AddBufferConsumer gets triggered, when data is supposed to arrive and draw to the screen, it segfaults. I still have no clue but I'm trying to understand; I saw something about this:
QOpenGLWidget::makeCurrent(): This function makes the context associated with a QOpenGLWidget the current context for rendering. This is analogous to "setting" the context.
and also doneCurrent(), I believe this is missing but i'm not sure how to implement due to the inheritance of the visualizercontainer class
-
Qt 5.6 is ancient, do you mean Qt 6.5?
I tested with Qt 5.15.14 and the latest Qt 6 (dev) code.
Turns out that the issue I'm seeing with QOpenGLWidget is known to projectm:
https://github.com/orgs/projectM-visualizer/discussions/820#discussioncomment-9864556
-
@jonas its strange indeed, I believe to already have compiled strawberry against qt 5 before.... but maybe not. Inspecting, I see I kinda have qt 5.15 here
~/strawberry$ qmake -v QMake version 3.1 Using Qt version 5.15.13 in /usr/lib/x86_64-linux-gnu
qtbase5-dev/noble,now 5.15.13+dfsg-1ubuntu1 amd64 [installed] Qt 5 base development files
So indeed, I'm crazy, I was sick as hell when I tought to have Qt 5.3, I saw the wrong version and that sticked to my head, I double checked and of course, its not Qt 5.1 or 5.3 its 5. 15 !!!! Just shoot me.
The error I receive with -DBUILD_WITH_QT6=off is this:
strawberry/src/globalshortcuts/globalshortcut-x11.cpp:56:7: error: โQNativeInterfaceโ has not been declared 56 | if (QNativeInterface::QX11Application *x11_app = qApp->nativeInterface<QNativeInterface::QX11Application>()) { | ^~~~~~~~~~~~~~~~
QNativeInterface, Which first appeared in Qt 5.6, thats the huge mess I made, sorry.
The error has nothing to do with Qt versions anyway. Maybe some typo in ifdefs? or missing headers? This is from a fresh master clone.About the issue in QOpenGLWidget,
since we are spawning a new window, we could use SDL2 instead just for that.. could we?Strange that for you and other ppl the rendering becomes garbage, for me it plain segfaults as soon as it tries to render ( libprojectM 4, Qt 6 )
I have onboard INTEL graphics
-
This post is deleted! -
@jonas look at this, this problem is not new at all!!!
-
I've tested without
QGraphicsScene
and I'm having the same issue.
MakingProjectMVisualization
inheritpublic QOpenGLWidget, protected QOpenGLFunctions, public GstBufferConsumer
Then i override
paintGL
like this:void ProjectMVisualization::paintGL() { QPainter p(this); p.beginNativePainting(); #ifdef HAVE_PROJECTM4 if (projectm_instance_) { projectm_set_window_size(projectm_instance_, width() * pixel_ratio_, height() * pixel_ratio_); projectm_opengl_render_frame(projectm_instance_); } #else projectm_->projectM_resetGL(width() * pixel_ratio_, height() * pixel_ratio_); projectm_->renderFrame(); #endif p.endNativePainting(); update(); }
-
Here is how it some look, just so we are talking about the same thing:
This is with ProjectM3, with version 4 I still have no luck.