Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
349695c
Merge remote-tracking branch 'upstream/main' into abletonlink2
JoergAtGithub Dec 9, 2025
cd1a363
Support Android build
JoergAtGithub Dec 9, 2025
cda198f
Added explicit destructor to release COs and Link in defined order
JoergAtGithub Dec 9, 2025
e7612a6
Remove unused member vars and surrounding code
JoergAtGithub Dec 9, 2025
058ccdb
Added new constant expression kNumPointsInHostTimeFilter in anonymous…
JoergAtGithub Dec 9, 2025
247abde
Removed unused function arguments
JoergAtGithub Dec 9, 2025
75d676e
Merge remote-tracking branch 'upstream/main' into abletonlink2
JoergAtGithub Feb 10, 2026
854b7d9
Implemented AbletonLink widgets for Tango
JoergAtGithub Feb 10, 2026
7b36120
Add AbletonLink widgets to Deere skin
JoergAtGithub Feb 10, 2026
8e1b43d
Added minimal LINK widgets to Shade skin
JoergAtGithub Feb 10, 2026
ed68fc9
Implement a setting in the sound preferences, to apply a manual sync …
JoergAtGithub Feb 15, 2026
64ef6ef
Apply suggestions from code review
JoergAtGithub Mar 14, 2026
3d4e84e
Merge remote-tracking branch 'upstream/main' into abletonlink2
JoergAtGithub Mar 14, 2026
af17306
Fix flatpack builds
JoergAtGithub Mar 14, 2026
37b47f8
Adjusted order of private vars and private methods in header
JoergAtGithub Mar 14, 2026
e68344c
Added good detailed comment for non obvious isPlaying method
JoergAtGithub May 4, 2026
ff2628f
Change destruction order in AbletonLink destructor
JoergAtGithub May 4, 2026
f760a06
Remove unnecessary kDefaultBpm. m_oldTempo now uses default Bpm initi…
JoergAtGithub May 5, 2026
3bba07c
Improve comments to explain the determinition of the nearly-jitter fr…
JoergAtGithub May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,7 @@ add_library(
src/engine/sidechain/enginesidechain.cpp
src/engine/sidechain/networkinputstreamworker.cpp
src/engine/sidechain/networkoutputstreamworker.cpp
src/engine/sync/abletonlink.cpp
src/engine/sync/enginesync.cpp
src/engine/sync/internalclock.cpp
src/engine/sync/synccontrol.cpp
Expand Down Expand Up @@ -1909,6 +1910,7 @@ set(
src/util/font.h
src/util/fpclassify.h
src/util/gitinfostore.h
src/util/hosttimefilter.h
src/util/imagefiledata.h
src/util/imageutils.h
src/util/indexrange.h
Expand Down Expand Up @@ -2158,6 +2160,7 @@ if(MSVC)
target_compile_definitions(
mixxx-lib
PUBLIC
WIN32_LEAN_AND_MEAN
_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING
_CRT_SECURE_NO_WARNINGS
)
Expand Down Expand Up @@ -2251,6 +2254,9 @@ if(WIN32)
# _WIN32_WINNT_WIN7 = 0x0601
target_compile_definitions(mixxx-lib PUBLIC WINVER=0x0601)
target_compile_definitions(mixxx-lib PUBLIC _WIN32_WINNT=0x0601)
# Exclude Win32 APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets where including Windows.h.
# This prevents "Winsock.h already included", when compiling the ASIO dependency of Ableton Link.
target_compile_definitions(mixxx-lib PUBLIC WIN32_LEAN_AND_MEAN)
if(MSVC)
target_compile_definitions(mixxx-lib PUBLIC _USE_MATH_DEFINES)
endif()
Expand Down Expand Up @@ -3183,6 +3189,43 @@ if(WIN32)
target_include_directories(mixxx PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
endif()

# Ableton Link
find_package(
AbletonLink
NAMES AbletonLink ableton ableton-link ableton-link-dev
)
# Note Debian Bug#993999 - Wrong CMake include path: https://salsa.debian.org/multimedia-team/ableton-link/-/commit/047f75abeeb6494256cb8d498995c17afd2a17e8

if(AbletonLink_FOUND)
message(STATUS "Using existing system installation of Ableton Link")
target_link_libraries(mixxx-lib PUBLIC Ableton::Link)
else()
message(STATUS "Fetch Ableton Link from GitHub")
include(FetchContent)

set(FETCHCONTENT_QUIET FALSE)

FetchContent_Declare(
AbletonLink
GIT_REPOSITORY https://github.com/Ableton/link.git
GIT_TAG Link-3.0.6
)
FetchContent_MakeAvailable(AbletonLink)

include(${abletonlink_SOURCE_DIR}/AbletonLinkConfig.cmake)
target_link_libraries(mixxx-lib PUBLIC Ableton::Link)
target_include_directories(
mixxx-lib
SYSTEM
PUBLIC ${abletonlink_SOURCE_DIR}/include/
)
endif()

# Ensure Ableton Link headers see LINK_PLATFORM_LINUX set
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
target_compile_definitions(mixxx-lib PUBLIC LINK_PLATFORM_LINUX=1)
endif()

# Chromaprint
find_package(Chromaprint)
if(NOT Chromaprint_FOUND)
Expand Down
40 changes: 40 additions & 0 deletions packaging/flatpak/modules/ableton-link.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: ableton-link
buildsystem: simple
build-commands:
- cp -r include/ableton ${FLATPAK_DEST}/include/
- install -d ${FLATPAK_DEST}/lib/cmake/AbletonLink
- |
cat > ${FLATPAK_DEST}/lib/cmake/AbletonLink/AbletonLinkConfig.cmake << 'EOF'
if(TARGET Ableton::Link)
return()
endif()
add_library(Ableton::Link INTERFACE IMPORTED)
get_filename_component(_ableton_link_prefix "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)
set_target_properties(Ableton::Link PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_ableton_link_prefix}/include"
)
if(UNIX AND NOT APPLE)
include(CMakeFindDependencyMacro)
find_dependency(Threads)
set_property(TARGET Ableton::Link APPEND PROPERTY
INTERFACE_LINK_LIBRARIES Threads::Threads)
set_property(TARGET Ableton::Link APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS LINK_PLATFORM_LINUX=1)
endif()
unset(_ableton_link_prefix)
EOF
sources:
- type: archive
url: https://github.com/Ableton/link/archive/refs/tags/Link-3.0.6.tar.gz
sha256: 4f4fae68bd9351cba603f07990b0d1d9cd7f986c1c78f748d97168c8ae5269b2
dest-filename: ableton-link.tar.gz
x-checker-data:
type: anitya
project-id: 227486
stable-only: true
url-template: https://github.com/Ableton/link/archive/refs/tags/Link-$version.tar.gz
cleanup:
- /include
- /lib/cmake
post-install:
- install -Dm644 -t ${FLATPAK_DEST}/share/licenses/ableton-link LICENSE.md
14 changes: 14 additions & 0 deletions packaging/flatpak/modules/asio.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: asio
buildsystem: simple
build-commands:
- cp -r asio/include/asio ${FLATPAK_DEST}/include/
- cp asio/include/asio.hpp ${FLATPAK_DEST}/include/
sources:
- type: archive
url: https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-28-0.tar.gz
sha256: 226438b0798099ad2a202563a83571ce06dd13b570d8fded4840dbc1f97fa328
dest-filename: asio.tar.gz
cleanup:
- /include
post-install:
- install -Dm644 -t ${FLATPAK_DEST}/share/licenses/asio asio/LICENSE_1_0.txt
2 changes: 2 additions & 0 deletions packaging/flatpak/org.mixxx.Mixxx.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ modules:
- modules/portmidi.yaml
- modules/hidapi.yaml
- modules/chromaprint.yaml
- modules/asio.yaml
- modules/ableton-link.yaml
- modules/rubberband.yaml
- modules/soundtouch.yaml
- modules/libid3tag.yaml
Expand Down
8 changes: 8 additions & 0 deletions res/skins/Deere/style.qss
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,14 @@ WBeatSpinBox,

/* End spacing for toolbar */

#AbletonLinkWidget {
qproperty-layoutAlignment: 'AlignLeft | AlignVCenter';
}

#AbletonLinkPeers {
color: #D2D2D2;
}

#Time {
font: bold 13px;
}
Expand Down
33 changes: 33 additions & 0 deletions res/skins/Deere/tool_bar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,39 @@
<SizePolicy>min,min</SizePolicy>
<Children>

<!-- Ableton Link Widget -->
<WidgetGroup>
<ObjectName>AbletonLinkWidget</ObjectName>
<Layout>horizontal</Layout>
<SizePolicy>min,min</SizePolicy>
<Children>
<Template src="skin:left_2state_button.xml">
<SetVariable name="TooltipId">sync_enabled</SetVariable>
<SetVariable name="ObjectName">ToolbarButton</SetVariable>
<SetVariable name="MinimumSize">38,22</SetVariable>
<SetVariable name="MaximumSize">38,22</SetVariable>
<SetVariable name="SizePolicy">f,f</SetVariable>
<SetVariable name="state_0_text">Link</SetVariable>
<SetVariable name="state_1_text">Link</SetVariable>
<SetVariable name="left_connection_control">[AbletonLink],sync_enabled</SetVariable>
</Template>

<Number>
<TooltipId>num_peers</TooltipId>
<ObjectName>AbletonLinkPeers</ObjectName>
<Size>25f,22f</Size>
<NumberOfDigits>0</NumberOfDigits>
<Alignment>center</Alignment>
<Connection>
<ConfigKey>[AbletonLink],num_peers</ConfigKey>
</Connection>
</Number>

<WidgetGroup><Size>10f,0min</Size></WidgetGroup>
</Children>
</WidgetGroup>
<!-- /Ableton Link Widget -->

<WidgetGroup>
<TooltipId>recording_duration</TooltipId>
<Layout>horizontal</Layout>
Expand Down
3 changes: 3 additions & 0 deletions res/skins/LateNight/style_palemoon.qss
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,9 @@ WTrackProperty[selected="true"],
padding: 0px 2px 0px 2px;
}
#BatteryBox,
#AbletonLinkPeers{
color: #d2d2d2;
}
#ClockWidget {
margin-bottom: 1px;
}
Expand Down
28 changes: 28 additions & 0 deletions res/skins/LateNight/toolbar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,34 @@
</Connection>
</StatusLight>

<WidgetGroup>
<ObjectName>AbletonLinkWidget</ObjectName>
<Layout>horizontal</Layout>
<SizePolicy>min,min</SizePolicy>
<Children>
<Template src="skin:/controls/button_2state_persist.xml">
<SetVariable name="TooltipId">sync_enabled</SetVariable>
<SetVariable name="ObjectName">GuiToggleButton</SetVariable>
<SetVariable name="Size">35f,20f</SetVariable>
<SetVariable name="state_0_text">Link</SetVariable>
<SetVariable name="state_1_text">Link</SetVariable>
<SetVariable name="ConfigKey">[AbletonLink],sync_enabled</SetVariable>
</Template>
<Number>
<TooltipId>num_peers</TooltipId>
<ObjectName>AbletonLinkPeers</ObjectName>
<Size>25f,0min</Size>
<NumberOfDigits>0</NumberOfDigits>
<Alignment>center</Alignment>
<Connection>
<ConfigKey>[AbletonLink],num_peers</ConfigKey>
</Connection>
</Number>
</Children>
</WidgetGroup>

<WidgetGroup><Size>100f,1min</Size></WidgetGroup>

<WidgetGroup>
<ObjectName>ClockWidget</ObjectName>
<Layout>horizontal</Layout>
Expand Down
39 changes: 39 additions & 0 deletions res/skins/Shade/mixer_panel.xml
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,45 @@
</Connection>
</Knob>

<!--
**********************************************
Ableton Link Widget
**********************************************
-->
<PushButton>
<ObjectName>AbletonLinkButton</ObjectName>
<NumberStates>2</NumberStates>
<State>
<Number>0</Number>
<Text>LINK</Text>
<Pressed></Pressed>
<Unpressed></Unpressed>
</State>
<State>
<Number>1</Number>
<Text>LINK</Text>
<Pressed></Pressed>
<Unpressed></Unpressed>
</State>
<Size>20f,18f</Size>
<Pos>13,0</Pos>
<Connection>
<ConfigKey>[AbletonLink],sync_enabled</ConfigKey>
</Connection>
</PushButton>

<Number>
<TooltipId>num_peers</TooltipId>
<ObjectName>AbletonLinkPeers</ObjectName>
<Size>10f,18f</Size>
<Pos>34,0</Pos>
<Alignment>center</Alignment>
<NumberOfDigits>0</NumberOfDigits>
<Connection>
<ConfigKey>[AbletonLink],num_peers</ConfigKey>
</Connection>
</Number>

<!--
**********************************************
Button - Headphone split cue
Expand Down
14 changes: 14 additions & 0 deletions res/skins/Shade/style.qss
Original file line number Diff line number Diff line change
Expand Up @@ -1099,3 +1099,17 @@ WRateRange {
font-size: 10px;
qproperty-alignment: 'AlignCenter';
}

/* Ableton Link Widgets */

#AbletonLinkButton {
font-size: 8px;
font-weight: bold;
color: #000000;
}

#AbletonLinkPeers {
font-size: 8px;
font-weight: bold;
color: #D2D2D2;
}
10 changes: 9 additions & 1 deletion res/skins/Tango/style.qss
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,14 @@ WWidgetGroup {
color: #999;
}

#AbletonLinkPeers {
color: #d2d2d2;
}

#AbletonLinkWidget {
qproperty-layoutAlignment: 'AlignLeft | AlignVCenter';
}

#ClockBox {
qproperty-layoutAlignment: 'AlignVCenter | AlignHCenter';
padding: 2px 0px;
Expand Down Expand Up @@ -3296,7 +3304,7 @@ WTrackTableViewHeader QMenu::indicator:unchecked:selected,
WEffectSelector::indicator:unchecked,
WEffectSelector::indicator:unchecked:selected,
WEffectChainPresetSelector::indicator::unchecked,
WEffectChainPresetSelector::indicator::unchecked:selected,
WEffectChainPresetSelector::indicator:unchecked:selected,
#fadeModeCombobox::indicator:unchecked,
#fadeModeCombobox::indicator:unchecked:selected {
image: none;
Expand Down
28 changes: 28 additions & 0 deletions res/skins/Tango/topbar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,34 @@ Description:

<WidgetGroup><Size>0me,1min</Size></WidgetGroup>

<WidgetGroup><!-- Ableton Link -->
<ObjectName>AbletonLinkWidget</ObjectName>
<Layout>horizontal</Layout>
<SizePolicy>min,min</SizePolicy>
<Children>
<Template src="skins:Tango/controls/button_2state_persist.xml">
<SetVariable name="TooltipId">sync_enabled</SetVariable>
<SetVariable name="ObjectName">GuiToggleButton</SetVariable>
<SetVariable name="Size">35f,20f</SetVariable>
<SetVariable name="state_0_text">Link</SetVariable>
<SetVariable name="state_1_text">Link</SetVariable>
<SetVariable name="ConfigKey">[AbletonLink],sync_enabled</SetVariable>
</Template>
<Number>
<TooltipId>num_peers</TooltipId>
<ObjectName>AbletonLinkPeers</ObjectName>
<Size>25f,0min</Size>
<NumberOfDigits>0</NumberOfDigits>
<Alignment>center</Alignment>
<Connection>
<ConfigKey>[AbletonLink],num_peers</ConfigKey>
</Connection>
</Number>
</Children>
</WidgetGroup><!-- /Ableton Link -->

<WidgetGroup><Size>10f,1min</Size></WidgetGroup>

<WidgetGroup><!-- Skin toggles, hidden with maximized library -->
<Layout>horizontal</Layout>
<ObjectName>SkinControlsBar</ObjectName>
Expand Down
12 changes: 12 additions & 0 deletions src/controllers/controlpickermenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,18 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Decrease internal Leader BPM by 0.1"),
pSyncMenu);
pSyncMenu->addSeparator();
addControl("[AbletonLink]",
"sync_enabled",
tr("Link button"),
tr("Joins or disconnect from Ableton Link session"),
pSyncMenu);
addControl("[AbletonLink]",
"num_peers",
tr("Ableton Link number of peers"),
tr("Number of connected Ableton Link peers"),
pSyncMenu);

pSyncMenu->addSeparator();
addDeckAndSamplerControl("sync_leader",
tr("Sync Leader"),
tr("Sync mode 3-state toggle / indicator (Off, Soft Leader, "
Expand Down
4 changes: 4 additions & 0 deletions src/engine/enginebuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1639,6 +1639,10 @@ mixxx::audio::FramePos EngineBuffer::getTrackEndPosition() const {
m_pTrackSamples->get());
}

double EngineBuffer::getTrackSampleRate() const {
return m_pTrackSampleRate->get();
}

void EngineBuffer::setTrackEndPosition(mixxx::audio::FramePos position) {
m_pTrackSamples->set(position.toEngineSamplePosMaybeInvalid());
}
Expand Down
Loading
Loading