From 90bc3d8c281ee5545f591231393d0a6f3cd52813 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Mon, 11 Sep 2023 18:03:33 +0200 Subject: [PATCH 1/6] ci(github): Pin URL for `install.ps1` file using full commit hash --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 78615f86352..14720a28a2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -240,7 +240,7 @@ jobs: WINDOWS_CODESIGN_SECURE_FILE_SECRET: ${{ secrets.WINDOWS_CODESIGN_SECURE_FILE_SECRET }} if: runner.os == 'Windows' && env.WINDOWS_CODESIGN_SECURE_FILE_SALT != null && env.WINDOWS_CODESIGN_SECURE_FILE_SECRET != null run: | - iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/appveyor/secure-file/master/install.ps1')) + iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/appveyor/secure-file/fc44f5c5f2fb184fe738814f373c16cb69c30929/install.ps1')) appveyor-tools/secure-file -decrypt "$Env:WINDOWS_CODESIGN_CERTIFICATE_PATH.enc" -secret "$Env:WINDOWS_CODESIGN_SECURE_FILE_SECRET" -salt "$Env:WINDOWS_CODESIGN_SECURE_FILE_SALT" Add-Content -Path "$Env:GITHUB_ENV" -Value "WINDOWS_CODESIGN_CERTIFICATE_PATH=$Env:WINDOWS_CODESIGN_CERTIFICATE_PATH" Add-Content -Path "$Env:GITHUB_ENV" -Value "WINDOWS_CODESIGN_CERTIFICATE_PASSWORD=$Env:WINDOWS_CODESIGN_CERTIFICATE_PASSWORD" From db608f8323f92e2f982c21f28307d59916e0d475 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Mon, 11 Sep 2023 21:20:09 +0200 Subject: [PATCH 2/6] ci(github): Pin action tag instead of branch --- .github/workflows/build-checks.yml | 4 ++-- .github/workflows/build.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-checks.yml b/.github/workflows/build-checks.yml index 0bb966658c4..dd48a7b1800 100644 --- a/.github/workflows/build-checks.yml +++ b/.github/workflows/build-checks.yml @@ -111,7 +111,7 @@ jobs: .. working-directory: build - name: Set up problem matcher - uses: ammaraskar/gcc-problem-matcher@master + uses: ammaraskar/gcc-problem-matcher@0.2.0 - name: Build # Do not abort on errors and build/check the whole project run: cmake --build . -j $(nproc) -- --keep-going @@ -146,7 +146,7 @@ jobs: - name: "Upload Coverage Report to coveralls.io" if: matrix.name == 'coverage' continue-on-error: true - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2.2.3 with: flag-name: ubuntu-22.04 path-to-lcov: build/lcov.info diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 14720a28a2c..f5852e2f053 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -299,11 +299,11 @@ jobs: - name: "[Ubuntu/macOS] Set up gcc/clang problem matcher" if: runner.os != 'Windows' - uses: ammaraskar/gcc-problem-matcher@master + uses: ammaraskar/gcc-problem-matcher@0.2.0 - name: "[Windows] Set up MSVC problem matcher" if: runner.os == 'Windows' - uses: ammaraskar/msvc-problem-matcher@master + uses: ammaraskar/msvc-problem-matcher@0.2.0 - name: "Build" run: cmake --build . --config RelWithDebInfo From 281ec17d6dbd8d6e1be169fead61ce1ea0b9beb0 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 12 Sep 2023 18:35:35 +0200 Subject: [PATCH 3/6] fix(control): Assert that added alias is not identical to actual key --- src/control/control.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/control/control.cpp b/src/control/control.cpp index ce902b34b69..6c1a194c26e 100644 --- a/src/control/control.cpp +++ b/src/control/control.cpp @@ -108,6 +108,10 @@ void ControlDoublePrivate::setUserConfig(const UserSettingsPointer& pConfig) { // static void ControlDoublePrivate::insertAlias(const ConfigKey& alias, const ConfigKey& key) { MMutexLocker locker(&s_qCOHashMutex); + VERIFY_OR_DEBUG_ASSERT(alias != key) { + qWarning() << "cannot create alias with identical key" << key; + return; + } auto it = s_qCOHash.constFind(key); VERIFY_OR_DEBUG_ASSERT(it != s_qCOHash.constEnd()) { From 472b18a6677c86fd32ea17e2ffb49c1abfed32d4 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 12 Sep 2023 18:54:31 +0200 Subject: [PATCH 4/6] refactor(controlobject): Add `addAlias()` helper function This makes adding an alias more concise and easier to read. --- src/control/controlobject.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/control/controlobject.h b/src/control/controlobject.h index 0f511183bed..a543b5ca48e 100644 --- a/src/control/controlobject.h +++ b/src/control/controlobject.h @@ -53,6 +53,10 @@ class ControlObject : public QObject { } } + void addAlias(const ConfigKey& aliasKey) const { + ControlDoublePrivate::insertAlias(aliasKey, m_key); + } + // Return the key of the object inline ConfigKey getKey() const { return m_key; From 004fc90f94dd2018774810f22cf71a75b69d2471 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 12 Sep 2023 18:56:51 +0200 Subject: [PATCH 5/6] refactor(controlobject): Use `ControlObject::addAlias()` method --- src/effects/effectchain.cpp | 9 +++------ src/engine/channels/engineaux.cpp | 3 +-- src/engine/channels/enginechannel.cpp | 3 +-- src/engine/channels/enginemicrophone.cpp | 3 +-- src/engine/controls/cuecontrol.cpp | 3 +-- src/engine/controls/loopingcontrol.cpp | 3 +-- src/engine/enginemixer.cpp | 6 ++---- src/engine/sync/internalclock.cpp | 3 +-- src/engine/sync/synccontrol.cpp | 3 +-- src/library/librarycontrol.cpp | 7 ++++--- src/test/controlobjecttest.cpp | 2 +- 11 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/effects/effectchain.cpp b/src/effects/effectchain.cpp index a6008c3f902..53c37a3ce4b 100644 --- a/src/effects/effectchain.cpp +++ b/src/effects/effectchain.cpp @@ -108,8 +108,7 @@ EffectChain::EffectChain(const QString& group, &ControlObject::valueChanged, this, &EffectChain::slotControlNextChainPreset); - ControlDoublePrivate::insertAlias(ConfigKey(m_group, "next_chain"), - ConfigKey(m_group, "next_chain_preset")); + m_pControlNextChainPreset->addAlias(ConfigKey(m_group, QStringLiteral("next_chain"))); m_pControlPrevChainPreset = std::make_unique( ConfigKey(m_group, "prev_chain_preset")); @@ -117,8 +116,7 @@ EffectChain::EffectChain(const QString& group, &ControlObject::valueChanged, this, &EffectChain::slotControlPrevChainPreset); - ControlDoublePrivate::insertAlias(ConfigKey(m_group, "prev_chain"), - ConfigKey(m_group, "prev_chain_preset")); + m_pControlPrevChainPreset->addAlias(ConfigKey(m_group, QStringLiteral("prev_chain"))); // Ignoring no-ops is important since this is for +/- tickers. m_pControlChainPresetSelector = std::make_unique( @@ -127,8 +125,7 @@ EffectChain::EffectChain(const QString& group, &ControlObject::valueChanged, this, &EffectChain::slotControlChainPresetSelector); - ControlDoublePrivate::insertAlias(ConfigKey(m_group, "chain_selector"), - ConfigKey(m_group, "chain_preset_selector")); + m_pControlChainPresetSelector->addAlias(ConfigKey(m_group, QStringLiteral("chain_selector"))); // ControlObjects for skin <-> controller mapping interaction. // Refer to comment in header for full explanation. diff --git a/src/engine/channels/engineaux.cpp b/src/engine/channels/engineaux.cpp index 996bc8fafe0..63ebe3cd05f 100644 --- a/src/engine/channels/engineaux.cpp +++ b/src/engine/channels/engineaux.cpp @@ -18,8 +18,7 @@ EngineAux::EngineAux(const ChannelHandleAndGroup& handleGroup, EffectsManager* p m_pPregain(new ControlAudioTaperPot(ConfigKey(getGroup(), "pregain"), -12, 12, 0.5)) { // Make input_configured read-only. m_pInputConfigured->setReadOnly(); - ControlDoublePrivate::insertAlias(ConfigKey(getGroup(), "enabled"), - ConfigKey(getGroup(), "input_configured")); + m_pInputConfigured->addAlias(ConfigKey(getGroup(), QStringLiteral("enabled"))); // by default Aux is disabled on the main and disabled on PFL. User // can over-ride by setting the "pfl" or "main_mix" controls. diff --git a/src/engine/channels/enginechannel.cpp b/src/engine/channels/enginechannel.cpp index de0b5b3c1cd..7369afb1d86 100644 --- a/src/engine/channels/enginechannel.cpp +++ b/src/engine/channels/enginechannel.cpp @@ -22,8 +22,7 @@ EngineChannel::EngineChannel(const ChannelHandleAndGroup& handleGroup, m_pPFL->setButtonMode(ControlPushButton::TOGGLE); m_pMainMix = new ControlPushButton(ConfigKey(getGroup(), "main_mix")); m_pMainMix->setButtonMode(ControlPushButton::POWERWINDOW); - ControlDoublePrivate::insertAlias( - ConfigKey(getGroup(), "master"), ConfigKey(getGroup(), "main_mix")); + m_pMainMix->addAlias(ConfigKey(getGroup(), QStringLiteral("master"))); m_pOrientation = new ControlPushButton(ConfigKey(getGroup(), "orientation")); m_pOrientation->setButtonMode(ControlPushButton::TOGGLE); m_pOrientation->setStates(3); diff --git a/src/engine/channels/enginemicrophone.cpp b/src/engine/channels/enginemicrophone.cpp index 887741c561b..35ced50db4d 100644 --- a/src/engine/channels/enginemicrophone.cpp +++ b/src/engine/channels/enginemicrophone.cpp @@ -19,8 +19,7 @@ EngineMicrophone::EngineMicrophone(const ChannelHandleAndGroup& handleGroup, m_pPregain(new ControlAudioTaperPot(ConfigKey(getGroup(), "pregain"), -12, 12, 0.5)) { // Make input_configured read-only. m_pInputConfigured->setReadOnly(); - ControlDoublePrivate::insertAlias(ConfigKey(getGroup(), "enabled"), - ConfigKey(getGroup(), "input_configured")); + m_pInputConfigured->addAlias(ConfigKey(getGroup(), QStringLiteral("enabled"))); setMainMix(false); // Use "talkover" button to enable microphones } diff --git a/src/engine/controls/cuecontrol.cpp b/src/engine/controls/cuecontrol.cpp index 809b6534262..8ebe81c412c 100644 --- a/src/engine/controls/cuecontrol.cpp +++ b/src/engine/controls/cuecontrol.cpp @@ -2450,8 +2450,7 @@ HotcueControl::HotcueControl(const QString& group, int hotcueIndex) m_pHotcueStatus->setReadOnly(); // Add an alias for the legacy hotcue_X_enabled CO - ControlDoublePrivate::insertAlias(keyForControl(QStringLiteral("enabled")), - keyForControl(QStringLiteral("status"))); + m_pHotcueStatus->addAlias(keyForControl(QStringLiteral("enabled"))); m_hotcueType = std::make_unique(keyForControl(QStringLiteral("type"))); m_hotcueType->setReadOnly(); diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index 5859c48c428..f33943361f8 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -96,8 +96,7 @@ LoopingControl::LoopingControl(const QString& group, Qt::DirectConnection); m_pReloopToggleButton->set(0); // The old reloop_exit name was confusing. This CO does both entering and exiting. - ControlDoublePrivate::insertAlias(ConfigKey(group, "reloop_exit"), - ConfigKey(group, "reloop_toggle")); + m_pReloopToggleButton->addAlias(ConfigKey(group, QStringLiteral("reloop_exit"))); m_pReloopAndStopButton = new ControlPushButton(ConfigKey(group, "reloop_andstop")); connect(m_pReloopAndStopButton, &ControlObject::valueChanged, diff --git a/src/engine/enginemixer.cpp b/src/engine/enginemixer.cpp index 4ceac15ce8b..27048a8fb1c 100644 --- a/src/engine/enginemixer.cpp +++ b/src/engine/enginemixer.cpp @@ -100,8 +100,7 @@ EngineMixer::EngineMixer( // Legacy: the main "gain" control used to be named "volume" in Mixxx // 1.11.0 and earlier. See issue #7413. - ControlDoublePrivate::insertAlias(ConfigKey(group, "volume"), - ConfigKey(group, "gain")); + m_pMainGain->addAlias(ConfigKey(group, QStringLiteral("volume"))); // VU meter: m_pVumeter = new EngineVuMeter(group); @@ -118,8 +117,7 @@ EngineMixer::EngineMixer( // Legacy: the headphone "headGain" control used to be named "headVolume" in // Mixxx 1.11.0 and earlier. See issue #7413. - ControlDoublePrivate::insertAlias(ConfigKey(group, "headVolume"), - ConfigKey(group, "headGain")); + m_pHeadGain->addAlias(ConfigKey(group, QStringLiteral("headVolume"))); // Headphone mix (left/right) m_pHeadMix = new ControlPotmeter(ConfigKey(group, "headMix"),-1.,1.); diff --git a/src/engine/sync/internalclock.cpp b/src/engine/sync/internalclock.cpp index 947bab0b6a3..772d4830215 100644 --- a/src/engine/sync/internalclock.cpp +++ b/src/engine/sync/internalclock.cpp @@ -50,8 +50,7 @@ InternalClock::InternalClock(const QString& group, SyncableListener* pEngineSync m_pSyncLeaderEnabled->setStates(3); m_pSyncLeaderEnabled->connectValueChangeRequest( this, &InternalClock::slotSyncLeaderEnabledChangeRequest, Qt::DirectConnection); - ControlDoublePrivate::insertAlias(ConfigKey(m_group, "sync_master"), - ConfigKey(m_group, "sync_leader")); + m_pSyncLeaderEnabled->addAlias(ConfigKey(m_group, QStringLiteral("sync_master"))); } InternalClock::~InternalClock() { diff --git a/src/engine/sync/synccontrol.cpp b/src/engine/sync/synccontrol.cpp index 38f8cdfc285..990ec946fed 100644 --- a/src/engine/sync/synccontrol.cpp +++ b/src/engine/sync/synccontrol.cpp @@ -57,8 +57,7 @@ SyncControl::SyncControl(const QString& group, m_pSyncLeaderEnabled->setStates(3); m_pSyncLeaderEnabled->connectValueChangeRequest( this, &SyncControl::slotSyncLeaderEnabledChangeRequest, Qt::DirectConnection); - ControlDoublePrivate::insertAlias(ConfigKey(group, "sync_master"), - ConfigKey(group, "sync_leader")); + m_pSyncLeaderEnabled->addAlias(ConfigKey(group, QStringLiteral("sync_master"))); m_pSyncEnabled.reset( new ControlPushButton(ConfigKey(group, "sync_enabled"))); diff --git a/src/library/librarycontrol.cpp b/src/library/librarycontrol.cpp index 4110c5d70a7..800684a1690 100644 --- a/src/library/librarycontrol.cpp +++ b/src/library/librarycontrol.cpp @@ -195,6 +195,8 @@ LibraryControl::LibraryControl(Library* pLibrary) // Auto DJ controls m_pAutoDjAddTop = std::make_unique(ConfigKey("[Library]","AutoDjAddTop")); + m_pAutoDjAddTop->addAlias(ConfigKey( + QStringLiteral("[Playlist]"), QStringLiteral("AutoDjAddTop"))); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(m_pAutoDjAddTop.get(), &ControlPushButton::valueChanged, @@ -203,6 +205,8 @@ LibraryControl::LibraryControl(Library* pLibrary) #endif m_pAutoDjAddBottom = std::make_unique(ConfigKey("[Library]","AutoDjAddBottom")); + m_pAutoDjAddBottom->addAlias(ConfigKey( + QStringLiteral("[Playlist]"), QStringLiteral("AutoDjAddBottom"))); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(m_pAutoDjAddBottom.get(), &ControlPushButton::valueChanged, @@ -414,9 +418,6 @@ LibraryControl::LibraryControl(Library* pLibrary) this, &LibraryControl::slotLoadSelectedIntoFirstStopped); - ControlDoublePrivate::insertAlias(ConfigKey("[Playlist]", "AutoDjAddTop"), ConfigKey("[Library]", "AutoDjAddTop")); - ControlDoublePrivate::insertAlias(ConfigKey("[Playlist]", "AutoDjAddBottom"), ConfigKey("[Library]", "AutoDjAddBottom")); - #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication* app = qApp; // Update controls if any widget in any Mixxx window gets or loses focus diff --git a/src/test/controlobjecttest.cpp b/src/test/controlobjecttest.cpp index c4854998e47..2586fd0c3cb 100644 --- a/src/test/controlobjecttest.cpp +++ b/src/test/controlobjecttest.cpp @@ -44,7 +44,7 @@ TEST_F(ControlObjectTest, AliasRetrieval) { auto co = std::make_unique(ck); // Insert the alias before it is going to be used - ControlDoublePrivate::insertAlias(ckAlias, ck); + co->addAlias(ckAlias); // Check if getControl on alias returns us the original ControlObject EXPECT_EQ(ControlObject::getControl(ckAlias), co.get()); From 1ac537f64b50976524ca12e563fed105937d9c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 13 Sep 2023 14:01:07 +0200 Subject: [PATCH 6/6] Remove obsolete guard agains division by zero This fixes https://github.com/mixxxdj/mixxx/issues/10764 --- src/engine/enginebuffer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp index afa88b60df5..b0db5f29df9 100644 --- a/src/engine/enginebuffer.cpp +++ b/src/engine/enginebuffer.cpp @@ -1389,7 +1389,6 @@ mixxx::audio::FramePos EngineBuffer::queuedSeekPosition() const { void EngineBuffer::updateIndicators(double speed, int iBufferSize) { if (!m_playPos.isValid() || !m_trackSampleRateOld.isValid() || - m_tempo_ratio_old == 0 || m_pPassthroughEnabled->toBool()) { // Skip indicator updates with invalid values to prevent undefined behavior, // e.g. in WaveformRenderBeat::draw().