Skip to content

Commit 9afd06a

Browse files
m0dBacolombier
authored andcommitted
scrolling qml waveformdisplay working
WIP PreRoll hack Matrix based on viewport and rect (#7) * bundle on macos * use Skin.WaveformDisplay for both decks * add shaders to mixxx target * call update from frameSwapped, test with only waveformrendererendoftrack * avoid error with colorChanged signals * fix typo in comment * example cleanup * keep track of size and viewport to update matrices in waveformwidgetrenderer * force continuous drawing of end of track, log framerate, use rgbamaterial instead of endoftrack material * use setViewport instead of resize, protect nullptr * call setViewport, setRect, setDevicePixelRatio * replace resize with setViewport, setRect, setDevicePixelRatio * set matrix with correct offset, minor fixes related with material changes --------- Co-authored-by: m0dB <[email protected]> move everything back to declarative style progress with marks
1 parent 1e57aae commit 9afd06a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2673
-148
lines changed

.gitignore

Lines changed: 357 additions & 0 deletions
Large diffs are not rendered by default.

CMakeLists.txt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,7 @@ if(QT6)
17701770
# below that takes care of the correct object order in the resulting binary
17711771
# According to https://doc.qt.io/qt-6/qt-finalize-target.html it is importand for
17721772
# builds with Qt < 3.21
1773-
qt_add_executable(mixxx WIN32 src/main.cpp MANUAL_FINALIZATION)
1773+
qt_add_executable(mixxx WIN32 MACOSX_BUNDLE src/main.cpp MANUAL_FINALIZATION)
17741774
else()
17751775
find_package(Qt5 COMPONENTS Core) # For Qt Core cmake functions
17761776
# This is the first package form the environment, if this fails give hints how to install the environment
@@ -2766,6 +2766,7 @@ if(QML)
27662766
res/qml/Mixxx/Controls/WaveformOverviewHotcueMarker.qml
27672767
res/qml/Mixxx/Controls/WaveformOverviewMarker.qml
27682768
res/qml/Mixxx/Controls/WaveformOverview.qml
2769+
res/qml/Mixxx/Controls/WaveformDisplay.qml
27692770
)
27702771
target_link_libraries(mixxx-qml-lib PRIVATE mixxx-qml-mixxxcontrolsplugin)
27712772

@@ -2788,6 +2789,24 @@ if(QML)
27882789
src/qml/qmlvisibleeffectsmodel.cpp
27892790
src/qml/qmlchainpresetmodel.cpp
27902791
src/qml/qmlwaveformoverview.cpp
2792+
src/qml/qmlwaveformdisplay.cpp
2793+
src/qml/qmlwaveformrenderer.cpp
2794+
src/waveform/renderers/waveformdisplayrange.cpp
2795+
2796+
src/waveform/renderers/allshader/digitsrenderer.cpp
2797+
src/waveform/renderers/allshader/waveformrenderbeat.cpp
2798+
src/waveform/renderers/allshader/waveformrenderer.cpp
2799+
src/waveform/renderers/allshader/waveformrendererendoftrack.cpp
2800+
# FIXME depends on rendergraph/openglnode.h
2801+
# src/waveform/renderers/allshader/waveformrendererslipmode.cpp
2802+
# src/waveform/renderers/allshader/waveformrendererfiltered.cpp
2803+
# src/waveform/renderers/allshader/waveformrendererhsv.cpp
2804+
src/waveform/renderers/allshader/waveformrendererpreroll.cpp
2805+
src/waveform/renderers/allshader/waveformrendererrgb.cpp
2806+
src/waveform/renderers/allshader/waveformrenderersignalbase.cpp
2807+
# src/waveform/renderers/allshader/waveformrenderersimple.cpp
2808+
src/waveform/renderers/allshader/waveformrendermark.cpp
2809+
src/waveform/renderers/allshader/waveformrendermarkrange.cpp
27912810
# The following sources need to be in this target to get QML_ELEMENT properly interpreted
27922811
src/control/controlmodel.cpp
27932812
src/control/controlsortfiltermodel.cpp
@@ -3480,6 +3499,8 @@ if (STEM)
34803499
if(QML)
34813500
target_compile_definitions(mixxx-qml-lib PUBLIC __STEM__)
34823501
target_sources(mixxx-qml-lib PRIVATE
3502+
# FIXME depends on rendergraph/openglnode.h
3503+
# src/waveform/renderers/allshader/waveformrendererstem.cpp
34833504
src/qml/qmlstemsmodel.cpp
34843505
)
34853506
endif()
@@ -3814,6 +3835,14 @@ add_subdirectory(src/rendergraph/opengl)
38143835
add_subdirectory(res/shaders/rendergraph)
38153836
target_link_libraries(mixxx-lib PUBLIC rendergraph_gl)
38163837
target_compile_definitions(mixxx-lib PRIVATE rendergraph=rendergraph_gl)
3838+
target_compile_definitions(mixxx-lib PRIVATE __RENDERGRAPH_OPENGL__)
3839+
target_compile_definitions(mixxx-lib PRIVATE allshader=allshader_gl)
3840+
if(QML)
3841+
add_subdirectory(src/rendergraph/scenegraph)
3842+
target_link_libraries(mixxx-qml-lib PRIVATE rendergraph_sg)
3843+
target_compile_definitions(mixxx-qml-lib PRIVATE rendergraph=rendergraph_sg)
3844+
target_compile_definitions(mixxx-qml-lib PRIVATE allshader=allshader_sg)
3845+
endif()
38173846

38183847
# WavPack audio file support
38193848
find_package(wavpack)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Mixxx 1.0 as Mixxx
2+
3+
Mixxx.WaveformDisplay {
4+
id: root
5+
6+
player: Mixxx.PlayerManager.getPlayer(root.group)
7+
}

res/qml/WaveformDisplay.qml

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
import "." as Skin
2+
import Mixxx 1.0 as Mixxx
3+
import Mixxx.Controls 1.0 as MixxxControls
4+
import QtQuick 2.12
5+
import "Theme"
6+
7+
Item {
8+
id: root
9+
10+
required property string group
11+
12+
enum MouseStatus {
13+
Normal,
14+
Bending,
15+
Scratching
16+
}
17+
18+
MixxxControls.WaveformDisplay {
19+
anchors.fill: parent
20+
group: root.group
21+
22+
Mixxx.WaveformRendererEndOfTrack {
23+
color: 'blue'
24+
}
25+
26+
Mixxx.WaveformRendererPreroll {
27+
color: 'red'
28+
}
29+
30+
// // Mixxx.WaveformRendererMarkRange {
31+
// // // <!-- Loop -->
32+
// // Mixxx.WaveformMarkRange {
33+
// // startControl: "loop_start_position"
34+
// // endControl: "loop_end_position"
35+
// // enabledControl: "loop_enabled"
36+
// // color: 'LoopColor'
37+
// // opacity: 0.7
38+
// // disabledColor: '#FFFFFF'
39+
// // disabledOpacity: 0.6
40+
// // }
41+
// // // <!-- Intro -->
42+
// // Mixxx.WaveformMarkRange {
43+
// // startControl: "intro_start_position"
44+
// // endControl: "intro_end_position"
45+
// // // visibilityControl: '[Skin],show_intro_outro_cues'
46+
// // color: 'IntroOutroColor'
47+
// // opacity: 0.6
48+
// // durationTextColor: '#ffffff'
49+
// // durationTextLocation: 'after'
50+
// // }
51+
// // // <!-- Outro -->
52+
// // Mixxx.WaveformMarkRange {
53+
// // startControl: "outro_start_position"
54+
// // endControl: "outro_end_position"
55+
// // // visibilityControl: '[Skin],show_intro_outro_cues'
56+
// // color: 'IntroOutroColor'
57+
// // opacity: 0.6
58+
// // durationTextColor: '#ffffff'
59+
// // durationTextLocation: 'before'
60+
// // }
61+
// // }
62+
63+
Mixxx.WaveformRendererRGB {
64+
axesColor: 'yellow'
65+
lowColor: 'red'
66+
midColor: 'green'
67+
highColor: 'blue'
68+
}
69+
70+
Mixxx.WaveformRendererBeat {
71+
color: 'green'
72+
}
73+
74+
Mixxx.WaveformRendererMark {
75+
playMarkerColor: 'cyan'
76+
playMarkerBackground: 'orange'
77+
defaultMark: Mixxx.WaveformMark {
78+
align: "bottom|right"
79+
color: "#FF0000"
80+
textColor: "#FFFFFF"
81+
text: " %1 "
82+
}
83+
Mixxx.WaveformMark {
84+
control: "cue_point"
85+
text: 'C'
86+
align: 'top|right'
87+
color: 'red'
88+
textColor: '#FFFFFF'
89+
}
90+
Mixxx.WaveformMark {
91+
control: "loop_start_position"
92+
text: '&#8635;'
93+
align: 'top|left'
94+
color: 'green'
95+
textColor: '#FFFFFF'
96+
}
97+
Mixxx.WaveformMark {
98+
control: "loop_end_position"
99+
// visibilityControl: '<Variable name="'
100+
// <!--Text>OUT</Text-->
101+
align: 'bottom|right'
102+
color: 'green'
103+
textColor: '#FFFFFF'
104+
// visibilityControl: '<Variable name="'
105+
}
106+
Mixxx.WaveformMark {
107+
control: "intro_start_position"
108+
// visibilityControl: '[Skin],show_intro_outro_cues'
109+
align: 'top|right'
110+
color: 'blue'
111+
textColor: '#FFFFFF'
112+
}
113+
Mixxx.WaveformMark {
114+
control: "intro_end_position"
115+
// visibilityControl: '[Skin],show_intro_outro_cues'
116+
text: '&#9698;'
117+
align: 'top|left'
118+
color: 'blue'
119+
textColor: '#FFFFFF'
120+
}
121+
Mixxx.WaveformMark {
122+
control: "outro_start_position"
123+
// visibilityControl: '[Skin],show_intro_outro_cues'
124+
text: '&#9699;'
125+
align: 'top|right'
126+
color: 'blue'
127+
textColor: '#FFFFFF'
128+
}
129+
Mixxx.WaveformMark {
130+
control: "outro_end_position"
131+
// visibilityControl: '[Skin],show_intro_outro_cues'
132+
align: 'top|left'
133+
color: 'blue'
134+
textColor: '#FFFFFF'
135+
}
136+
}
137+
}
138+
139+
Mixxx.ControlProxy {
140+
id: scratchPositionEnableControl
141+
142+
group: root.group
143+
key: "scratch_position_enable"
144+
}
145+
146+
Mixxx.ControlProxy {
147+
id: scratchPositionControl
148+
149+
group: root.group
150+
key: "scratch_position"
151+
}
152+
153+
Mixxx.ControlProxy {
154+
id: wheelControl
155+
156+
group: root.group
157+
key: "wheel"
158+
}
159+
160+
Mixxx.ControlProxy {
161+
id: rateRatioControl
162+
163+
group: root.group
164+
key: "rate_ratio"
165+
}
166+
167+
Mixxx.ControlProxy {
168+
id: zoomControl
169+
170+
group: root.group
171+
key: "waveform_zoom"
172+
}
173+
readonly property real effectiveZoomFactor: (1 / rateRatioControl.value) * (100 / zoomControl.value)
174+
175+
MouseArea {
176+
property int mouseStatus: WaveformDisplay.MouseStatus.Normal
177+
property point mouseAnchor: Qt.point(0, 0)
178+
179+
anchors.fill: parent
180+
acceptedButtons: Qt.LeftButton | Qt.RightButton
181+
onPressed: {
182+
mouseAnchor = Qt.point(mouse.x, mouse.y);
183+
if (mouse.button == Qt.LeftButton) {
184+
if (mouseStatus == WaveformDisplay.MouseStatus.Bending)
185+
wheelControl.parameter = 0.5;
186+
187+
mouseStatus = WaveformDisplay.MouseStatus.Scratching;
188+
scratchPositionEnableControl.value = 1;
189+
// TODO: Calculate position properly
190+
scratchPositionControl.value = -mouse.x * 2 * zoomControl.value;
191+
console.log(mouse.x);
192+
} else {
193+
if (mouseStatus == WaveformDisplay.MouseStatus.Scratching)
194+
scratchPositionEnableControl.value = 0;
195+
196+
wheelControl.parameter = 0.5;
197+
mouseStatus = WaveformDisplay.MouseStatus.Bending;
198+
}
199+
}
200+
onPositionChanged: {
201+
switch (mouseStatus) {
202+
case WaveformDisplay.MouseStatus.Bending: {
203+
const diff = mouse.x - mouseAnchor.x;
204+
// Start at the middle of [0.0, 1.0], and emit values based on how far
205+
// the mouse has traveled horizontally. Note, for legacy (MIDI) reasons,
206+
// this is tuned to 127.
207+
const v = 0.5 + (diff / 1270);
208+
// clamp to [0.0, 1.0]
209+
wheelControl.parameter = Mixxx.MathUtils.clamp(v, 0, 1);
210+
break;
211+
};
212+
case WaveformDisplay.MouseStatus.Scratching:
213+
// TODO: Calculate position properly
214+
scratchPositionControl.value = -mouse.x * zoomControl.value * 2 * 10;
215+
break;
216+
}
217+
}
218+
onReleased: {
219+
switch (mouseStatus) {
220+
case WaveformDisplay.MouseStatus.Bending:
221+
wheelControl.parameter = 0.5;
222+
break;
223+
case WaveformDisplay.MouseStatus.Scratching:
224+
scratchPositionEnableControl.value = 0;
225+
break;
226+
}
227+
mouseStatus = WaveformDisplay.MouseStatus.Normal;
228+
}
229+
230+
onWheel: {
231+
if (wheel.angleDelta.y < 0 && zoomControl.value > 1) {
232+
zoomControl.value -= 1;
233+
} else if (wheel.angleDelta.y > 0 && zoomControl.value < 10.0) {
234+
zoomControl.value += 1;
235+
}
236+
}
237+
}
238+
}

res/qml/main.qml

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -111,32 +111,47 @@ ApplicationWindow {
111111
}
112112
}
113113

114-
WaveformRow {
114+
// WaveformRow {
115+
// id: deck1waveform
116+
117+
// group: "[Channel1]"
118+
// width: root.width
119+
// height: 60
120+
// visible: !root.maximizeLibrary
121+
122+
// FadeBehavior on visible {
123+
// fadeTarget: deck1waveform
124+
// }
125+
// }
126+
127+
Skin.WaveformDisplay {
115128
id: deck1waveform
116129

117-
group: "[Channel1]"
118130
width: root.width
119131
height: 60
120-
visible: !root.maximizeLibrary
121-
122-
FadeBehavior on visible {
123-
fadeTarget: deck1waveform
124-
}
132+
group: "[Channel1]"
125133
}
126134

127-
WaveformRow {
135+
Skin.WaveformDisplay {
128136
id: deck2waveform
129137

130-
group: "[Channel2]"
131138
width: root.width
132139
height: 60
133-
visible: !root.maximizeLibrary
134-
135-
FadeBehavior on visible {
136-
fadeTarget: deck2waveform
137-
}
140+
group: "[Channel2]"
138141
}
139142

143+
// WaveformRow {
144+
// id: deck2waveform
145+
//
146+
// group: "[Channel2]"
147+
// width: root.width
148+
// height: 60
149+
// visible: !root.maximizeLibrary
150+
//
151+
// FadeBehavior on visible {
152+
// fadeTarget: deck2waveform
153+
// }
154+
// }
140155
WaveformRow {
141156
id: deck4waveform
142157

res/shaders/rendergraph/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ qt6_add_shaders(rendergraph_sg "shaders-qsb"
2323
${shaders}
2424
)
2525

26+
if(TARGET mixxx)
27+
qt6_add_shaders(mixxx "shaders-qsb"
28+
BATCHABLE
29+
PRECOMPILE
30+
OPTIMIZED
31+
PREFIX
32+
/shaders/rendergraph
33+
FILES
34+
${shaders}
35+
)
36+
endif()
37+
2638
if(USE_QSHADER_FOR_GL)
2739
message(STATUS "Adding qsb shaders to rendergraph_gl")
2840
qt6_add_shaders(rendergraph_gl "shaders-qsb"

0 commit comments

Comments
 (0)