diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 301b601d76c3..554705f59ed3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,31 @@ name: Build on: workflow_call: + inputs: + publish: + type: boolean + default: false + secrets: + AZURE_CLIENT_ID: + required: false + AZURE_CLIENT_SECRET: + required: false + AZURE_TENANT_ID: + required: false + DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY: + required: false + DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY_PASSWORD: + required: false + MACOS_CODESIGN_CERTIFICATE_P12_BASE64: + required: false + MACOS_CODESIGN_CERTIFICATE_PASSWORD: + required: false + MACOS_NOTARIZATION_APP_SPECIFIC_PASSWORD: + required: false + NETLIFY_BUILD_HOOK: + required: false + RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY: + required: false permissions: contents: read # to fetch code (actions/checkout) @@ -49,7 +74,6 @@ jobs: -DQML=OFF -DWAVPACK=ON -DVCPKG_TARGET_TRIPLET=x64-osx-min1100-release - -DVCPKG_DEFAULT_HOST_TRIPLET=x64-osx-min1100-release # TODO: Fix this broken test on macOS ctest_args: --exclude-regex DirectoryDAOTest.relocateDirectory cpack_generator: DragNDrop @@ -74,7 +98,6 @@ jobs: -DQML=ON -DWAVPACK=ON -DVCPKG_TARGET_TRIPLET=arm64-osx-min1100-release - -DVCPKG_DEFAULT_HOST_TRIPLET=x64-osx-min1100-release # TODO: Fix this broken test on macOS crosscompile: true cpack_generator: DragNDrop @@ -103,7 +126,6 @@ jobs: -DQML=ON -DWAVPACK=ON -DVCPKG_TARGET_TRIPLET=x64-windows-release - -DVCPKG_DEFAULT_HOST_TRIPLET=x64-windows-release cc: cl cxx: cl # TODO: Fix these broken tests on Windows @@ -458,7 +480,7 @@ jobs: # also generates metadata for file artifact and write it to the job # output using the artifacts_slug value. id: prepare_deploy - if: github.event_name == 'push' && matrix.artifacts_path != null + if: inputs.publish && matrix.artifacts_path != null shell: bash run: > if [[ "${GITHUB_REF}" =~ ^refs/tags/.* ]]; @@ -479,7 +501,7 @@ jobs: - name: "[Windows] Install rsync and openssh" env: SSH_PRIVATE_KEY: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY }} - if: runner.os == 'Windows' && github.event_name == 'push' && env.SSH_PRIVATE_KEY != null + if: runner.os == 'Windows' && inputs.publish && env.SSH_PRIVATE_KEY != null run: | if (Test-Path "C:\msys64\usr\bin") { $msysPath="C:\msys64" @@ -514,7 +536,7 @@ jobs: Add-Content -Path "$Env:GITHUB_ENV" -Value "PATH=$Env:PATH" - name: "Set up SSH Agent" - if: github.event_name == 'push' && env.SSH_PRIVATE_KEY != null + if: inputs.publish && env.SSH_PRIVATE_KEY != null shell: bash env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock @@ -529,7 +551,7 @@ jobs: - name: "[macOS/Windows] Upload build to downloads.mixxx.org" # skip deploying Ubuntu builds to downloads.mixxx.org because these are deployed to the PPA - if: runner.os != 'Linux' && github.event_name == 'push' && env.SSH_AUTH_SOCK != null + if: runner.os != 'Linux' && inputs.publish && env.SSH_AUTH_SOCK != null shell: bash --login -eo pipefail "{0}" run: rsync --verbose --recursive --checksum --times --delay-updates "deploy/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/" env: @@ -575,7 +597,7 @@ jobs: - name: "Collect Artifacts Metadata & Write Manifest" # Retrieve the metadata from the matrix job's outputs, merge them into a # single JSON document and then deploy to the server. - if: github.event_name == 'push' && env.SSH_PASSWORD != null + if: inputs.publish && env.SSH_PASSWORD != null run: > if [[ "${GITHUB_REF}" =~ ^refs/tags/.* ]]; then @@ -593,7 +615,7 @@ jobs: SSH_PASSWORD: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY_PASSWORD }} - name: "Set up SSH Agent" - if: github.event_name == 'push' && env.SSH_PRIVATE_KEY != null && env.MANIFEST_DIRTY != null && env.MANIFEST_DIRTY != '0' + if: inputs.publish && env.SSH_PRIVATE_KEY != null && env.MANIFEST_DIRTY != null && env.MANIFEST_DIRTY != '0' shell: bash env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock @@ -607,7 +629,7 @@ jobs: echo "SSH_AUTH_SOCK=${SSH_AUTH_SOCK}" >> "${GITHUB_ENV}" - name: "Deploy Manifest" - if: github.event_name == 'push' && env.SSH_AUTH_SOCK != null + if: inputs.publish && env.SSH_AUTH_SOCK != null shell: bash run: rsync --verbose --recursive --checksum --times --delay-updates "deploy/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/" env: diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml new file mode 100644 index 000000000000..46e617d65ba3 --- /dev/null +++ b/.github/workflows/develop.yml @@ -0,0 +1,88 @@ +name: Pull request or branch build + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - edited + push: + branches: + - "*" + - "!main" + - "![0-9].[0-9]" + workflow_dispatch: + +permissions: + contents: read # to fetch code (actions/checkout) + checks: write # to create new checks (coverallsapp/github-action) + +jobs: + stop-build: + name: Check if build should be stopped + runs-on: ubuntu-latest + outputs: + result: ${{ github.event_name == 'push' && steps.stop-build.outputs.result || 'false' }} + steps: + - name: Check if there is an open PR for this branch + id: stop-build + if: ${{ github.event_name == 'push' }} + uses: actions/github-script@v7 + env: + ORGANIZATION: mixxxdj + REPOSITORY: mixxx + with: + script: | + try { + const branch = context.ref.replace('refs/heads/', ''); + const { data: pullRequests } = await github.rest.pulls.list({ + owner: process.env.ORGANIZATION, + repo: process.env.REPOSITORY, + head: `${context.repo.owner}:${branch}`, + state: 'open' + }); + console.log(`There is ${pullRequests.length} PR open upstream for branch '${context.repo.owner}:${branch}'`); + return pullRequests.length != 0; + } catch (error) { + console.log(`Didn't find a PR for branch '${context.repo.owner}:${branch}' on '${process.env.ORGANIZATION}/${process.env.REPOSITORY}'.`); + return false; + } + + pre-commit: + if: needs.stop-build.outputs.result == 'false' + needs: + - stop-build + uses: ./.github/workflows/pre-commit.yml + with: + pull_request: ${{ github.event_name == 'pull_request' }} + + checks: + if: needs.stop-build.outputs.result == 'false' + needs: + - stop-build + uses: ./.github/workflows/checks.yml + + git: + if: github.event_name == 'pull_request' + uses: ./.github/workflows/git.yml + + build: + if: needs.stop-build.outputs.result == 'false' + needs: + - stop-build + uses: ./.github/workflows/build.yml + + # This task is used as a probe for auto merge + # In the future, it could also be used to perform a status update (e.g once the whole CI is passing + is ready for review, add a specific label such as `need review`) + ready: + name: Ready to merge + needs: + - pre-commit + - checks + - git + - build + runs-on: ubuntu-latest + steps: + - name: Ready to go + run: "exit 0" diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index aa75be8787d8..97e9302ed689 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -4,6 +4,10 @@ name: pre-commit on: workflow_call: + inputs: + pull_request: + type: boolean + default: false permissions: contents: read # to fetch code (actions/checkout) @@ -36,26 +40,19 @@ jobs: git config --global --add safe.directory "${GITHUB_WORKSPACE}" git config --global --list - - name: "Detect code style issues (push)" + - name: "Detect code style issues" uses: pre-commit/action@v3.0.1 - if: github.event_name == 'push' - # There are too many files in the repo that have formatting issues. We'll - # disable these checks for now when pushing directly (but still run these - # on Pull Requests!). env: - SKIP: clang-format,eslint,no-commit-to-branch - - - name: "Detect code style issues (pull_request)" - uses: pre-commit/action@v3.0.1 - if: github.event_name == 'pull_request' - env: - SKIP: no-commit-to-branch + # There are too many files in the repo that have formatting issues. We'll + # disable these checks for now when pushing directly (but still run these + # on Pull Requests!). + SKIP: ${{ inputs.pull_request && 'no-commit-to-branch' || 'clang-format,eslint,no-commit-to-branch' }} # https://github.com/paleite/eslint-plugin-diff?tab=readme-ov-file#ci-setup - ESLINT_PLUGIN_DIFF_COMMIT: ${{ github.event.pull_request.base.ref }} + ESLINT_PLUGIN_DIFF_COMMIT: ${{ inputs.pull_request && github.event.pull_request.base.ref || '' }} with: # HEAD is the not yet integrated PR merge commit +refs/pull/xxxx/merge # HEAD^1 is the PR target branch and HEAD^2 is the HEAD of the source branch - extra_args: --from-ref HEAD^1 --to-ref HEAD + extra_args: ${{ inputs.pull_request && '--from-ref HEAD^1 --to-ref HEAD' || '' }} - name: "Generate patch file" if: failure() diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml deleted file mode 100644 index 3be26454ed91..000000000000 --- a/.github/workflows/pull-request.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Pull request - -on: - pull_request: - types: - - opened - - synchronize - - reopened - - edited - -jobs: - pre-commit: - uses: ./.github/workflows/pre-commit.yml - - checks: - uses: ./.github/workflows/checks.yml - - git: - uses: ./.github/workflows/git.yml - - build: - uses: ./.github/workflows/build.yml - - # This task is used as a probe for auto merge - # In the future, it could also be used to perform a status update (e.g once the whole CI is passing + is ready for review, add a specific label such as `need review`) - ready: - name: Ready to merge - needs: - - pre-commit - - checks - - git - - build - runs-on: ubuntu-latest - steps: - - name: Ready to go - run: "exit 0" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d8a39c586c6..6a539cef4eb4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,12 @@ env: ACTIVE_VERSIONS: |- {"2.5": "2.6", "2.6": "main"} +# Global allowed scopes for all actions +permissions: + contents: write # to sync branches + pull-requests: write # to sync branches + checks: write # to create new checks (coverallsapp/github-action) + jobs: checks: uses: ./.github/workflows/checks.yml @@ -23,9 +29,22 @@ jobs: build: uses: ./.github/workflows/build.yml + with: + publish: true + secrets: + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY }} + DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY_PASSWORD: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY_PASSWORD }} + MACOS_CODESIGN_CERTIFICATE_P12_BASE64: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_P12_BASE64 }} + MACOS_CODESIGN_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }} + MACOS_NOTARIZATION_APP_SPECIFIC_PASSWORD: ${{ secrets.MACOS_NOTARIZATION_APP_SPECIFIC_PASSWORD }} + NETLIFY_BUILD_HOOK: ${{ secrets.NETLIFY_BUILD_HOOK }} + RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY: ${{ secrets.RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY }} sync: - if: ${{ github.ref != 'refs/heads/main' }} + if: ${{ github.ref != 'refs/heads/main' }} && ${{ github.repository == 'mixxxdj/mixxx' }} uses: ./.github/workflows/sync_branches.yml secrets: - pat_token: ${{ secrets.MIXXX_BRANCH_SYNC_PAT }} + MIXXX_BRANCH_SYNC_PAT: ${{ secrets.MIXXX_BRANCH_SYNC_PAT }} diff --git a/.github/workflows/sync_branches.yml b/.github/workflows/sync_branches.yml index 46312712ac3f..0b2ad00bc828 100644 --- a/.github/workflows/sync_branches.yml +++ b/.github/workflows/sync_branches.yml @@ -4,7 +4,7 @@ on: workflow_call: secrets: # PAT setup with content:write and pull_request:write - pat_token: + MIXXX_BRANCH_SYNC_PAT: required: true permissions: {} @@ -13,7 +13,8 @@ env: SYNC_COMMITTER_EMAIL: bot@mixxx.org SYNC_COMMITTER_NAME: Mixxx Bot - # This variable stores the map of Mixxx branches that still being developed. The key is the branch receiving support and the value is the next version in line + # This variable stores the map of Mixxx branches that still being developed. + # The key is the branch receiving support and the value is the next version in line # NOTE: this must be valid JSON! ACTIVE_VERSIONS: |- {"2.5": "2.6", "2.6": "main"} @@ -41,7 +42,7 @@ jobs: - name: "Check out repository" uses: actions/checkout@v4.1.7 with: - token: ${{ secrets.pat_token }} + token: ${{ secrets.MIXXX_BRANCH_SYNC_PAT }} fetch-depth: 0 persist-credentials: true @@ -99,7 +100,7 @@ jobs: FROM_BRANCH: ${{ github.ref_name }} TO_BRANCH: ${{ fromJSON(env.ACTIVE_VERSIONS)[github.ref_name] }} SYNC_BRANCH: sync-branch-${{ github.ref_name }}-to-${{ fromJSON(env.ACTIVE_VERSIONS)[github.ref_name] }} - GITHUB_TOKEN: ${{ secrets.pat_token }} + GITHUB_TOKEN: ${{ secrets.MIXXX_BRANCH_SYNC_PAT }} PULL_REQUEST_TITLE: Merge changes from `${{ github.ref_name }}` into `${{ fromJSON(env.ACTIVE_VERSIONS)[github.ref_name] }}` PULL_REQUEST_BODY: | New content has landed in the `${{ github.ref_name }}` branch, so let's merge the changes into `${{ fromJSON(env.ACTIVE_VERSIONS)[github.ref_name] }}` diff --git a/CHANGELOG.md b/CHANGELOG.md index e290833ce17b..6ccc67080c3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -331,6 +331,23 @@ * Fix: import proper QtQml.Models module instead of qmllabs [#14675](https://github.com/mixxxdj/mixxx/pull/14675) * qmlwaveform: Fix moc in Qt 6.9.0 [#14649](https://github.com/mixxxdj/mixxx/pull/14649) +## [2.5.3](https://github.com/mixxxdj/mixxx/milestone/50) (unreleased) + +### Controller Mappings + +* Traktor Kontrol S4 Mk3: tempo offset per deck [#14882](https://github.com/mixxxdj/mixxx/pull/14882) +* Traktor Kontrol S4 Mk3: don`t duplicate beatloop_activate behaviour [#14992](https://github.com/mixxxdj/mixxx/pull/14992) +* Traktor Kontrol S3: allow full library navigation [#14980](https://github.com/mixxxdj/mixxx/pull/14980) + +### Misc + +* Broadcast preferences: make setting string translatable [#15023](https://github.com/mixxxdj/mixxx/pull/15023) +* Sound Hardware preference: add (?) linking to Sound APIs in the manual [#14935](https://github.com/mixxxdj/mixxx/pull/14935) +* xwax: do not try to "correct" for drift in absolute mode. [#14960](https://github.com/mixxxdj/mixxx/pull/14960) +* Fix column header text assignment [#14944](https://github.com/mixxxdj/mixxx/pull/14944) +* Remove runtime assert to not risk crashes [#15000](https://github.com/mixxxdj/mixxx/pull/15000) +* Windows: Update build environment to Visual Studio 2022 [#15006](https://github.com/mixxxdj/mixxx/pull/15006) + ## [2.5.2](https://github.com/mixxxdj/mixxx/milestone/49) (2025-06-13) ### Library diff --git a/res/controllers/Traktor Kontrol S4 MK3.hid.xml b/res/controllers/Traktor Kontrol S4 MK3.hid.xml index dceb9eb79b63..69d65c1037b3 100644 --- a/res/controllers/Traktor Kontrol S4 MK3.hid.xml +++ b/res/controllers/Traktor Kontrol S4 MK3.hid.xml @@ -183,17 +183,30 @@ Defines the center range in mm where the rate snaps to 0. - + + + + diff --git a/res/controllers/Traktor-Kontrol-S4-MK3.js b/res/controllers/Traktor-Kontrol-S4-MK3.js index 600dcf712874..e3623c870bc3 100644 --- a/res/controllers/Traktor-Kontrol-S4-MK3.js +++ b/res/controllers/Traktor-Kontrol-S4-MK3.js @@ -82,9 +82,12 @@ const TempoFaderTicksPerMm = 4096 / 77; // 53.1948.. const TempoCenterRangeTicks = TempoFaderTicksPerMm * TempoCenterRangeMm; // Value center may be off the labeled center. // Use this setting to compensate per device. -const TempoCenterValueOffset = engine.getSetting("tempoCenterOffsetMm") || 0.0; -const TempoCenterUpper = (4096 / 2) + (TempoCenterRangeTicks / 2) + TempoCenterValueOffset; -const TempoCenterLower = (4096 / 2) - (TempoCenterRangeTicks / 2) + TempoCenterValueOffset; +const TempoCenterValueOffsetLeft = (engine.getSetting("tempoCenterOffsetMmLeft") || 0.0) * TempoFaderTicksPerMm; +const TempoCenterValueOffsetRright = (engine.getSetting("tempoCenterOffsetMmRight") || 0.0) * TempoFaderTicksPerMm; +const TempoCenterUpperLeft = (4096 / 2) + (TempoCenterRangeTicks / 2) + TempoCenterValueOffsetLeft; +const TempoCenterLowerLeft = (4096 / 2) - (TempoCenterRangeTicks / 2) + TempoCenterValueOffsetLeft; +const TempoCenterUpperRight = (4096 / 2) + (TempoCenterRangeTicks / 2) + TempoCenterValueOffsetRright; +const TempoCenterLowerRight = (4096 / 2) - (TempoCenterRangeTicks / 2) + TempoCenterValueOffsetRright; // Define whether or not to keep LED that have only one color (reverse, flux, play, shift) dimmed if they are inactive. // 'true' will keep them dimmed, 'false' will turn them off. Default: true @@ -425,7 +428,7 @@ class ComponentContainer extends Component { /* eslint no-redeclare: "off" */ class Deck extends ComponentContainer { - constructor(decks, colors) { + constructor(decks, colors, settings) { super(); if (typeof decks === "number") { this.group = Deck.groupForNumber(decks); @@ -443,6 +446,7 @@ class Deck extends ComponentContainer { } this.color = colors[0]; } + this.settings = settings; this.secondDeckModes = null; } toggleDeck() { @@ -1569,8 +1573,8 @@ class S4Mk3EffectUnit extends ComponentContainer { } class S4Mk3Deck extends Deck { - constructor(decks, colors, effectUnit, mixer, inReports, outReport, io) { - super(decks, colors); + constructor(decks, colors, settings, effectUnit, mixer, inReports, outReport, io) { + super(decks, colors, settings); this.playButton = new PlayButton({ output: InactiveLightsAlwaysBacklit ? undefined : Button.prototype.uncoloredOutput @@ -1630,19 +1634,21 @@ class S4Mk3Deck extends Deck { } : undefined, }); this.tempoFader = new Pot({ + deck: this, inKey: "rate", outKey: "rate", appliedValue: null, - + tempoCenterUpper: this.settings.tempoCenterUpper, + tempoCenterLower: this.settings.tempoCenterLower, input: function(value) { const receivingFirstValue = this.appliedValue === null; - if (value < TempoCenterLower) { + if (value < this.tempoCenterLower) { // scale input for lower range - this.appliedValue = script.absoluteLin(value, -1, 0, 0, TempoCenterLower); - } else if (value > TempoCenterUpper) { + this.appliedValue = script.absoluteLin(value, -1, 0, 0, this.tempoCenterLower); + } else if (value > this.tempoCenterUpper) { // scale input for upper range - this.appliedValue = script.absoluteLin(value, 0, 1, TempoCenterUpper, 4096); + this.appliedValue = script.absoluteLin(value, 0, 1, this.tempoCenterUpper, 4096); } else { // reset rate in center region this.appliedValue = 0; @@ -2993,7 +2999,10 @@ class S4MK3 { // so every single components' IO needs to be specified individually // for both decks. this.leftDeck = new S4Mk3Deck( - [1, 3], [DeckColors[0], DeckColors[2]], this.effectUnit1, this.mixer, + [1, 3], [DeckColors[0], DeckColors[2]], { + tempoCenterLower: TempoCenterLowerLeft, + tempoCenterUpper: TempoCenterUpperLeft, + }, this.effectUnit1, this.mixer, this.inReports, this.outReports[128], { playButton: {inByte: 4, inBit: 0, outByte: 55}, @@ -3043,7 +3052,10 @@ class S4MK3 { ); this.rightDeck = new S4Mk3Deck( - [2, 4], [DeckColors[1], DeckColors[3]], this.effectUnit2, this.mixer, + [2, 4], [DeckColors[1], DeckColors[3]], { + tempoCenterLower: TempoCenterLowerRight, + tempoCenterUpper: TempoCenterUpperRight, + }, this.effectUnit2, this.mixer, this.inReports, this.outReports[128], { playButton: {inByte: 12, inBit: 0, outByte: 66}, diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index cd52618b33fd..205e71f0cdd1 100644 --- a/res/linux/org.mixxx.Mixxx.metainfo.xml +++ b/res/linux/org.mixxx.Mixxx.metainfo.xml @@ -96,7 +96,7 @@ Do not edit it manually. --> - +

STEM file support @@ -1076,6 +1076,56 @@ #14649 + + + + +

+ Controller Mappings +

+
    +
  • + Traktor Kontrol S4 Mk3: tempo offset per deck + #14882 +
  • +
  • + Traktor Kontrol S4 Mk3: don`t duplicate beatloop_activate behaviour + #14992 +
  • +
  • + Traktor Kontrol S3: allow full library navigation + #14980 +
  • +
+

+ Misc +

+
    +
  • + Broadcast preferences: make setting string translatable + #15023 +
  • +
  • + Sound Hardware preference: add (?) linking to Sound APIs in the manual + #14935 +
  • +
  • + xwax: do not try to "correct" for drift in absolute mode. + #14960 +
  • +
  • + Fix column header text assignment + #14944 +
  • +
  • + Remove runtime assert to not risk crashes + #15000 +
  • +
  • + Windows: Update build environment to Visual Studio 2022 + #15006 +
  • +
diff --git a/res/translations/mixxx.ts b/res/translations/mixxx.ts index c7780c587ab6..9d95bfeea2fb 100644 --- a/res/translations/mixxx.ts +++ b/res/translations/mixxx.ts @@ -4740,122 +4740,128 @@ You tried to learn: %1,%2 DlgPrefBroadcast - + Icecast 2 - + Shoutcast 1 - + Icecast 1 - + MP3 - + Ogg Vorbis - + Opus - + AAC - + HE-AAC - + HE-AACv2 - + Automatic - + Mono - + Stereo - - - - + + + + Action failed - + You can't create more than %1 source connections. - + Source connection %1 - + + Settings for %1 + Settings for broadcast profile, %1 is the profile name placeholder + + + + At least one source connection is required. - + Are you sure you want to disconnect every active source connection? - - + + Confirmation required - + '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server that have the same mountpoint can not be enabled simultaneously. - + Are you sure you want to delete '%1'? - + Renaming '%1' - + New name for '%1': - + Can't rename '%1' to '%2': name already in use diff --git a/src/preferences/dialog/dlgprefbroadcast.cpp b/src/preferences/dialog/dlgprefbroadcast.cpp index e259a043f523..42633cbcbd03 100644 --- a/src/preferences/dialog/dlgprefbroadcast.cpp +++ b/src/preferences/dialog/dlgprefbroadcast.cpp @@ -18,7 +18,6 @@ #include "util/logger.h" namespace { -const char* kSettingsGroupHeader = "Settings for %1"; constexpr int kColumnEnabled = 0; constexpr int kColumnName = 1; const mixxx::Logger kLogger("DlgPrefBroadcast"); @@ -417,9 +416,8 @@ void DlgPrefBroadcast::getValuesFromProfile(BroadcastProfilePtr profile) { } // Set groupbox header - QString headerText = - QString(tr(kSettingsGroupHeader)) - .arg(profile->getProfileName()); + //: Settings for broadcast profile, %1 is the profile name placeholder + const QString headerText = tr("Settings for %1").arg(profile->getProfileName()); groupBoxProfileSettings->setTitle(headerText); rbPasswordCleartext->setChecked(!profile->secureCredentialStorage()); diff --git a/src/waveform/renderers/allshader/waveformrenderertextured.cpp b/src/waveform/renderers/allshader/waveformrenderertextured.cpp index f114e7a2f0e6..6245204825f8 100644 --- a/src/waveform/renderers/allshader/waveformrenderertextured.cpp +++ b/src/waveform/renderers/allshader/waveformrenderertextured.cpp @@ -23,7 +23,7 @@ QString WaveformRendererTextured::fragShaderForType(::WaveformWidgetType::Type t default: break; } - assert(false); + DEBUG_ASSERT(!"unsupported WaveformWidgetType"); return QString(); } diff --git a/src/waveform/vsyncthread.cpp b/src/waveform/vsyncthread.cpp index 50709e43c5c0..175435a26167 100644 --- a/src/waveform/vsyncthread.cpp +++ b/src/waveform/vsyncthread.cpp @@ -64,13 +64,13 @@ void VSyncThread::run() { runTimer(); break; default: - assert(false); + DEBUG_ASSERT(!"unsupported sync mode"); break; } } void VSyncThread::runFree() { - assert(m_vSyncMode == ST_FREE); + DEBUG_ASSERT(m_vSyncMode == ST_FREE); while (m_bDoRendering) { // for benchmark only! @@ -87,7 +87,7 @@ void VSyncThread::runFree() { } void VSyncThread::runPLL() { - assert(m_vSyncMode == ST_PLL); + DEBUG_ASSERT(m_vSyncMode == ST_PLL); qint64 offsetAdjustedAt = 0; qint64 offset = 0; qint64 nextSwapMicros = 0; @@ -180,7 +180,7 @@ void VSyncThread::runPLL() { } void VSyncThread::runTimer() { - assert(m_vSyncMode == ST_TIMER); + DEBUG_ASSERT(m_vSyncMode == ST_TIMER); while (m_bDoRendering) { emit vsyncRender(); // renders the new waveform. diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index 630c2d63a436..015ee7125fb6 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -1405,7 +1405,7 @@ Qt::Alignment WaveformWidgetFactory::toUntilMarkAlign(int index) { case 2: return Qt::AlignBottom; } - assert(false); + DEBUG_ASSERT(!"unsupported align"); return Qt::AlignVCenter; } // static @@ -1420,7 +1420,7 @@ int WaveformWidgetFactory::toUntilMarkAlignIndex(Qt::Alignment align) { default: break; } - assert(false); + DEBUG_ASSERT(!"unsupported align index"); return 1; } // static @@ -1431,7 +1431,7 @@ float WaveformWidgetFactory::toUntilMarkTextHeightLimit(int index) { case 1: return 1.f; } - assert(false); + DEBUG_ASSERT(!"unsupported height limit"); return 0.33f; } // static @@ -1442,6 +1442,6 @@ int WaveformWidgetFactory::toUntilMarkTextHeightLimitIndex(float value) { if (value == 1.f) { return 1; } - assert(false); + DEBUG_ASSERT(!"unsupported height limit"); return 0; }