Skip to content
2 changes: 1 addition & 1 deletion src/qml/qmlwaveformdisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ void QmlWaveformDisplay::slotTrackLoaded(TrackPointer pTrack) {
void QmlWaveformDisplay::slotTrackLoading(TrackPointer pNewTrack, TrackPointer pOldTrack) {
Q_UNUSED(pOldTrack); // only used in DEBUG_ASSERT
DEBUG_ASSERT(getTrackInfo() == pOldTrack);
setCurrentTrack(pNewTrack);
setCurrentTrack({});

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could you clarify why this is needed? As I understand, setCurrentTrack will still be called in QmlWaveformDisplay::slotTrackLoaded, which was previously discarded as the current track would already be set. Was that causing trouble? Might be good to capture the explanation in a comment so we don't accidentally add this back in the future.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

During loading a new Track all data is populated one by one. We want to remove the old track during that time and pass the new one once it is finished and ready for use in slotTrackLoaded() above.
Maybe this helps also to fix @ywwg race condition.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for the explanation.
From my discovery, this won't help with the race condition.

}

void QmlWaveformDisplay::slotTrackUnloaded() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ void WaveformRendererEndOfTrack::draw(QPainter* painter, QPaintEvent* event) {
bool WaveformRendererEndOfTrack::init() {
m_timer.restart();

m_pEndOfTrackControl.reset(new ControlProxy(
m_waveformRenderer->getGroup(), "end_of_track"));
m_pTimeRemainingControl.reset(new ControlProxy(
m_waveformRenderer->getGroup(), "time_remaining"));
m_pEndOfTrackControl = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), "end_of_track");
m_pTimeRemainingControl = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), "time_remaining");

return true;
}
Expand Down
4 changes: 2 additions & 2 deletions src/waveform/renderers/allshader/waveformrendererslipmode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ void WaveformRendererSlipMode::draw(QPainter* painter, QPaintEvent* event) {
bool WaveformRendererSlipMode::init() {
m_timer.restart();

m_pSlipModeControl.reset(new ControlProxy(
m_waveformRenderer->getGroup(), QStringLiteral("slip_enabled")));
m_pSlipModeControl = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), QStringLiteral("slip_enabled"));

return true;
}
Expand Down
3 changes: 2 additions & 1 deletion src/waveform/renderers/allshader/waveformrendermark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ allshader::WaveformRenderMark::WaveformRenderMark(
: ::WaveformRenderMarkBase(waveformWidget, false),
m_beatsUntilMark(0),
m_timeUntilMark(0.0),
m_pTimeRemainingControl(nullptr),
m_currentBeatPosition(0.0),
m_nextBeatPosition(0.0),
m_isSlipRenderer(type == ::WaveformRendererAbstract::Slip),
m_playPosHeight(0.f),
m_playPosDevicePixelRatio(0.f),
Expand Down
10 changes: 0 additions & 10 deletions src/waveform/renderers/waveformmark.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,6 @@ class WaveformMark {
return m_pPositionCO && m_pPositionCO->valid();
}

template<typename Receiver, typename Slot>
void connectSamplePositionChanged(Receiver receiver, Slot slot) const {
m_pPositionCO->connectValueChanged(receiver, slot, Qt::AutoConnection);
};
template<typename Receiver, typename Slot>
void connectSampleEndPositionChanged(Receiver receiver, Slot slot) const {
if (m_pEndPositionCO) {
m_pEndPositionCO->connectValueChanged(receiver, slot, Qt::AutoConnection);
}
};
double getSamplePosition() const {
return m_pPositionCO->get();
}
Expand Down
18 changes: 0 additions & 18 deletions src/waveform/renderers/waveformmarkset.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,6 @@ class WaveformMarkSet {
const SkinContext& context,
const WaveformSignalColors& signalColors);

template<typename Receiver, typename Slot>
void connectSamplePositionChanged(Receiver receiver, Slot slot) const {
for (const auto& pMark : std::as_const(m_marks)) {
if (pMark->isValid()) {
pMark->connectSamplePositionChanged(receiver, slot);
}
}
};

template<typename Receiver, typename Slot>
void connectSampleEndPositionChanged(Receiver receiver, Slot slot) const {
for (const auto& pMark : std::as_const(m_marks)) {
if (pMark->isValid()) {
pMark->connectSampleEndPositionChanged(receiver, slot);
}
}
};

template<typename Receiver, typename Slot>
void connectVisibleChanged(Receiver receiver, Slot slot) const {
for (const auto& pMark : std::as_const(m_marks)) {
Expand Down
6 changes: 2 additions & 4 deletions src/waveform/renderers/waveformrendererendoftrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,14 @@ WaveformRendererEndOfTrack::WaveformRendererEndOfTrack(
}

WaveformRendererEndOfTrack::~WaveformRendererEndOfTrack() {
delete m_pEndOfTrackControl;
delete m_pTimeRemainingControl;
}

bool WaveformRendererEndOfTrack::init() {
m_timer.restart();

m_pEndOfTrackControl = new ControlProxy(
m_pEndOfTrackControl = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), "end_of_track");
m_pTimeRemainingControl = new ControlProxy(
m_pTimeRemainingControl = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), "time_remaining");
return true;
}
Expand Down
7 changes: 4 additions & 3 deletions src/waveform/renderers/waveformrendererendoftrack.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#pragma once

#include <QColor>
#include <memory>

#include "skin/legacy/skincontext.h"
#include "util/class.h"
#include "waveform/renderers/waveformrendererabstract.h"
#include "util/performancetimer.h"
#include "waveform/renderers/waveformrendererabstract.h"

class ControlProxy;

Expand All @@ -24,8 +25,8 @@ class WaveformRendererEndOfTrack : public WaveformRendererAbstract {
private:
void generateBackRects();

ControlProxy* m_pEndOfTrackControl;
ControlProxy* m_pTimeRemainingControl;
std::unique_ptr<ControlProxy> m_pEndOfTrackControl;
std::unique_ptr<ControlProxy> m_pTimeRemainingControl;

QColor m_color;
PerformanceTimer m_timer;
Expand Down
68 changes: 24 additions & 44 deletions src/waveform/renderers/waveformrenderersignalbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,6 @@ const QString kEffectGroupFormat = QStringLiteral("[EqualizerRack1_%1_Effect1]")
WaveformRendererSignalBase::WaveformRendererSignalBase(
WaveformWidgetRenderer* waveformWidgetRenderer)
: WaveformRendererAbstract(waveformWidgetRenderer),
m_pEQEnabled(nullptr),
m_pLowFilterControlObject(nullptr),
m_pMidFilterControlObject(nullptr),
m_pHighFilterControlObject(nullptr),
m_pLowKillControlObject(nullptr),
m_pMidKillControlObject(nullptr),
m_pHighKillControlObject(nullptr),
m_alignment(Qt::AlignCenter),
m_orientation(Qt::Horizontal),
m_allChannelVisualGain(1),
Expand Down Expand Up @@ -51,50 +44,37 @@ WaveformRendererSignalBase::WaveformRendererSignalBase(
m_rgbMidColor_b(0),
m_rgbHighColor_r(0),
m_rgbHighColor_g(0),
m_rgbHighColor_b(0) {
m_rgbHighColor_b(0),
m_rgbLowFilteredColor_r(0),
m_rgbLowFilteredColor_g(0),
m_rgbLowFilteredColor_b(0),
m_rgbMidFilteredColor_r(0),
m_rgbMidFilteredColor_g(0),
m_rgbMidFilteredColor_b(0),
m_rgbHighFilteredColor_r(0),
m_rgbHighFilteredColor_g(0),
m_rgbHighFilteredColor_b(0) {
}

WaveformRendererSignalBase::~WaveformRendererSignalBase() {
deleteControls();
}

void WaveformRendererSignalBase::deleteControls() {
if (m_pEQEnabled) {
delete m_pEQEnabled;
}
if (m_pLowFilterControlObject) {
delete m_pLowFilterControlObject;
}
if (m_pMidFilterControlObject) {
delete m_pMidFilterControlObject;
}
if (m_pHighFilterControlObject) {
delete m_pHighFilterControlObject;
}
if (m_pLowKillControlObject) {
delete m_pLowKillControlObject;
}
if (m_pMidKillControlObject) {
delete m_pMidKillControlObject;
}
if (m_pHighKillControlObject) {
delete m_pHighKillControlObject;
}
}

bool WaveformRendererSignalBase::init() {
deleteControls();

//create controls
m_pEQEnabled = new ControlProxy(
m_waveformRenderer->getGroup(), "filterWaveformEnable");
m_pEQEnabled = std::make_unique<ControlProxy>(
m_waveformRenderer->getGroup(), QStringLiteral("filterWaveformEnable"));
const QString effectGroup = kEffectGroupFormat.arg(m_waveformRenderer->getGroup());
m_pLowFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter1"));
m_pMidFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter2"));
m_pHighFilterControlObject = new ControlProxy(effectGroup, QStringLiteral("parameter3"));
m_pLowKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter1"));
m_pMidKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter2"));
m_pHighKillControlObject = new ControlProxy(effectGroup, QStringLiteral("button_parameter3"));
m_pLowFilterControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("parameter1"));
m_pMidFilterControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("parameter2"));
m_pHighFilterControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("parameter3"));
m_pLowKillControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("button_parameter1"));
m_pMidKillControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("button_parameter2"));
m_pHighKillControlObject = std::make_unique<ControlProxy>(
effectGroup, QStringLiteral("button_parameter3"));

return onInit();
}
Expand Down
16 changes: 7 additions & 9 deletions src/waveform/renderers/waveformrenderersignalbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,19 @@ class WaveformRendererSignalBase : public QObject, public WaveformRendererAbstra
}

protected:
void deleteControls();

void getGains(float* pAllGain,
float* pLowGain,
float* pMidGain,
float* highGain);

protected:
ControlProxy* m_pEQEnabled;
ControlProxy* m_pLowFilterControlObject;
ControlProxy* m_pMidFilterControlObject;
ControlProxy* m_pHighFilterControlObject;
ControlProxy* m_pLowKillControlObject;
ControlProxy* m_pMidKillControlObject;
ControlProxy* m_pHighKillControlObject;
std::unique_ptr<ControlProxy> m_pEQEnabled;
std::unique_ptr<ControlProxy> m_pLowFilterControlObject;
std::unique_ptr<ControlProxy> m_pMidFilterControlObject;
std::unique_ptr<ControlProxy> m_pHighFilterControlObject;
std::unique_ptr<ControlProxy> m_pLowKillControlObject;
std::unique_ptr<ControlProxy> m_pMidKillControlObject;
std::unique_ptr<ControlProxy> m_pHighKillControlObject;

Qt::Alignment m_alignment;
Qt::Orientation m_orientation;
Expand Down
6 changes: 0 additions & 6 deletions src/waveform/renderers/waveformrendermarkbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,7 @@ WaveformRenderMarkBase::WaveformRenderMarkBase(
void WaveformRenderMarkBase::setup(const QDomNode& node, const SkinContext& context) {
WaveformSignalColors signalColors = *m_waveformRenderer->getWaveformSignalColors();
m_marks.setup(m_waveformRenderer->getGroup(), node, context, signalColors);
}

bool WaveformRenderMarkBase::init() {
m_marks.connectSamplePositionChanged(this, &WaveformRenderMarkBase::onMarkChanged);
m_marks.connectSampleEndPositionChanged(this, &WaveformRenderMarkBase::onMarkChanged);
m_marks.connectVisibleChanged(this, &WaveformRenderMarkBase::onMarkChanged);
return true;
}

void WaveformRenderMarkBase::onSetTrack() {
Expand Down
6 changes: 0 additions & 6 deletions src/waveform/renderers/waveformrendermarkbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,11 @@ class WaveformRenderMarkBase : public QObject, public WaveformRendererAbstract {

void setup(const QDomNode& node, const SkinContext& context) override;

bool init() override;

// Called when a new track is loaded.
void onSetTrack() override;

void onResize() override;

void clearMarks() {
m_marks.clear();
}

void setDefaultMark(const QString& group, const WaveformMarkSet::DefaultMarkerStyle& model) {
m_marks.setDefault(group, model);
}
Expand Down
4 changes: 2 additions & 2 deletions src/waveform/renderers/waveformwidgetrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ bool WaveformWidgetRenderer::init() {
m_pTrackSamplesControlObject = std::make_unique<ControlProxy>(
m_group, QStringLiteral("track_samples"));

for (int i = 0; i < m_rendererStack.size(); ++i) {
if (!m_rendererStack[i]->init()) {
for (auto* pRendered : std::as_const(m_rendererStack)) {
VERIFY_OR_DEBUG_ASSERT(pRendered->init()) {
return false;
}
}
Expand Down
2 changes: 0 additions & 2 deletions src/widget/woverview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,6 @@ void WOverview::setup(const QDomNode& node, const SkinContext& context) {
auto colorPalette = colorPaletteSettings.getHotcueColorPalette();
m_pCueMenuPopup->setColorPalette(colorPalette);

m_marks.connectSamplePositionChanged(this, &WOverview::onMarkChanged);
m_marks.connectSampleEndPositionChanged(this, &WOverview::onMarkChanged);
m_marks.connectVisibleChanged(this, &WOverview::onMarkChanged);

QDomNode child = node.firstChild();
Expand Down