Skip to content

Fix scrolling waveform regressions#14470

Merged
acolombier merged 6 commits intomixxxdj:mainfrom
acolombier:fix/scrolling-waveform-regression
Mar 24, 2025
Merged

Fix scrolling waveform regressions#14470
acolombier merged 6 commits intomixxxdj:mainfrom
acolombier:fix/scrolling-waveform-regression

Conversation

@acolombier
Copy link
Copy Markdown
Member

@acolombier acolombier commented Mar 11, 2025

Fixes #14464, #14453, #14469 and #14467

@acolombier acolombier requested a review from ronso0 March 11, 2025 21:24
@acolombier
Copy link
Copy Markdown
Member Author

@uklotzde could you please let me know if this fixes your issue?

@uklotzde
Copy link
Copy Markdown
Contributor

Thank you! Almost fixes the issues I reported.

Enabling and disabling the new overlays in the preference dialog still doesn't work correctly, i.e. they remain enabled even after removing the checkbox mark. At least one of them. Restarting Mixxx fixes this inconsistency.

@acolombier
Copy link
Copy Markdown
Member Author

Is that behaviour consistent on all themes? Or only specific ones? This seems to be working fine on PaleMoon

@uklotzde
Copy link
Copy Markdown
Contributor

Just try it on Deere:

Screencast.From.2025-03-12.00-27-23.mp4

The wrong behavior is obvious and reproducible.

@uklotzde
Copy link
Copy Markdown
Contributor

uklotzde commented Mar 11, 2025

The last marker stays enabled remains visible when trying to disable both of them.

@acolombier
Copy link
Copy Markdown
Member Author

acolombier commented Mar 11, 2025

@PPN-SD could you tell me if the latest commit fixes your build issue?

Sorry Uwe, the overlay is indeed still broken across the board. Looking now.

@acolombier
Copy link
Copy Markdown
Member Author

@uklotzde hopefully this is now fully fixed!

@PPN-SD
Copy link
Copy Markdown
Contributor

PPN-SD commented Mar 11, 2025

@PPN-SD could you tell me if the latest commit fixes your build issue?

Extreme fix, solved ;-)

@uklotzde
Copy link
Copy Markdown
Contributor

@uklotzde hopefully this is now fully fixed!

Works perfectly now 💯

@acolombier
Copy link
Copy Markdown
Member Author

Thanks for testing! @ronso0 could you also confirm #14467 is fixed?

@ronso0
Copy link
Copy Markdown
Member

ronso0 commented Mar 12, 2025

Yes, works as expected now, thanks for the quick fix!

#14465 still happens though 😢 when I switch to Stacked
image
image

Backtrace of thread
Thread 1 (Thread 0x7fffea675100 (LWP 15245) "mixxx"):
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {4096, 140737488341008, 140737488341168, 504, 4294967295, 140737260560953, 512, 93825452952976, 0, 0, 0, 16831747469898763008, 140737488341472, 0, 8, 140737488341120}}
        pid = <optimized out>
        tid = <optimized out>
#1  0x00007ffff1e6f859 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = 0x7fffffffc9b0, sa_sigaction = 0x7fffffffc9b0}, sa_mask = {__val = {2, 140737488341424, 140737488341856, 140737488341536, 93824996817263, 20142, 140737258971356, 93825456423120, 93825456423136, 252, 16831747469898763008, 3, 140737488341536, 140737488341856, 140737258971497, 93825456423120}}, sa_flags = 1013271296, sa_restorer = 0x7fffffffce60}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00007ffff2516af8 in  () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#3  0x000055555647e658 in mixxx::(anonymous namespace)::handleMessage(QtMsgType, QMessageLogContext const&, QString const&) (type=QtCriticalMsg, context=..., input=...) at src/util/logging.cpp:372
        levelName = <optimized out>
        writeFlags = {i = <optimized out>}
        isDebugAssert = <optimized out>
        categoryName = {d = {d = 0x555570de73a0, ptr = 0x555570de73b0 u"default", size = 7}, static _empty = 0 u'\000'}
        __PRETTY_FUNCTION__ = "void mixxx::{anonymous}::handleMessage(QtMsgType, const QMessageLogContext&, const QString&)"
#4  0x00007ffff253e04b in  () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#5  0x00007ffff253e169 in  () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#6  0x00007ffff2516fe9 in QMessageLogger::critical(char const*, ...) const () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#7  0x0000555556671651 in mixxx_debug_assert(char const*, char const*, int, char const*) (function=0x5555559a44b8 "bool allshader_gl::WaveformRendererFiltered::preprocessInner()", line=191, file=0x555555940d50 "./src/waveform/renderers/allshader/waveformrendererfiltered.cpp", assertion=0x5555559b1710 "reserved == vertexUpdater[0].index() + vertexUpdater[1].index() + vertexUpdater[2].index()") at src/rendergraph/opengl/../common/rendergraph/../../../util/assert.h:9
        dataSize = <optimized out>
        data = <optimized out>
        stemInfo = {<QListSpecialMethods<StemInfo>> = {<QListSpecialMethodsBase<StemInfo>> = {<No data fields>}, <No data fields>}, d = {d = 0x0, ptr = 0x0, size = 0}}
        devicePixelRatio = <optimized out>
        length = <optimized out>
        pixelLength = 1119
        invDevicePixelRatio = 1
        halfPixelSize = 0.5
        visualFramesSize = <optimized out>
        firstVisualFrame = <optimized out>
        visualIncrementPerPixel = <optimized out>
        allGain = 3.4000001
        bandGain = {1, 1, 1}
        breadth = <optimized out>
        halfBreadth = 37
        heightFactor = 0.493333369
        xVisualFrame = <optimized out>
        numVerticesPerLine = 6
        reserved = 20148
        rgb = {{v = {1, <optimized out>, 0}}, {v = {0, <optimized out>, 0}}, {v = {0, <optimized out>, <optimized out>}}}
        vertexUpdater = {{m_pData = <optimized out>, m_pWrite = <optimized out>}, {m_pData = <optimized out>, m_pWrite = <optimized out>}, {m_pData = <optimized out>, m_pWrite = <optimized out>}}
        maxSamplingRange = 0
        __PRETTY_FUNCTION__ = "bool allshader_gl::WaveformRendererFiltered::preprocessInner()"
#8  allshader_gl::WaveformRendererFiltered::preprocessInner() (this=<optimized out>) at src/waveform/renderers/allshader/waveformrendererfiltered.cpp:191
        dataSize = <optimized out>
        data = <optimized out>
        stemInfo = {<QListSpecialMethods<StemInfo>> = {<QListSpecialMethodsBase<StemInfo>> = {<No data fields>}, <No data fields>}, d = {d = 0x0, ptr = 0x0, size = 0}}
        devicePixelRatio = <optimized out>
        length = <optimized out>
        pixelLength = 1119
        invDevicePixelRatio = 1
        halfPixelSize = 0.5
        visualFramesSize = <optimized out>
        firstVisualFrame = <optimized out>
        visualIncrementPerPixel = <optimized out>
        allGain = 3.4000001
        bandGain = {1, 1, 1}
        breadth = <optimized out>
        halfBreadth = 37
        heightFactor = 0.493333369
        xVisualFrame = <optimized out>
        numVerticesPerLine = 6
        reserved = 20148
        rgb = {{v = {1, <optimized out>, 0}}, {v = {0, <optimized out>, 0}}, {v = {0, <optimized out>, <optimized out>}}}
        vertexUpdater = {{m_pData = <optimized out>, m_pWrite = <optimized out>}, {m_pData = <optimized out>, m_pWrite = <optimized out>}, {m_pData = <optimized out>, m_pWrite = <optimized out>}}
        maxSamplingRange = 0
        __PRETTY_FUNCTION__ = "bool allshader_gl::WaveformRendererFiltered::preprocessInner()"
#9  0x0000555556671024 in non-virtual thunk to allshader_gl::WaveformRendererFiltered::preprocess() () at src/waveform/renderers/allshader/waveformrendererfiltered.h:22
#10 0x000055555692a725 in rendergraph_gl::Engine::preprocess() (this=<optimized out>) at src/rendergraph/opengl/engine.cpp:72
        pNode = <optimized out>
        __for_range = <optimized out>
#11 0x0000555556684b80 in allshader_gl::WaveformWidget::paintGL() (this=0x55557100a6d0) at /usr/include/c++/13/bits/unique_ptr.h:199
#12 0x0000555556686232 in OpenGLWindow::resizeGL(int, int) (this=0x555567ec8c10, w=1119, h=74) at src/widget/openglwindow.cpp:50
#13 0x00007ffff2c6c868 in QWindow::event(QEvent*) () at /lib/x86_64-linux-gnu/libQt6Gui.so.6
#14 0x00007ffff2c40e83 in QPaintDeviceWindow::event(QEvent*) () at /lib/x86_64-linux-gnu/libQt6Gui.so.6
#15 0x000055555668656e in OpenGLWindow::event(QEvent*) (this=0x555567ec8c10, pEv=0x7fffffffd480) at src/widget/openglwindow.cpp:70
        t = QEvent::Resize
        result = <optimized out>
        __PRETTY_FUNCTION__ = "virtual bool OpenGLWindow::event(QEvent*)"
#16 0x00007ffff6f31fb6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt6Widgets.so.6
#17 0x00007ffff6f3c410 in QApplication::notify(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt6Widgets.so.6
#18 0x0000555556175323 in MixxxApplication::notify(QObject*, QEvent*) (this=0x7fffffffd900, pTarget=0x555567ec8c10, pEvent=0x7fffffffd480) at src/mixxxapplication.cpp:209
        time = {m_startTime = std::chrono::_V2::steady_clock time_point = { 4242240905455ns }, static kStoppedTimerValue = {__d = std::chrono::duration = { -9223372036854775808ns }}}
        ret = <optimized out>
        __PRETTY_FUNCTION__ = "virtual bool MixxxApplication::notify(QObject*, QEvent*)"
#19 0x00007ffff25ce830 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#20 0x00007ffff2c2b288 in QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent*) () at /lib/x86_64-linux-gnu/libQt6Gui.so.6
#21 0x00007ffff2c2b588 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /lib/x86_64-linux-gnu/libQt6Gui.so.6
#22 0x00007ffff2c7030c in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt6Gui.so.6
#23 0x00007fffea01dc2e in  () at /usr/lib/x86_64-linux-gnu/qt6/plugins/platforms/../../../libQt6XcbQpa.so.6
#24 0x00007ffff592b17d in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#25 0x00007ffff592b400 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#26 0x00007ffff592b4a3 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#27 0x00007ffff280c708 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#28 0x00007ffff25daeeb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#29 0x00007ffff25d6d13 in QCoreApplication::exec() () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#30 0x00005555559ee47e in (anonymous namespace)::runMixxx (args=<optimized out>, pApp=0x7fffffffd900) at src/main.cpp:114
        mainWindow = {<QMainWindow> = {<No data fields>}, static staticMetaObject = {d = {superdata = {direct = 0x7ffff74ff200 <QMainWindow::staticMetaObject>}, stringdata = 0x5555558f7ea0 <qt_meta_stringdata_MixxxMainWindow>, data = 0x5555558f7bc0 <qt_meta_data_MixxxMainWindow>, static_metacall = 0x55555618f820 <MixxxMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x5555569578a0 <qt_incomplete_metaTypeArray<qt_meta_stringdata_MixxxMainWindow_t, QtPrivate::TypeAndForceComplete<MixxxMainWindow, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<int, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<int, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<bool, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<int, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<bool, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<bool, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<bool, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<std::shared_ptr<Track>, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<int, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<QString const&, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<mixxx::preferences::constants::Tooltips, std::integral_constant<bool, false> > >>, extradata = 0x0}}, m_pCoreServices = std::shared_ptr<class mixxx::CoreServices> (use count 2, weak count 0) = {get() = 0x555556b93890}, m_pCentralWidget = 0x555567ab5c70, m_pLaunchImage = 0x0, m_prevState = {i = 0}, m_pSkinLoader = std::shared_ptr<class mixxx::skin::SkinLoader> (use count 2, weak count 0) = {get() = 0x5555571caac0}, m_pGuiTick = 0x5555572b6c70, m_pVisualsManager = 0x555556ba0420, m_pMenuBar = {m_ptr = 0x555556d4df50}, m_supportsGlobalMenuBar = true, m_inRebootMixxxView = false, m_pDeveloperToolsDlg = 0x0, m_pPrefDlg = 0x555566db5f90, m_pKeywheel = {m_ptr = 0x0}, m_toolTipsCfg = mixxx::preferences::constants::Tooltips::On, m_inhibitScreensaver = (mixxx::preferences::constants::ScreenSaver::On | mixxx::preferences::constants::ScreenSaver::OnPlay | unknown: 0x74), m_skinCreatedControls = {q_hash = {d = 0x555567ab5880}}}
        exitCode = <optimized out>
        console = {<No data fields>}
        args = <optimized out>
        app = {<QApplication> = {<No data fields>}, static staticMetaObject = {d = {superdata = {direct = 0x7ffff74f3960 <QApplication::staticMetaObject>}, stringdata = 0x5555558f7b40 <qt_meta_stringdata_MixxxApplication>, data = 0x5555558f7b00 <qt_meta_data_MixxxApplication>, static_metacall = 0x555556173ce0 <MixxxApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x555556957498 <qt_incomplete_metaTypeArray<qt_meta_stringdata_MixxxApplication_t, QtPrivate::TypeAndForceComplete<MixxxApplication, std::integral_constant<bool, true> > >>, extradata = 0x0}}, m_rightPressedButtons = 0, m_pTouchShift = 0x0, m_isDeveloper = true}
        __PRETTY_FUNCTION__ = "int main(int, char**)"
        exitCode = <optimized out>
#31 main(int, char**) (argc=<optimized out>, argv=<optimized out>) at src/main.cpp:284
        console = {<No data fields>}
        args = <optimized out>
        app = {<QApplication> = {<No data fields>}, static staticMetaObject = {d = {superdata = {direct = 0x7ffff74f3960 <QApplication::staticMetaObject>}, stringdata = 0x5555558f7b40 <qt_meta_stringdata_MixxxApplication>, data = 0x5555558f7b00 <qt_meta_data_MixxxApplication>, static_metacall = 0x555556173ce0 <MixxxApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x555556957498 <qt_incomplete_metaTypeArray<qt_meta_stringdata_MixxxApplication_t, QtPrivate::TypeAndForceComplete<MixxxApplication, std::integral_constant<bool, true> > >>, extradata = 0x0}}, m_rightPressedButtons = 0, m_pTouchShift = 0x0, m_isDeveloper = true}
        __PRETTY_FUNCTION__ = "int main(int, char**)"
        exitCode = <optimized out>

@acolombier acolombier force-pushed the fix/scrolling-waveform-regression branch 2 times, most recently from 25bda76 to 8342de4 Compare March 12, 2025 20:17
@acolombier
Copy link
Copy Markdown
Member Author

@ronso0 I think we should be go now!

@ronso0
Copy link
Copy Markdown
Member

ronso0 commented Mar 13, 2025

Yup, looks good 👍
No assert hit anymore, no matter which type/options configuration I use.

Who can do a code review? @Swiftb0y @fwcd maybe?

@ronso0
Copy link
Copy Markdown
Member

ronso0 commented Mar 13, 2025

Btw I still see a lot of
warning [Main] WaveformRendererTextured::createFrameBuffer - frame buffer not valid
Presumably for visuals where no track is loaded? (with LateNight btw)

@jospezial
Copy link
Copy Markdown

This PR does not fix #14122

@acolombier
Copy link
Copy Markdown
Member Author

Btw I still see a lot of warning [Main] WaveformRendererTextured::createFrameBuffer - frame buffer not valid Presumably for visuals where no track is loaded? (with LateNight btw)

This will need further exploration. Is it just a warning message or is there visual regressions as well?

This PR does not fix #14122

Indeed, please read the PR's description. This PR aims to fix 4 bugs, and the one you linked isn't part of it.

@acolombier
Copy link
Copy Markdown
Member Author

Friendly ping to @mixxxdj/developers - this is a blocker to 2.6

@ronso0
Copy link
Copy Markdown
Member

ronso0 commented Mar 15, 2025

Btw I still see a lot of warning [Main] WaveformRendererTextured::createFrameBuffer - frame buffer not valid Presumably for visuals where no track is loaded? (with LateNight btw)

This will need further exploration. Is it just a warning message or is there visual regressions as well?

It's just a warning. No track loaded and I don't see any glitches in the empty waveform box.

@uklotzde
Copy link
Copy Markdown
Contributor

Btw I still see a lot of warning [Main] WaveformRendererTextured::createFrameBuffer - frame buffer not valid Presumably for visuals where no track is loaded? (with LateNight btw)

No warnings on Deere.

This PR should be merged ASAP to fix main.

@JoergAtGithub
Copy link
Copy Markdown
Member

Btw I still see a lot of warning [Main] WaveformRendererTextured::createFrameBuffer - frame buffer not valid Presumably for visuals where no track is loaded? (with LateNight btw)

This will need further exploration. Is it just a warning message or is there visual regressions as well?

It's just a warning. No track loaded and I don't see any glitches in the empty waveform box.

@ronso0 Could you please either do a formal Change Request or Approve this. Currently the state is unclear for me.

@ronso0
Copy link
Copy Markdown
Member

ronso0 commented Mar 16, 2025

Like Uwe I can confirm the bug is fixed.
The warning I mentioned is unrelated, so no need to request changes.
I didn't formally approve because I'm not familiar with the touched code. But I can take a closer look soon if no one else steps up.

@uklotzde
Copy link
Copy Markdown
Contributor

uklotzde commented Mar 16, 2025

The PR fixes existing bugs as confirmed by multiple testers, the diff is rather small, the code looks reasonable at first glance (just a quick look, not a formal review!), and the author is trustworthy, skilled, and knows the affected domain. What else do you need to press merge? 🤷

Copy link
Copy Markdown
Member

@daschuer daschuer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the fix. Some final comments:

Comment thread src/waveform/renderers/allshader/waveformrendermark.cpp Outdated
Comment thread src/waveform/renderers/allshader/waveformrendermark.h Outdated
Comment thread src/waveform/renderers/allshader/waveformrendermark.h Outdated
@acolombier acolombier requested a review from daschuer March 17, 2025 08:43
Copy link
Copy Markdown
Member

@Swiftb0y Swiftb0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small nit. LGTM otherwise.

Comment thread src/waveform/renderers/waveformmarkset.cpp Outdated
@ronso0 ronso0 removed their request for review March 17, 2025 12:02
Copy link
Copy Markdown
Member

@Swiftb0y Swiftb0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you. Please squash, feel free to merge yourself afterwards. Lets get this into 2.5.1

@acolombier acolombier force-pushed the fix/scrolling-waveform-regression branch from 6aa799c to eaa8bcc Compare March 24, 2025 14:18
@acolombier acolombier merged commit 3264dfa into mixxxdj:main Mar 24, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

log spam debug [Main] Didn't get mark <Color>: QColor(Invalid) ...

8 participants