Reintegrate projectM Visualizer
-
@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.
-
@Gustavo-L-Conte said in Reintegrate projectM Visualizer:
QX11Application
Did you clean the build directory, or at least delete
CMakeCache.txt
before you built with Qt 5,QX11Application
is part of Qt 6.2 and newer, it shouldn't be included anywhere with Qt 5.
Variables in CMake are cached, so it does not help to re-run cmake without deleting the cache first.
Also, you should use:-DBUILD_WITH_QT5=ON
to disable autodetecting Qt version, settingBUILD_WITH_QT6
to OFF won't do that. -
@jonas yep I tried the same trhink you did, the override in paintGL, but with projectM4 and Qt6, for me only blank screen
and yes, I realized about the flags too. From certain point I was always doing a make clean, and I was able to successfully build with Qt5,
with -DHAVE_X11_GLOBALSHORTCUTS=off(i think it was that flag) because it issued that error I pointed above; but thats not necessary now I see, if I remove the build dir.
feeling pretty dumb.
anyway, both ways for me, projectM4 or below, gives me only blank screen. I'm rebuilding right now with all combinations to test everything again
-
@jonas thanks!!!!! now visualization at least shows for me with Qt5 and projectM 3, as expected!
Gonna try things I did before but now properly cleaning the builddir LoL
-
about the v4, I think its some config missing. I'm going to double check after taking a break, all of these: (got from frontend-SDL2)
projectm_set_preset_duration(projectMWrapper.ProjectM(), _displayDuration); projectm_set_preset_locked(projectMWrapper.ProjectM(), !projectm_get_preset_locked(projectMWrapper.ProjectM())); projectm_set_beat_sensitivity(_projectMWrapper.ProjectM(), beatSensitivity); projectm_set_window_size(_projectMHandle, renderWidth, renderHeight); projectm_set_aspect_correction(_projectMHandle, aspectCorrectionEnabled); projectm_set_window_size(_projectM, canvasWidth, canvasHeight); projectm_set_fps(_projectM, fps); projectm_set_mesh_size(_projectM, _projectMConfigView->getInt("meshX", 48), _projectMConfigView->getInt("meshY", 32)); projectm_set_aspect_correction(_projectM, _projectMConfigView->getBool("aspectCorrectionEnabled", true)); projectm_set_preset_locked(_projectM, _projectMConfigView->getBool("presetLocked", false)); projectm_set_preset_duration(_projectM, _projectMConfigView->getDouble("displayDuration", 30.0)); projectm_set_soft_cut_duration(_projectM, _projectMConfigView->getDouble("transitionDuration", 3.0)); projectm_set_hard_cut_enabled(_projectM, _projectMConfigView->getBool("hardCutsEnabled", false)); projectm_set_hard_cut_duration(_projectM, _projectMConfigView->getDouble("hardCutDuration", 20.0)); projectm_set_hard_cut_sensitivity(_projectM, static_cast<float>(_projectMConfigView->getDouble("hardCutSensitivity", 1.0))); projectm_set_beat_sensitivity(_projectM, static_cast<float>(_projectMConfigView->getDouble("beatSensitivity", 1.0))); projectm_set_texture_search_paths(_projectM, texturePathList.data(), texturePaths.size()); projectm_set_fps(_projectM, static_cast<uint32_t>(std::round(fps))); projectm_set_mesh_size(_projectM, _projectMConfigView->getInt("meshX", 220), _projectMConfigView->getInt("meshY", 125)); projectm_set_beat_sensitivity(_projectM, projectm_get_beat_sensitivity(_projectM) + value); projectm_set_preset_locked(_projectM, _projectMConfigView->getBool("presetLocked", false)); projectm_set_aspect_correction(_projectM, _projectMConfigView->getBool("aspectCorrectionEnabled", true)); projectm_set_preset_duration(_projectM, _projectMConfigView->getDouble("displayDuration", 30.0)); projectm_set_soft_cut_duration(_projectM, _projectMConfigView->getDouble("transitionDuration", 3.0)); projectm_set_aspect_correction(_projectM, _projectMConfigView->getBool("hardCutsEnabled", false)); projectm_set_hard_cut_duration(_projectM, _projectMConfigView->getDouble("hardCutDuration", 20.0)); projectm_set_hard_cut_sensitivity(_projectM, static_cast<float>(_projectMConfigView->getDouble("hardCutSensitivity", 1.0))); projectm_set_mesh_size(_projectM, _projectMConfigView->getUInt64("meshX", 48), _projectMConfigView->getUInt64("meshY", 32));
-
If I add a call to
projectm_playlist_play_next
orprojectm_playlist_set_position
, it crashes onprojectm_opengl_render_frame
. -
Which makes me think it wasn't trying to render any visualization, because it wasn't set before.