summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorronso0 <ronso0@mixxx.org>2020-09-30 19:43:23 +0200
committerronso0 <ronso0@mixxx.org>2020-09-30 19:45:41 +0200
commite0c5a49aa2caf9b6e5bb17669349271eb0595ef7 (patch)
tree06289b18b2cb23addfae8ea11efc00066100d24a
parentcdc5d213daed22d28026ea78d42dd59066639ea2 (diff)
waveform: add track end markers
-rw-r--r--src/waveform/renderers/waveformrendererpreroll.cpp90
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.cpp4
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.h2
3 files changed, 65 insertions, 31 deletions
diff --git a/src/waveform/renderers/waveformrendererpreroll.cpp b/src/waveform/renderers/waveformrendererpreroll.cpp
index 10633bde76..6e07e6e74c 100644
--- a/src/waveform/renderers/waveformrendererpreroll.cpp
+++ b/src/waveform/renderers/waveformrendererpreroll.cpp
@@ -32,23 +32,28 @@ void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
return;
}
- double playMarkerPosition = m_waveformRenderer->getPlayMarkerPosition();
- double samplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();
- double numberOfSamples = m_waveformRenderer->getLength() * samplesPerPixel;
+ double firstDisplayedPosition = m_waveformRenderer->getFirstDisplayedPosition();
+ double lastDisplayedPosition = m_waveformRenderer->getLastDisplayedPosition();
+
+ // Check if the pre- or post-roll is on screen. If so, draw little triangles
+ // to indicate the respective zones.
+ bool preRollVisible = firstDisplayedPosition < 0;
+ bool postRollVisible = lastDisplayedPosition > 1;
+ if (preRollVisible || postRollVisible) {
+ double playMarkerPosition = m_waveformRenderer->getPlayMarkerPosition();
+ double samplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();
+ double numberOfSamples = m_waveformRenderer->getLength() * samplesPerPixel;
+
+ int currentPosition = m_waveformRenderer->getPlayPosVSample();
+ int totalSamples = m_waveformRenderer->getTotalVSample();
+ //qDebug() << "currentPosition" << currentPosition
+ // << "lastDisplayedPosition" << lastDisplayedPosition
+ // << "samplesPerPixel" << samplesPerPixel
+ // << "numberOfSamples" << numberOfSamples
+ // << "totalSamples" << totalSamples
+ // << "WaveformRendererPreroll::playMarkerPosition=" << playMarkerPosition;
- int currentPosition = m_waveformRenderer->getPlayPosVSample();
- //qDebug() << "currentPosition" << currentPosition
- // << "samplesPerPixel" << samplesPerPixel
- // << "numberOfSamples" << numberOfSamples
- // << "WaveformRendererPreroll::playMarkerPosition=" << playMarkerPosition;
-
-
- // Some of the pre-roll is on screen. Draw little triangles to indicate
- // where the pre-roll is located.
- if (currentPosition < numberOfSamples * playMarkerPosition) {
- int index = static_cast<int>(numberOfSamples * playMarkerPosition - currentPosition);
const int polyLength = static_cast<int>(40.0 / samplesPerPixel);
-
const float halfBreadth = m_waveformRenderer->getBreadth() / 2.0;
const float halfPolyBreadth = m_waveformRenderer->getBreadth() / 5.0;
@@ -65,23 +70,48 @@ void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
painter->setTransform(QTransform(0, 1, 1, 0, 0, 0));
}
- QPolygonF polygon;
- polygon << QPointF(0, halfBreadth)
- << QPointF(-polyLength, halfBreadth - halfPolyBreadth)
- << QPointF(-polyLength, halfBreadth + halfPolyBreadth);
-
- // Draw at most one not or halve visible polygon at the widget borders
- if (index > (numberOfSamples + ((polyLength + 1) * samplesPerPixel))) {
- int rest = index - numberOfSamples;
- rest %= (int)((polyLength + 1) * samplesPerPixel);
- index = numberOfSamples + rest;
+ if (preRollVisible) {
+ // Sample position of the right-most triangle's tip
+ int index = static_cast<int>(numberOfSamples * playMarkerPosition - currentPosition);
+
+ QPolygonF polygon;
+ polygon << QPointF(0, halfBreadth)
+ << QPointF(-polyLength, halfBreadth - halfPolyBreadth)
+ << QPointF(-polyLength, halfBreadth + halfPolyBreadth);
+
+ // Draw at most one not or halve visible polygon at the widget borders
+ if (index > (numberOfSamples + ((polyLength + 1) * samplesPerPixel))) {
+ int rest = index - numberOfSamples;
+ rest %= (int)((polyLength + 1) * samplesPerPixel);
+ index = numberOfSamples + rest;
+ }
+
+ polygon.translate(((qreal)index) / samplesPerPixel, 0);
+ while (index > 0) {
+ painter->drawPolygon(polygon);
+ polygon.translate(-(polyLength + 1), 0);
+ index -= (polyLength + 1) * samplesPerPixel;
+ }
}
- polygon.translate(((qreal)index) / samplesPerPixel, 0);
- while (index > 0) {
- painter->drawPolygon(polygon);
- polygon.translate(-(polyLength + 1), 0);
- index -= (polyLength + 1) * samplesPerPixel;
+ if (postRollVisible) {
+ int remainingVSamples = totalSamples - currentPosition;
+ // Sample position of the left-most triangle's tip
+ int index = (playMarkerPosition * numberOfSamples) + remainingVSamples;
+ qreal endPos = index / samplesPerPixel;
+ //painter->drawLine(endPos, 0, endPos, m_waveformRenderer->getBreadth());
+
+ QPolygonF polygon;
+ polygon << QPointF(0, halfBreadth)
+ << QPointF(polyLength, halfBreadth - halfPolyBreadth)
+ << QPointF(polyLength, halfBreadth + halfPolyBreadth);
+
+ polygon.translate(endPos, 0);
+ while (index < numberOfSamples) {
+ painter->drawPolygon(polygon);
+ polygon.translate(+(polyLength + 1), 0);
+ index += (polyLength + 1) * samplesPerPixel;
+ }
}
}
}
diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp
index 6483c23914..f4af8f99ed 100644
--- a/src/waveform/renderers/waveformwidgetrenderer.cpp
+++ b/src/waveform/renderers/waveformwidgetrenderer.cpp
@@ -35,6 +35,7 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const QString& group)
m_visualPlayPosition(NULL),
m_playPos(-1),
m_playPosVSample(0),
+ m_totalVSamples(0),
m_pRateRatioCO(NULL),
m_rateRatio(1.0),
m_pGainControlObject(NULL),
@@ -133,7 +134,8 @@ void WaveformWidgetRenderer::onPreRender(VSyncThread* vsyncThread) {
// Avoid pixel jitter in play position by rounding to the nearest track
// pixel.
m_playPos = round(truePlayPos * m_trackPixelCount) / m_trackPixelCount;
- m_playPosVSample = m_playPos * m_trackPixelCount * m_visualSamplePerPixel;
+ m_totalVSamples = m_trackPixelCount * m_visualSamplePerPixel;
+ m_playPosVSample = m_playPos * m_totalVSamples;
double leftOffset = m_playMarkerPosition;
double rightOffset = 1.0 - m_playMarkerPosition;
diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h
index 6be11dca9d..a1676ac2c4 100644
--- a/src/waveform/renderers/waveformwidgetrenderer.h
+++ b/src/waveform/renderers/waveformwidgetrenderer.h
@@ -77,6 +77,7 @@ class WaveformWidgetRenderer {
double getPlayPos() const { return m_playPos;}
double getPlayPosVSample() const { return m_playPosVSample;}
+ double getTotalVSample() const { return m_totalVSamples;}
double getZoomFactor() const { return m_zoomFactor;}
double getGain() const { return m_gain;}
int getTrackSamples() const { return m_trackSamples;}
@@ -140,6 +141,7 @@ class WaveformWidgetRenderer {
QSharedPointer<VisualPlayPosition> m_visualPlayPosition;
double m_playPos;
int m_playPosVSample;
+ int m_totalVSamples;
ControlProxy* m_pRateRatioCO;
double m_rateRatio;
ControlProxy* m_pGainControlObject;