From bd16c0e315d4408b35715164f5ec8ea7ef5f2a2e Mon Sep 17 00:00:00 2001 From: =?utf8?q?IOhannes=20m=20zm=C3=B6lnig=20=28Debian/GNU=29?= Date: Sat, 25 Jan 2025 15:50:56 +0100 Subject: [PATCH] New upstream version 2.5.0+ds --- .dockerignore | 4 +- CMakeLists.txt | 41 +- Dockerfile | 4 +- build | 23 +- build-aux/flatpak/org.jacktrip.JackTrip.json | 1 + docs/Build/Linux.md | 87 +- docs/Build/Mac.md | 29 + docs/Build/Windows.md | 26 + docs/changelog.yml | 16 + externals/oscpp/CMakeLists.txt | 14 + externals/oscpp/LICENSE | 23 + externals/oscpp/Makefile | 28 + externals/oscpp/README.md | 274 +++ externals/oscpp/doxygen.cfg | 938 +++++++++ externals/oscpp/include/oscpp/client.hpp | 368 ++++ .../oscpp/include/oscpp/detail/endian.hpp | 82 + externals/oscpp/include/oscpp/detail/host.hpp | 118 ++ .../oscpp/include/oscpp/detail/stream.hpp | 365 ++++ externals/oscpp/include/oscpp/error.hpp | 87 + externals/oscpp/include/oscpp/print.hpp | 183 ++ externals/oscpp/include/oscpp/server.hpp | 493 +++++ externals/oscpp/include/oscpp/types.hpp | 59 + externals/oscpp/include/oscpp/util.hpp | 159 ++ externals/oscpp/test/CMakeLists.txt | 42 + externals/oscpp/test/oscpp_autocheck.cpp | 657 +++++++ externals/oscpp/tools/clang-format | 22 + externals/oscpp/tools/mdcode.rb | 24 + jacktrip.pro | 15 + linux/Dockerfile.build | 79 + linux/README.md | 11 +- .../Contents/Info.plist | 36 + macos/JackTrip.vst3_template/Contents/PkgInfo | 1 + macos/assemble_app.sh | 31 +- .../JackTrip.pkgproj_template_with_vst3 | 1740 +++++++++++++++++ macos/package/postinstall.sh | 2 +- macos/sign-stuff.sh | 1 + meson.build | 224 ++- meson_options.txt | 8 +- src/Analyzer.cpp | 2 +- src/AudioInterface.cpp | 72 +- src/AudioInterface.h | 23 +- src/AudioSocket.cpp | 738 +++++++ src/AudioSocket.h | 280 +++ src/Compressor.cpp | 2 +- src/JackTrip.cpp | 16 +- src/JackTrip.h | 29 +- src/JackTripWorker.h | 9 + src/JitterBuffer.h | 3 + src/Limiter.cpp | 2 +- src/Meter.cpp | 2 +- src/Monitor.cpp | 2 +- src/OscServer.cpp | 143 ++ src/OscServer.h | 100 + src/ProcessPlugin.h | 17 +- src/Regulator.cpp | 75 +- src/Regulator.h | 11 +- src/Reverb.cpp | 2 +- src/RingBuffer.cpp | 14 + src/RingBuffer.h | 8 + src/RtAudioInterface.cpp | 159 +- src/RtAudioInterface.h | 14 +- src/SampleRateConverter.cpp | 141 ++ src/SampleRateConverter.h | 78 + src/Settings.cpp | 49 +- src/SocketClient.cpp | 89 + src/SocketClient.h | 89 + src/SocketServer.cpp | 140 ++ src/SocketServer.h | 89 + src/StereoToMono.cpp | 2 +- src/Tone.cpp | 2 +- src/UdpHubListener.cpp | 15 + src/UdpHubListener.h | 14 + src/Volume.cpp | 2 +- src/gui/about.cpp | 2 +- src/gui/about.ui | 2 +- src/gui/qjacktrip.cpp | 55 +- src/gui/qjacktrip.ui | 2 +- src/images/images.qrc | 1 + src/jacktrip_globals.h | 10 +- src/vs/AudioSettings.qml | 30 +- src/vs/ChangeDevices.qml | 157 +- src/vs/FeedbackSurvey.qml | 4 + src/vs/Settings.qml | 80 +- src/vs/WebEngine.qml | 2 +- src/vs/balance.svg | 20 + src/vs/virtualstudio.cpp | 258 ++- src/vs/virtualstudio.h | 25 +- src/vs/vs.qrc | 1 + src/vs/vsApi.cpp | 41 +- src/vs/vsApi.h | 2 + src/vs/vsAudio.cpp | 108 +- src/vs/vsAudio.h | 24 +- src/vs/vsAuth.cpp | 64 +- src/vs/vsAuth.h | 9 + src/vs/vsDeeplink.cpp | 150 +- src/vs/vsDeeplink.h | 65 +- src/vs/vsDevice.cpp | 34 +- src/vs/vsDevice.h | 4 +- src/vs/vsMacPermissions.mm | 2 + src/vs/vsPinger.cpp | 5 +- src/vs/vsPinger.h | 2 + src/vs/vsQuickView.cpp | 6 +- src/vs/vsQuickView.h | 2 + src/vs/vsWebSocket.cpp | 10 +- src/vs/vsWebSocket.h | 1 + src/vst3/JackTripVST.h | 59 + src/vst3/JackTripVSTController.cpp | 235 +++ src/vst3/JackTripVSTController.h | 97 + src/vst3/JackTripVSTDataBlock.h | 51 + src/vst3/JackTripVSTEntry.cpp | 87 + src/vst3/JackTripVSTProcessor.cpp | 593 ++++++ src/vst3/JackTripVSTProcessor.h | 128 ++ src/vst3/resources/Dual_LED.png | Bin 0 -> 13198 bytes src/vst3/resources/JackTripEditor.uidesc | 373 ++++ src/vst3/resources/Sercan_Moog_Knob.png | Bin 0 -> 567056 bytes src/vst3/resources/background.png | Bin 0 -> 124749 bytes src/vst3/resources/background_2x.png | Bin 0 -> 538360 bytes src/vst3/resources/moduleinfo.json | 43 + src/vst3/resources/win32resource.rc | 44 + subprojects/libsamplerate.wrap | 8 + tests/audio_socket_test.cpp | 98 + win/build_installer.bat | 24 +- win/jacktrip-vst3.wxs | 71 + win/jacktrip.wxs | 12 + 124 files changed, 11239 insertions(+), 610 deletions(-) create mode 100644 externals/oscpp/CMakeLists.txt create mode 100644 externals/oscpp/LICENSE create mode 100644 externals/oscpp/Makefile create mode 100644 externals/oscpp/README.md create mode 100644 externals/oscpp/doxygen.cfg create mode 100644 externals/oscpp/include/oscpp/client.hpp create mode 100644 externals/oscpp/include/oscpp/detail/endian.hpp create mode 100644 externals/oscpp/include/oscpp/detail/host.hpp create mode 100644 externals/oscpp/include/oscpp/detail/stream.hpp create mode 100644 externals/oscpp/include/oscpp/error.hpp create mode 100644 externals/oscpp/include/oscpp/print.hpp create mode 100644 externals/oscpp/include/oscpp/server.hpp create mode 100644 externals/oscpp/include/oscpp/types.hpp create mode 100644 externals/oscpp/include/oscpp/util.hpp create mode 100644 externals/oscpp/test/CMakeLists.txt create mode 100644 externals/oscpp/test/oscpp_autocheck.cpp create mode 100755 externals/oscpp/tools/clang-format create mode 100755 externals/oscpp/tools/mdcode.rb create mode 100644 linux/Dockerfile.build create mode 100644 macos/JackTrip.vst3_template/Contents/Info.plist create mode 100644 macos/JackTrip.vst3_template/Contents/PkgInfo create mode 100644 macos/package/JackTrip.pkgproj_template_with_vst3 create mode 100644 src/AudioSocket.cpp create mode 100644 src/AudioSocket.h create mode 100644 src/OscServer.cpp create mode 100644 src/OscServer.h create mode 100644 src/SampleRateConverter.cpp create mode 100644 src/SampleRateConverter.h create mode 100644 src/SocketClient.cpp create mode 100644 src/SocketClient.h create mode 100644 src/SocketServer.cpp create mode 100644 src/SocketServer.h create mode 100644 src/vs/balance.svg create mode 100644 src/vst3/JackTripVST.h create mode 100644 src/vst3/JackTripVSTController.cpp create mode 100644 src/vst3/JackTripVSTController.h create mode 100644 src/vst3/JackTripVSTDataBlock.h create mode 100644 src/vst3/JackTripVSTEntry.cpp create mode 100644 src/vst3/JackTripVSTProcessor.cpp create mode 100644 src/vst3/JackTripVSTProcessor.h create mode 100644 src/vst3/resources/Dual_LED.png create mode 100644 src/vst3/resources/JackTripEditor.uidesc create mode 100644 src/vst3/resources/Sercan_Moog_Knob.png create mode 100644 src/vst3/resources/background.png create mode 100644 src/vst3/resources/background_2x.png create mode 100644 src/vst3/resources/moduleinfo.json create mode 100644 src/vst3/resources/win32resource.rc create mode 100644 subprojects/libsamplerate.wrap create mode 100644 tests/audio_socket_test.cpp create mode 100644 win/jacktrip-vst3.wxs diff --git a/.dockerignore b/.dockerignore index b517c8e..a2c033a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,7 +2,9 @@ !docs !meson* !container +!externals !src !subprojects !linux -!win \ No newline at end of file +!win +!tests diff --git a/CMakeLists.txt b/CMakeLists.txt index e4db93d..442eaaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.12) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) +set(CMAKE_OSX_ARCHITECTURES arm64;x86_64) set(CMAKE_CXX_STANDARD 17) project(QJackTrip) @@ -7,14 +8,16 @@ set(nogui FALSE) set(rtaudio TRUE) set(weakjack TRUE) set(novs FALSE) +set(nooscpp FALSE) set(vsftux FALSE) set(noupdater FALSE) set(psi FALSE) -set(QtVersion "5") +set(QtVersion "6") if (${QtVersion} MATCHES "5") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13) - set(CMAKE_OSX_ARCHITECTURES arm64;x86_64) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + list(APPEND CMAKE_PREFIX_PATH "/opt/local/libexec/qt6/lib/cmake") endif () message(STATUS "Hello Aaron! For anyone else, heed the following warning:") @@ -55,9 +58,10 @@ if (psi) endif () file(READ "${QRC_FILE}" QRC_CONTENTS) - string(REPLACE "about@2x.png" "alt/about@2x.png" QRC_CONTENTS "${QRC_CONTENTS}") - string(REPLACE "about.png" "alt/about.png" QRC_CONTENTS "${QRC_CONTENTS}") - string(REPLACE "icon.png" "alt/icon.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "icon_256.png" "../gui/alt/icon_256.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "icon_256.png" "../gui/alt/icon_256.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "icon_128.png" "../gui/alt/icon_128.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "icon_32.png" "../gui/alt/icon_32.png" QRC_CONTENTS "${QRC_CONTENTS}") file(WRITE "${QRC_FILE}" "${QRC_CONTENTS}") string(TIMESTAMP BUILD_DATE "%Y%m%d") set(BUILD_NUMBER "00") @@ -65,9 +69,10 @@ if (psi) add_compile_definitions(NDEBUG) else () file(READ "${QRC_FILE}" QRC_CONTENTS) - string(REPLACE "alt/about@2x.png" "about@2x.png" QRC_CONTENTS "${QRC_CONTENTS}") - string(REPLACE "alt/about.png" "about.png" QRC_CONTENTS "${QRC_CONTENTS}") - string(REPLACE "alt/icon.png" "icon.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "../gui/alt/icon_256.png" "icon_256.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "../gui/alt/icon_256.png" "icon_256.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "../gui/alt/icon_128.png" "icon_128.png" QRC_CONTENTS "${QRC_CONTENTS}") + string(REPLACE "../gui/alt/icon_32.png" "icon_32.png" QRC_CONTENTS "${QRC_CONTENTS}") file(WRITE "${QRC_FILE}" "${QRC_CONTENTS}") endif () @@ -87,7 +92,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows") file(GLOB QtDirs "C:/Qt/${QtVersion}.*.*/mingw*_64") list(GET QtDirs 0 QtDir) message(STATUS "Using Qt found at ${QtDir}") - set (CMAKE_PREFIX_PATH "${QtDir}") + list(APPEND CMAKE_PREFIX_PATH "${QtDir}") if (rtaudio) include_directories("C:/Program Files (x86)/RtAudio/include") set (rtaudiolib "C:/Program Files (x86)/RtAudio/lib/librtaudio.dll.a") @@ -132,6 +137,8 @@ find_package(${QtVersion}Network CONFIG REQUIRED) set(qjacktrip_SRC src/main.cpp src/Settings.cpp + src/SocketClient.cpp + src/SocketServer.cpp src/jacktrip_globals.cpp src/JackTrip.cpp src/UdpHubListener.cpp @@ -139,6 +146,7 @@ set(qjacktrip_SRC src/DataProtocol.cpp src/UdpDataProtocol.cpp src/AudioInterface.cpp + src/AudioSocket.cpp src/JackAudioInterface.cpp src/JMess.cpp src/LoopBack.cpp @@ -146,6 +154,7 @@ set(qjacktrip_SRC src/RingBuffer.cpp src/JitterBuffer.cpp src/Regulator.cpp + src/SampleRateConverter.cpp src/Compressor.cpp src/Limiter.cpp src/Reverb.cpp @@ -156,6 +165,16 @@ set(qjacktrip_SRC src/ProcessPlugin.cpp ) +if (nooscpp) + add_compile_definitions(NO_OSCPP) +else () + include_directories("externals/oscpp") + include_directories("externals/oscpp/include") + set (qjacktrip_SRC ${qjacktrip_SRC} + src/OscServer.cpp + ) +endif () + if (rtaudio) add_compile_definitions(RT_AUDIO) set (qjacktrip_SRC ${qjacktrip_SRC} @@ -182,7 +201,7 @@ if (NOT nogui) src/Meter.cpp src/UserInterface.cpp ) - + if (NOT novs) set (qjacktrip_SRC ${qjacktrip_SRC} src/vs/virtualstudio.cpp @@ -214,7 +233,7 @@ if (NOT nogui) else () set (qjacktrip_SRC ${qjacktrip_SRC} src/images/images.qrc) endif () - + if (NOT noupdater) set (qjacktrip_SRC ${qjacktrip_SRC} src/dblsqd/feed.cpp diff --git a/Dockerfile b/Dockerfile index 2fa1bc0..b5d513a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ ARG JACK_VERSION=latest FROM registry.fedoraproject.org/fedora:${FEDORA_VERSION} AS builder # install tools require to build jacktrip -RUN dnf install -y --nodocs gcc gcc-c++ meson git python3-pyyaml python3-jinja2 glib2-devel jack-audio-connection-kit-devel +RUN dnf install -y --nodocs cmake gcc gcc-c++ meson git python3-pyyaml python3-jinja2 glib2-devel jack-audio-connection-kit-devel dbus-devel ENV QT_VERSION=6.5.3 RUN if [ "$(uname -m)" = "x86_64" ]; then export ARCH=amd64; else export ARCH=arm64; fi \ @@ -65,4 +65,4 @@ COPY --from=builder /artifacts / # jacktrip hub server listens on 4464 and uses 61000+ for clients EXPOSE 4464/tcp -EXPOSE 61000-61100/udp \ No newline at end of file +EXPOSE 61000-61100/udp diff --git a/build b/build index 351873e..57e2444 100755 --- a/build +++ b/build @@ -20,6 +20,7 @@ rtaudio - build with RtAudio\n no-system-rtaudio - use bundled RtAudio library even if it's available in the system\n nogui - build without the gui\n novs - build without Virtual Studio support\n +nooscpp - build without OSC support\n vsftux - build with Virtual Studio first launch experience\n noupdater - build without auto-update support\n static - build with static libraries\n @@ -32,25 +33,29 @@ while [[ "$#" -gt 0 ]]; do noclean) clean=0 ;; nojack) echo "Building without jack" - CONFIG="-config nojack $CONFIG" + CONFIG="-config nojack $CONFIG" ;; - rtaudio) + rtaudio) RTAUDIO=1 ;; - no-system-rtaudio) + no-system-rtaudio) NO_SYSTEM_RTAUDIO=1 ;; nogui) echo "Building without the gui" - CONFIG="-config nogui $CONFIG" + CONFIG="-config nogui $CONFIG" ;; novs) echo "Building without Virtual Studio support" - CONFIG="-config novs $CONFIG" + CONFIG="-config novs $CONFIG" + ;; + nooscpp) + echo "Building without OSC support" + CONFIG="-config nooscpp $CONFIG" ;; vsftux) echo "Building with Virtual Studio first launch experience" - CONFIG="-config vsftux $CONFIG" + CONFIG="-config vsftux $CONFIG" ;; noupdater) echo "Building without auto-update support" @@ -58,7 +63,7 @@ while [[ "$#" -gt 0 ]]; do ;; static) echo "Building with static libraries" - CONFIG="-config static $CONFIG" + CONFIG="-config static $CONFIG" ;; weakjack) echo "Building with weak linking of jack" @@ -75,8 +80,8 @@ while [[ "$#" -gt 0 ]]; do fi echo "Will build using $jobs make jobs" ;; - -h|--help) - echo -e $HELP_STR; exit + -h|--help) + echo -e $HELP_STR; exit ;; *) UNKNOWN_OPTIONS+=("$1") ;; esac diff --git a/build-aux/flatpak/org.jacktrip.JackTrip.json b/build-aux/flatpak/org.jacktrip.JackTrip.json index e4348c0..49aec5f 100644 --- a/build-aux/flatpak/org.jacktrip.JackTrip.json +++ b/build-aux/flatpak/org.jacktrip.JackTrip.json @@ -28,6 +28,7 @@ "buildsystem": "meson", "config-opts": [ "-Dbuildtype=debugoptimized", + "-Dlibsamplerate=disabled", "-Dpkg_config_path=/app/lib/x86_64-linux-gnu/pkgconfig" ], "sources": [ diff --git a/docs/Build/Linux.md b/docs/Build/Linux.md index 985228d..8086733 100644 --- a/docs/Build/Linux.md +++ b/docs/Build/Linux.md @@ -20,7 +20,7 @@ Optional: dnf install qt5-qtbase-devel qt5-qtnetworkauth-devel qt5-qtwebsockets-devel qt5-qtquickcontrols2-devel qt5-qtsvg-devel dnf groupinstall "C Development Tools and Libraries" dnf groupinstall "Development Tools" -dnf install "pkgconfig(jack)" rtaudio-devel git help2man python3-jinja2 +dnf install "pkgconfig(jack)" rtaudio-devel git help2man python3-jinja2 dbus-devel ``` ### Fedora (Qt6) @@ -28,7 +28,7 @@ dnf install "pkgconfig(jack)" rtaudio-devel git help2man python3-jinja2 dnf install qt6-qtbase-devel qt5-qtnetworkauth-devel qt5-qtwebsockets-devel qt5-qtquickcontrols2-devel qt5-qtsvg-devel qt6-qtwebengine-devel qt6-qtwebchannel-devel qt6-qt5compat-devel qt6-qtshadertools-devel dnf groupinstall "C Development Tools and Libraries" dnf groupinstall "Development Tools" -dnf install "pkgconfig(jack)" rtaudio-devel git help2man python3-jinja2 +dnf install "pkgconfig(jack)" rtaudio-devel git help2man python3-jinja2 dbus-devel ``` Clone the git repo with submodules and run `./build install` in the project @@ -124,6 +124,57 @@ $ meson install -C builddir # enter your password when prompted ``` +### Building with Docker + +You can also build JackTrip using Docker, which especially makes it easier +to build for alternative architectures. The following build arguments are +available: + +* BUILD_CONTAINER - Debian based container image to build with +* MESON_ARGS - arguments to build using meson +* QT_DOWNLOAD_URL - path to qt6 download (optional) +* VST3SDK_DOWNLOAD_URL - path to the VST3 SDK (optional) + +For example: + +amd64 dynamic +``` +docker buildx build --target=artifact -f linux/Dockerfile.build --output type=local,dest=./ \ + --platform linux/amd64 --build-arg BUILD_CONTAINER=ubuntu:22.04 \ + --build-arg MESON_ARGS="-Ddefault_library=shared -Drtaudio=enabled -Drtaudio:jack=disabled -Drtaudio:default_library=static -Drtaudio:alsa=enabled -Drtaudio:pulse=enabled -Drtaudio:werror=false" . +``` + +amd64 static +``` +docker buildx build --target=artifact -f linux/Dockerfile.build --output type=local,dest=./ \ + --platform linux/amd64 --build-arg BUILD_CONTAINER=ubuntu:20.04 \ + --build-arg MESON_ARGS="-Ddefault_library=static -Drtaudio=enabled -Drtaudio:jack=disabled -Drtaudio:default_library=static -Drtaudio:alsa=enabled -Drtaudio:pulse=disabled -Drtaudio:werror=false -Dnogui=true" \ + --build-arg QT_DOWNLOAD_URL=https://files.jacktrip.org/contrib/qt/qt-6.5.3-static-linux-amd64.tar.gz . +``` + +arm64 dynamic +``` +docker buildx build --target=artifact -f linux/Dockerfile.build --output type=local,dest=./ \ + --platform linux/arm64 --build-arg BUILD_CONTAINER=ubuntu:22.04 \ + --build-arg MESON_ARGS="-Ddefault_library=shared -Drtaudio=enabled -Drtaudio:jack=disabled -Drtaudio:default_library=static -Drtaudio:alsa=enabled -Drtaudio:pulse=enabled -Drtaudio:werror=false" . +``` + +arm64 static +``` +docker buildx build --target=artifact -f linux/Dockerfile.build --output type=local,dest=./ \ + --platform linux/arm64 --build-arg BUILD_CONTAINER=ubuntu:20.04 \ + --build-arg MESON_ARGS="-Ddefault_library=static -Drtaudio=enabled -Drtaudio:jack=disabled -Drtaudio:default_library=static -Drtaudio:alsa=enabled -Drtaudio:pulse=disabled -Drtaudio:werror=false -Dnogui=true" \ + --build-arg QT_DOWNLOAD_URL=https://files.jacktrip.org/contrib/qt/qt-6.5.3-static-linux-arm64.tar.gz . +``` + +arm32 static +``` +docker buildx build --target=artifact -f linux/Dockerfile.build --output type=local,dest=./ \ + --platform linux/arm/v7 --build-arg BUILD_CONTAINER=debian:buster \ + --build-arg MESON_ARGS="-Ddefault_library=static -Drtaudio=enabled -Drtaudio:jack=disabled -Drtaudio:default_library=static -Drtaudio:alsa=enabled -Drtaudio:pulse=disabled -Drtaudio:werror=false -Dnogui=true -Dcpp_link_args='-no-pie'" \ + --build-arg QT_DOWNLOAD_URL=https://files.jacktrip.org/contrib/qt/qt-5.15.13-static-linux-arm32.tar.gz . +``` + ### Verification If you have installed jacktrip, from anywhere in the Terminal, type: @@ -177,3 +228,35 @@ $ pwd ``` The new version's directory structure might look like this: ``` jacktrip-1.x.x/builddir``` and the old version ``` jacktrip/builddir```. + +## Building VST3 SDK for Linux + +You may need a few extra development libraries to build the VST3 SDK: + +On Fedora: +``` +sudo dnf install -y expat-devel freetype-devel pango-devel xcb-util-devel xcb-util-cursor-devel xcb-util-keysyms-devel libxkbcommon-x11-devel gtkmm3.0-devel libsqlite3x-devel +``` + +On Ubuntu and Debian/Raspbian: +``` +sudo apt install -y libexpat-dev libxml2-dev libxcb-util-dev libxcb-cursor-dev libxcb-keysyms1-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libgtkmm-3.0-dev libsqlite3-dev +``` + +To build and install the VST3 SDK: +``` +git clone --recursive https://github.com/steinbergmedia/vst3sdk +mkdir vst3sdk/build +cd vst3sdk/build +cmake -DCMAKE_BUILD_TYPE=Release ../ +cmake --build . --config Release +sudo mkdir -p /opt/vst3sdk +sudo cp -r lib/Release /opt/vst3sdk/lib +sudo cp -r bin/Release /opt/vst3sdk/bin +sudo cp -r ../base ../pluginterfaces ../public.sdk ../vstgui4 /opt/vst3sdk +``` + +When you run `meson setup` use `-Dvst-sdkdir=/path/to/vst3sdk` + +Please note that redistribution of JackTrip's VST3 plugin requires a +[license from Steinberg](https://www.steinberg.net/developers/). diff --git a/docs/Build/Mac.md b/docs/Build/Mac.md index 898361f..dba52b4 100644 --- a/docs/Build/Mac.md +++ b/docs/Build/Mac.md @@ -112,3 +112,32 @@ If you see something like this, you have successfully installed Jacktrip: > Copyright (c) 2008-2020 Juan-Pablo Caceres, Chris Chafe. > SoundWIRE group at CCRMA, Stanford University +## Building VST3 SDK for Mac + +``` +git clone --recursive https://github.com/steinbergmedia/vst3sdk +mkdir vst3sdk/build +cd vst3sdk/build +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" ../ +cmake --build . --config Release +sudo mkdir -p /opt/vst3sdk +sudo cp -r lib/Release /opt/vst3sdk/lib +sudo cp -r bin/Release /opt/vst3sdk/bin +sudo cp -r ../base ../pluginterfaces ../public.sdk ../vstgui4 /opt/vst3sdk +``` + +VST plugins are not allowed to have any shared library dependencies. If you +are using a shared/dynamic version of the Qt libraries to build JackTrip, +you may need to copy over a few static versions for a few of these so that +the linker can find them: + +``` +sudo cp /opt/qt-6.2.6-static/lib/libQt6Core.a /opt/vst3sdk/lib +sudo cp /opt/qt-6.2.6-static/lib/libQt6Network.a /opt/vst3sdk/lib +sudo cp /opt/qt-6.2.6-static/lib/libQt6BundledPcre2.a /opt/vst3sdk/lib +``` + +When you run `meson setup` use `-Dvst-sdkdir=/path/to/vst3sdk` + +Please note that redistribution of JackTrip's VST3 plugin requires a +[license from Steinberg](https://www.steinberg.net/developers/). diff --git a/docs/Build/Windows.md b/docs/Build/Windows.md index bd7dc90..2dc3fa9 100644 --- a/docs/Build/Windows.md +++ b/docs/Build/Windows.md @@ -82,3 +82,29 @@ If you see something like this, you have successfully installed Jacktrip: > Copyright (c) 2008-2020 Juan-Pablo Caceres, Chris Chafe. > SoundWIRE group at CCRMA, Stanford University + +## Building VST3 SDK for Windows + +``` +git clone --recursive https://github.com/steinbergmedia/vst3sdk +mkdir vst3sdk/build +cd vst3sdk/build +cmake -G "Visual Studio 17 2022" -A x64 -DSMTG_CREATE_PLUGIN_LINK=0 ../ +cmake --build . -DCMAKE_CXX_FLAGS="/MD" --config Release +mkdir c:\vst3sdk +xcopy /E lib\Release c:\vst3sdk\lib\ +xcopy /E bin\Release c:\vst3sdk\bin\ +xcopy /E ..\base c:\vst3sdk\base\ +xcopy /E ..\pluginterfaces c:\vst3sdk\pluginterfaces\ +xcopy /E ..\public.sdk c:\vst3sdk\public.sdk\ +xcopy /E ..\vstgui4 c:\vst3sdk\vstgui4\ +``` + +VST plugins are not allowed to have any shared library dependencies. You +can currently only build it when using a static build of Qt. Note that +this also requires configuring Meson without support for the GUI. + +When you run `meson setup` use `-Dnogui=true -Dvst-sdkdir=c:\vst3sdk` + +Please note that redistribution of JackTrip's VST3 plugin requires a +[license from Steinberg](https://www.steinberg.net/developers/). diff --git a/docs/changelog.yml b/docs/changelog.yml index 811e2ec..e44a0ec 100644 --- a/docs/changelog.yml +++ b/docs/changelog.yml @@ -1,3 +1,19 @@ +- Version: "2.5.0" + Date: 2025-01-21 + Description: + - (added) New JackTrip Audio Bridge VST3 Plugin + - (added) Sample rate conversion for audio interfaces + - (added) Automated arm64 and arm32 builds for Linux + - (added) Dynamic adjustment of PLC queues using OSC messages + - (updated) VS Mode remote control for audio quality slider + - (updated) VS Mode switch to using cookies for authentication + - (updated) PLC mode improvements in auto headroom calculations + - (fixed) PLC audio corruption when buffer sizes differ + - (fixed) PLC broadcast queue length when buffer sizes differ + - (fixed) Support for multiple commas in --audiodevice parameter + - (fixed) VS Mode access token expires after running for a day + - (fixed) VS Mode session feedback dialog closes on navigation + - (fixed) VS Mode deeplinks broken for first run after install - Version: "2.4.1" Date: 2024-09-27 Description: diff --git a/externals/oscpp/CMakeLists.txt b/externals/oscpp/CMakeLists.txt new file mode 100644 index 0000000..003b2e3 --- /dev/null +++ b/externals/oscpp/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.9) +project(oscpp VERSION 0.3.0) + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(LINUX TRUE) +endif () + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_C_STANDARD 99) + +enable_testing() + +add_subdirectory(test) + diff --git a/externals/oscpp/LICENSE b/externals/oscpp/LICENSE new file mode 100644 index 0000000..7d3e03b --- /dev/null +++ b/externals/oscpp/LICENSE @@ -0,0 +1,23 @@ +oscpp library + +Copyright (c) 2004-2018 Stefan Kersten + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/externals/oscpp/Makefile b/externals/oscpp/Makefile new file mode 100644 index 0000000..6ed9240 --- /dev/null +++ b/externals/oscpp/Makefile @@ -0,0 +1,28 @@ +.PHONY: build clean distclean test v verbose + +NINJA_FLAGS = $(args) + +ifeq (1,$(or $(verbose),$(v))) +NINJA_FLAGS += -v +endif + +build: build/CMakeCache.txt + cd build && ninja $(NINJA_FLAGS) + +v: verbose + +verbose: NINJA_FLAGS += -v +verbose: build + +build/CMakeCache.txt: + mkdir -p build + cd build && cmake -G Ninja .. + +clean: + cd build && ninja clean + +distclean: + rm -rf build + +test: build + cd build && ctest -V diff --git a/externals/oscpp/README.md b/externals/oscpp/README.md new file mode 100644 index 0000000..4919817 --- /dev/null +++ b/externals/oscpp/README.md @@ -0,0 +1,274 @@ +[![Build Status](https://img.shields.io/travis/kaoskorobase/oscpp.svg?style=flat)](https://travis-ci.org/kaoskorobase/oscpp) +[![Build status](https://ci.appveyor.com/api/projects/status/b7qk7t9mmgnc1n1v?svg=true)](https://ci.appveyor.com/project/kaoskorobase/oscpp) + +**oscpp** is a header-only C++11 library for constructing and parsing +[OpenSoundControl](http://opensoundcontrol.org) packets. Supported platforms +are MacOS X, iOS, Linux, Android and Windows; the code should be easily +portable to any platform with a C++11 compiler. **oscpp** intends to be a +minimal, high-performance solution for working with OSC data. The library +doesn't perform memory allocation (except when throwing exceptions) or other +system calls and is suitable for use in realtime sensitive contexts such as +audio driver callbacks. + +**oscpp** conforms to the [OpenSoundControl 1.0 +specification](http://opensoundcontrol.org/spec-1_0). Except for arrays, +non-standard message argument types are currently not supported and there is no +direct support for message address patterns or bundle scheduling; it is up to +the user of the library to implement (a subset of) the semantics according to +the spec. + +## Installation + +Since **oscpp** only consists of header files, the library doesn't need to be +compiled or installed. Simply put the `include` directory into a location that +is searched by your compiler and you're set. + +## Usage + +**oscpp** places everything in the `OSCPP` namespace, with the two most +important subnamespaces `Client` for constructing packets and `Server` for +parsing packets. + +First let's have a look at how to build OSC packets in memory: Assuming you +have allocated a buffer you can construct a client packet on the stack and +start filling the buffer with data. When all the data has been written, the +`size` method returns the actual size in bytes of the resulting OSC packet. + +~~~~cpp +#include + +size_t makePacket(void* buffer, size_t size) +{ + // Construct a packet + OSCPP::Client::Packet packet(buffer, size); + packet + // Open a bundle with a timetag + .openBundle(1234ULL) + // Add a message with two arguments and an array with 6 elements; + // for efficiency this needs to be known in advance. + .openMessage("/s_new", 2 + OSCPP::Tags::array(6)) + // Write the arguments + .string("sinesweep") + .int32(2) + .openArray() + .string("start-freq") + .float32(330.0f) + .string("end-freq") + .float32(990.0f) + .string("amp") + .float32(0.4f) + .closeArray() + // Every `open` needs a corresponding `close` + .closeMessage() + // Add another message with one argument + .openMessage("/n_free", 1) + .int32(1) + .closeMessage() + // And nother one + .openMessage("/n_set", 3) + .int32(1) + .string("wobble") + // Numeric arguments are converted automatically + // (see below) + .int32(31) + .closeMessage() + .closeBundle(); + return packet.size(); +} +~~~~ + +Now given a suitable packet transport (e.g. a UDP socket or an in-memory FIFO, +see below for a dummy implementation), a packet can be constructed and sent as +follows: + +~~~~cpp +class Transport; + +size_t send(Transport* t, const void* buffer, size_t size); + +void sendPacket(Transport* t, void* buffer, size_t bufferSize) +{ + const size_t packetSize = makePacket(buffer, bufferSize); + send(t, buffer, packetSize); +} +~~~~ + +When parsing data from OSC packets you have to handle the two distinct cases of bundles and messages: + +~~~~cpp +#include +#include +#include + +void handlePacket(const OSCPP::Server::Packet& packet) +{ + if (packet.isBundle()) { + // Convert to bundle + OSCPP::Server::Bundle bundle(packet); + + // Print the time + std::cout << "#bundle " << bundle.time() << std::endl; + + // Get packet stream + OSCPP::Server::PacketStream packets(bundle.packets()); + + // Iterate over all the packets and call handlePacket recursively. + // Cuidado: Might lead to stack overflow! + while (!packets.atEnd()) { + handlePacket(packets.next()); + } + } else { + // Convert to message + OSCPP::Server::Message msg(packet); + + // Get argument stream + OSCPP::Server::ArgStream args(msg.args()); + + // Directly compare message address to string with operator==. + // For handling larger address spaces you could use e.g. a + // dispatch table based on std::unordered_map. + if (msg == "/s_new") { + const char* name = args.string(); + const int32_t id = args.int32(); + std::cout << "/s_new" << " " + << name << " " + << id << " "; + // Get the params array as an ArgStream + OSCPP::Server::ArgStream params(args.array()); + while (!params.atEnd()) { + const char* param = params.string(); + const float value = params.float32(); + std::cout << param << ":" << value << " "; + } + std::cout << std::endl; + } else if (msg == "/n_set") { + const int32_t id = args.int32(); + const char* key = args.string(); + // Numeric arguments are converted automatically + // to float32 (e.g. from int32). + const float value = args.float32(); + std::cout << "/n_set" << " " + << id << " " + << key << " " + << value << std::endl; + } else { + // Simply print unknown messages + std::cout << "Unknown message: " << msg << std::endl; + } + } +} +~~~~ + +Now we can receive data from a message based transport and pass it to our +packet handling function: + +~~~~cpp +#include + +const size_t kMaxPacketSize = 8192; + +size_t recv(Transport* t, void* buffer, size_t size); + +void recvPacket(Transport* t) +{ + std::array buffer; + size_t size = recv(t, buffer.data(), buffer.size()); + handlePacket(OSCPP::Server::Packet(buffer.data(), size)); +} +~~~~ + +Here's our code in an example main function: + +~~~~cpp +#include +#include + +Transport* newTransport(); + +int main(int, char**) +{ + std::unique_ptr t(newTransport()); + std::array sendBuffer; + try { + sendPacket(t.get(), sendBuffer.data(), sendBuffer.size()); + recvPacket(t.get()); + } catch (std::exception& e) { + std::cerr << "Exception: " << e.what() << std::endl; + } + return 0; +} +~~~~ + +Compiling and running the example produces the following output: + +~~~~ +#bundle 1234 +/s_new sinesweep 2 start-freq:330 end-freq:990 amp:0.4 +Unknown message: /n_free i:1 +/n_set 1 wobble 31 +~~~~ + +## How to run the example + +You can build and run the example by executing + +~~~~ +make README +~~~~ + +You'll need to install the [Haskell Platform](http://www.haskell.org/platform/) +and the [Pandoc](http://johnmacfarlane.net/pandoc/) library: + +~~~~ +cabal install pandoc +~~~~ + +## Appendix: Support code + +Here's the code for a trivial transport that has a single packet buffer: + +~~~~cpp +#include + +class Transport +{ +public: + size_t send(const void* buffer, size_t size) + { + size_t n = std::min(m_buffer.size(), size); + std::memcpy(m_buffer.data(), buffer, n); + m_message = n; + return n; + } + + size_t recv(void* buffer, size_t size) + { + if (m_message > 0) { + size_t n = std::min(m_message, size); + std::memcpy(buffer, m_buffer.data(), n); + m_message = 0; + return n; + } + return 0; + } + +private: + std::array m_buffer; + size_t m_message; +}; + +Transport* newTransport() +{ + return new Transport; +} + +size_t send(Transport* t, const void* buffer, size_t size) +{ + return t->send(buffer, size); +} + +size_t recv(Transport* t, void* buffer, size_t size) +{ + return t->recv(buffer, size); +} +~~~~ diff --git a/externals/oscpp/doxygen.cfg b/externals/oscpp/doxygen.cfg new file mode 100644 index 0000000..4ddfcd4 --- /dev/null +++ b/externals/oscpp/doxygen.cfg @@ -0,0 +1,938 @@ +# Doxyfile 1.2.15 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "OSC Template Library" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = "$Id" + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, +# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, +# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower case letters. If set to YES upper case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are adviced to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explict @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consist of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl + +FILE_PATTERNS = *.hh + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse. + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the Html help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, +# or Internet explorer 4.0+). Note that for large projects the tree generation +# can take a very long time. In such cases it is better to disable this feature. +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line and do not end with a semicolon. Such function macros are typically +# used for boiler-plate code, and will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superceded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yield more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermedate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = search.cgi + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = /usr/local/bin/ + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS = diff --git a/externals/oscpp/include/oscpp/client.hpp b/externals/oscpp/include/oscpp/client.hpp new file mode 100644 index 0000000..36cfd92 --- /dev/null +++ b/externals/oscpp/include/oscpp/client.hpp @@ -0,0 +1,368 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_CLIENT_HPP_INCLUDED +#define OSCPP_CLIENT_HPP_INCLUDED + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace OSCPP { namespace Client { + +//! OSC packet construction. +/*! + * Construct a valid OSC packet for transmitting over a transport + * medium. + */ +class Packet +{ + int32_t ptrDiff(const char* a, const char* b) + { + // Make sure pointer difference fits into int32_t + const intptr_t diff = a - b; + if (diff < std::numeric_limits::min() || + diff > std::numeric_limits::max()) + { + std::stringstream s; + s << "Pointer difference " << diff + << " can't be represented by int32_t"; + throw std::logic_error(s.str()); + } + return static_cast(diff); + } + + int32_t calcSize(const char* begin, const char* end) + { + const int32_t size = ptrDiff(end, begin) - 4; + if (size < 0) + { + throw std::logic_error("Calculated size is negative"); + } + return size; + } + +public: + //! Constructor. + /*! + */ + Packet() + { + reset(0, 0); + } + + //! Constructor. + /*! + */ + Packet(void* buffer, size_t size) + { + reset(buffer, size); + } + + //! Destructor. + virtual ~Packet() + {} + + //! Get packet buffer address. + /*! + * Return the start address of the packet currently under + * construction. + */ + void* data() const + { + return m_buffer; + } + + size_t capacity() const + { + return m_capacity; + } + + //! Get packet content size. + /*! + * Return the size of the packet currently under construction. + */ + size_t size() const + { + return m_args.consumed(); + } + + //! Reset packet state. + void reset(void* buffer, size_t size) + { + checkAlignment(&m_buffer, kAlignment); + m_buffer = buffer; + m_capacity = size; + m_args = WriteStream(m_buffer, m_capacity); + m_sizePosM = m_sizePosB = nullptr; + m_inBundle = 0; + } + + void reset() + { + reset(m_buffer, m_capacity); + } + + Packet& openBundle(uint64_t time) + { + if (m_inBundle > 0) + { + assert(m_sizePosB != nullptr || m_inBundle == 1); + // Remember previous size pos offset + const int32_t offset = + m_sizePosB == nullptr ? 0 : ptrDiff(m_sizePosB, m_args.begin()); + char* curPos = m_args.pos(); + m_args.skip(4); + // Record size pos + std::memcpy(curPos, &offset, 4); + m_sizePosB = curPos; + } + else if (m_args.pos() != m_args.begin()) + { + throw std::logic_error( + "Cannot open toplevel bundle in non-empty packet"); + } + + m_inBundle++; + m_args.putString("#bundle"); + m_args.putUInt64(time); + return *this; + } + + Packet& closeBundle() + { + if (m_inBundle > 0) + { + if (m_inBundle > 1) + { + // Get current stream pos + char* curPos = m_args.pos(); + + // Get previous bundle size stream pos + int32_t offset; + memcpy(&offset, m_sizePosB, 4); + // Get previous size pos + char* prevPos = m_args.begin() + offset; + + const int32_t bundleSize = calcSize(m_sizePosB, curPos); + assert(bundleSize >= 0 && + (size_t)bundleSize >= Size::bundle(0)); + // Write bundle size + m_args.setPos(m_sizePosB); + m_args.putInt32(bundleSize); + m_args.setPos(curPos); + + // record outer bundle size pos + m_sizePosB = prevPos; + } + m_inBundle--; + } + else + { + throw std::logic_error( + "closeBundle() without matching openBundle()"); + } + return *this; + } + + Packet& openMessage(const char* addr, size_t numTags) + { + if (m_inBundle > 0) + { + // record message size pos + m_sizePosM = m_args.pos(); + // advance arg stream + m_args.skip(4); + } + m_args.putString(addr); + size_t sigLen = numTags + 2; + m_tags = WriteStream(m_args, sigLen); + m_args.zero(align(sigLen)); + m_tags.putChar(','); + return *this; + } + + Packet& closeMessage() + { + if (m_inBundle > 0) + { + // Get current stream pos + char* curPos = m_args.pos(); + // write message size + m_args.setPos(m_sizePosM); + m_args.putInt32(calcSize(m_sizePosM, curPos)); + // restore stream pos + m_args.setPos(curPos); + // reset tag stream + m_tags = WriteStream(); + } + return *this; + } + + //! Write integer message argument. + /*! + * Write a 32 bit integer message argument. + * + * \param arg 32 bit integer argument. + * + * \pre openMessage must have been called before with no intervening + * closeMessage. + * + * \throw OSCPP::XRunError stream buffer xrun. + */ + Packet& int32(int32_t arg) + { + m_tags.putChar('i'); + m_args.putInt32(arg); + return *this; + } + + Packet& float32(float arg) + { + m_tags.putChar('f'); + m_args.putFloat32(arg); + return *this; + } + + Packet& string(const char* arg) + { + m_tags.putChar('s'); + m_args.putString(arg); + return *this; + } + + // @throw std::invalid_argument if blob size is greater than + // std::numeric_limits::max() + Packet& blob(const Blob& arg) + { + if (arg.size() > (size_t)std::numeric_limits::max()) + { + throw std::invalid_argument("Blob size greater than maximum " + "value representable by int32_t"); + } + m_tags.putChar('b'); + m_args.putInt32(static_cast(arg.size())); + m_args.putData(arg.data(), arg.size()); + return *this; + } + + Packet& openArray() + { + m_tags.putChar('['); + return *this; + } + + Packet& closeArray() + { + m_tags.putChar(']'); + return *this; + } + + template Packet& put(T) + { + T::OSC_Client_Packet_put_unimplemented; + return *this; + } + + template + Packet& put(InputIterator begin, InputIterator end) + { + for (auto it = begin; it != end; it++) + { + put(*it); + } + return *this; + } + + template + Packet& putArray(InputIterator begin, InputIterator end) + { + openArray(); + put(begin, end); + closeArray(); + return *this; + } + +private: + void* m_buffer; + size_t m_capacity; + WriteStream m_args; // packet stream + WriteStream m_tags; // current tag stream + char* m_sizePosM; // last message size position + char* m_sizePosB; // last bundle size position + size_t m_inBundle; // bundle nesting depth +}; + +template <> inline Packet& Packet::put(int32_t x) +{ + return int32(x); +} +template <> inline Packet& Packet::put(float x) +{ + return float32(x); +} +template <> inline Packet& Packet::put(const char* x) +{ + return string(x); +} +template <> inline Packet& Packet::put(Blob x) +{ + return blob(x); +} + +template class StaticPacket : public Packet +{ +public: + StaticPacket() + : Packet(reinterpret_cast(&m_buffer), buffer_size) + {} + +private: + typedef typename std::aligned_storage::type + AlignedBuffer; + AlignedBuffer m_buffer; +}; + +class DynamicPacket : public Packet +{ +public: + DynamicPacket(size_t buffer_size) + : Packet(static_cast(new char[buffer_size]), buffer_size) + {} + + ~DynamicPacket() + { + delete[] static_cast(data()); + } +}; + +}} // namespace OSCPP::Client + +#endif // OSCPP_CLIENT_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/detail/endian.hpp b/externals/oscpp/include/oscpp/detail/endian.hpp new file mode 100644 index 0000000..f9a0c2e --- /dev/null +++ b/externals/oscpp/include/oscpp/detail/endian.hpp @@ -0,0 +1,82 @@ +// Copyright 2005 Caleb Epstein +// Copyright 2006 John Maddock +// Copyright 2010 Rene Rivera +// Distributed under the Boost Software License, Version 1.0. (See accompany- +// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/* + * Copyright (c) 1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/* + * Copyright notice reproduced from , from + * which this code was originally taken. + * + * Modified by Caleb Epstein to use with GNU libc and to + * defined the BOOST_ENDIAN macro. + */ + +/* + * Modifications for oscpp by Stefan Kersten + * - Change prefix from BOOST to OSCPP + * - Remove PDP endianness + * - Add OSCPP_BYTE_ORDER_* macros + */ + +#ifndef OSCPP_ENDIAN_HPP_INCLUDED +#define OSCPP_ENDIAN_HPP_INCLUDED + +#define OSCPP_BYTE_ORDER_BIG_ENDIAN 4321 +#define OSCPP_BYTE_ORDER_LITTLE_ENDIAN 1234 + +// GNU libc offers the helpful header which defines +// __BYTE_ORDER + +#if defined(__GLIBC__) || defined(__ANDROID__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define OSCPP_LITTLE_ENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define OSCPP_BIG_ENDIAN +# else +# error Unknown machine endianness detected. +# endif +# define OSCPP_BYTE_ORDER __BYTE_ORDER +#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) || \ + defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) || \ + defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN) +# define OSCPP_BIG_ENDIAN +# define OSCPP_BYTE_ORDER OSCPP_BYTE_ORDER_BIG_ENDIAN +#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) || \ + defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) || \ + defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN) +# define OSCPP_LITTLE_ENDIAN +# define OSCPP_BYTE_ORDER OSCPP_BYTE_ORDER_LITTLE_ENDIAN +#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || \ + defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || \ + defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || \ + defined(__s390__) +# define OSCPP_BIG_ENDIAN +# define OSCPP_BYTE_ORDER OSCPP_BYTE_ORDER_BIG_ENDIAN +#elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || \ + defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || \ + defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || \ + defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || \ + defined(_M_X64) || defined(__bfin__) + +# define OSCPP_LITTLE_ENDIAN +# define OSCPP_BYTE_ORDER OSCPP_BYTE_ORDER_LITTLE_ENDIAN +#else +# error The file oscpp/endian.hpp needs to be set up for your CPU type. +#endif + +#endif // OSCPP_ENDIAN_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/detail/host.hpp b/externals/oscpp/include/oscpp/detail/host.hpp new file mode 100644 index 0000000..3aea894 --- /dev/null +++ b/externals/oscpp/include/oscpp/detail/host.hpp @@ -0,0 +1,118 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_HOST_HPP_INCLUDED +#define OSCPP_HOST_HPP_INCLUDED + +#include + +#include +#include + +namespace OSCPP { +#if defined(__GNUC__) +inline static uint32_t bswap32(uint32_t x) +{ + return __builtin_bswap32(x); +} +inline static uint64_t bswap64(uint64_t x) +{ + return __builtin_bswap64(x); +} +#elif defined(_WINDOWS_) || defined(_WIN32) +# include +inline static uint32_t bswap32(uint32_t x) +{ + return _byteswap_ulong(x); +} +inline static uint64_t bswap64(uint64_t x) +{ + return _byteswap_uint64(x); +} +#else +// Fallback implementation +# warning Using unoptimized byte swap functions + +inline static uint32_t bswap32(uint32_t x) +{ + const uint32_t b1 = x << 24; + const uint32_t b2 = (x & 0x0000FF00) << 8; + const uint32_t b3 = (x & 0x00FF0000) >> 8; + const uint32_t b4 = x >> 24; + return b1 | b2 | b3 | b4; +} +inline static uint64_t bswap64(int64_t x) +{ + const uint64_t w1 = oscpp_bswap(uint32_t(x & 0x00000000FFFFFFFF)) << 32; + const uint64_t w2 = oscpp_bswap(uint32_t(x >> 32)); + return w1 | w2; +} +#endif + +enum ByteOrder +{ + NetworkByteOrder, + HostByteOrder +}; + +template inline uint32_t convert32(uint32_t) +{ + throw std::logic_error("Invalid byte order"); +} + +template <> inline uint32_t convert32(uint32_t x) +{ +#if defined(OSCPP_LITTLE_ENDIAN) + return bswap32(x); +#else + return x; +#endif +} + +template <> inline uint32_t convert32(uint32_t x) +{ + return x; +} + +template inline uint64_t convert64(uint64_t) +{ + throw std::logic_error("Invalid byte order"); +} + +template <> inline uint64_t convert64(uint64_t x) +{ +#if defined(OSCPP_LITTLE_ENDIAN) + return bswap64(x); +#else + return x; +#endif +} + +template <> inline uint64_t convert64(uint64_t x) +{ + return x; +} +} // namespace OSCPP + +#endif // OSCPP_HOST_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/detail/stream.hpp b/externals/oscpp/include/oscpp/detail/stream.hpp new file mode 100644 index 0000000..67b064a --- /dev/null +++ b/externals/oscpp/include/oscpp/detail/stream.hpp @@ -0,0 +1,365 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_STREAM_HPP_INCLUDED +#define OSCPP_STREAM_HPP_INCLUDED + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace OSCPP { + +class Stream +{ +public: + Stream() + { + m_begin = m_end = m_pos = 0; + } + + Stream(void* data, size_t size) + { + m_begin = static_cast(data); + m_end = m_begin + size; + m_pos = m_begin; + } + + Stream(const Stream& stream, size_t size) + { + m_begin = m_pos = stream.m_pos; + m_end = m_begin + size; + if (m_end > stream.m_end) + throw UnderrunError(); + } + + void reset() + { + m_pos = m_begin; + } + + const char* begin() const + { + return m_begin; + } + + char* begin() + { + return m_begin; + } + + const char* end() const + { + return m_end; + } + + size_t capacity() const + { + return end() - begin(); + } + + const char* pos() const + { + return m_pos; + } + + char* pos() + { + return m_pos; + } + + void setPos(char* pos) + { + assert((pos >= m_begin) && (pos <= m_end)); + m_pos = pos; + } + + void advance(size_t n) + { + m_pos += n; + } + + bool atEnd() const + { + return pos() == end(); + } + + size_t consumed() const + { + return pos() - begin(); + } + + size_t consumable() const + { + return end() - pos(); + } + + inline void checkAlignment(size_t n) const + { + OSCPP::checkAlignment(pos(), n); + } + +protected: + char* m_begin; + char* m_end; + char* m_pos; +}; + +template class BasicWriteStream : public Stream +{ +public: + BasicWriteStream() + : Stream() + {} + + BasicWriteStream(void* data, size_t size) + : Stream(data, size) + {} + + BasicWriteStream(const BasicWriteStream& stream, size_t size) + : Stream(stream, size) + {} + + // throw (OverflowError) + inline void checkWritable(size_t n) const + { + if (consumable() < n) + throw OverflowError(n - consumable()); + } + + void skip(size_t n) + { + checkWritable(n); + advance(n); + } + + void zero(size_t n) + { + checkWritable(n); + std::memset(m_pos, 0, n); + advance(n); + } + + void putChar(char c) + { + checkWritable(1); + *pos() = c; + advance(1); + } + + void putInt32(int32_t x) + { + checkWritable(4); + checkAlignment(4); + uint32_t uh; + memcpy(&uh, &x, 4); + const uint32_t un = convert32(uh); + std::memcpy(pos(), &un, 4); + advance(4); + } + + void putUInt64(uint64_t x) + { + checkWritable(8); + const uint64_t un = convert64(x); + std::memcpy(pos(), &un, 8); + advance(8); + } + + void putFloat32(float f) + { + checkWritable(4); + checkAlignment(4); + uint32_t uh; + std::memcpy(&uh, &f, 4); + const uint32_t un = convert32(uh); + std::memcpy(pos(), &un, 4); + advance(4); + } + + void putFloat64(double f) + { + checkWritable(8); + checkAlignment(4); + uint64_t uh; + std::memcpy(&uh, &f, 8); + const uint64_t un = convert64(uh); + std::memcpy(pos(), &un, 8); + advance(8); + } + + void putData(const void* data, size_t size) + { + const size_t padding = OSCPP::padding(size); + const size_t n = size + padding; + checkWritable(n); + std::memcpy(pos(), data, size); + std::memset(pos() + size, 0, padding); + advance(n); + } + + void putString(const char* s) + { + putData(s, strlen(s) + 1); + } +}; + +typedef BasicWriteStream WriteStream; + +template class BasicReadStream : public Stream +{ +public: + BasicReadStream() + {} + + BasicReadStream(const void* data, size_t size) + : Stream(const_cast(data), size) + {} + + BasicReadStream(const BasicReadStream& stream, size_t size) + : Stream(stream, size) + {} + + // throw (UnderrunError) + void checkReadable(size_t n) const + { + if (consumable() < n) + throw UnderrunError(); + } + + // throw (UnderrunError) + void skip(size_t n) + { + checkReadable(n); + advance(n); + } + + // throw (UnderrunError) + inline char peekChar() const + { + checkReadable(1); + return *pos(); + } + + // throw (UnderrunError) + inline char getChar() + { + const char x = peekChar(); + advance(1); + return x; + } + + // throw (UnderrunError) + inline int32_t peekInt32() const + { + checkReadable(4); + checkAlignment(4); + uint32_t un; + std::memcpy(&un, pos(), 4); + const uint32_t uh = convert32(un); + int32_t x; + std::memcpy(&x, &uh, 4); + return x; + } + + // throw (UnderrunError) + inline int32_t getInt32() + { + const int32_t x = peekInt32(); + advance(4); + return x; + } + + // throw (UnderrunError) + inline uint64_t getUInt64() + { + checkReadable(8); + uint64_t un; + std::memcpy(&un, pos(), 8); + advance(8); + return convert64(un); + } + + // throw (UnderrunError) + inline float getFloat32() + { + checkReadable(4); + checkAlignment(4); + uint32_t un; + std::memcpy(&un, pos(), 4); + advance(4); + const uint32_t uh = convert32(un); + float f; + std::memcpy(&f, &uh, 4); + return f; + } + + // throw (UnderrunError) + inline double getFloat64() + { + checkReadable(8); + checkAlignment(4); + uint64_t un; + std::memcpy(&un, pos(), 8); + advance(8); + const uint64_t uh = convert64(un); + double f; + std::memcpy(&f, &uh, 8); + return f; + } + + // throw (UnderrunError, ParseError) + const char* getString() + { + checkReadable(4); // min string length + + const char* ptr = static_cast(pos()) + 3; + const char* end = static_cast(this->end()); + + while (true) + { + if (ptr >= end) + throw UnderrunError(); + if (*ptr == '\0') + break; + ptr += 4; + } + + const char* x = pos(); + advance(ptr - pos() + 1); + + return x; + } +}; + +typedef BasicReadStream ReadStream; +} // namespace OSCPP + +#endif // OSCPP_STREAM_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/error.hpp b/externals/oscpp/include/oscpp/error.hpp new file mode 100644 index 0000000..600883a --- /dev/null +++ b/externals/oscpp/include/oscpp/error.hpp @@ -0,0 +1,87 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_ERROR_HPP_INCLUDED +#define OSCPP_ERROR_HPP_INCLUDED + +#include +#include + +namespace OSCPP { + +class Error : public std::exception +{ +public: + Error(const std::string& what) + : m_what(what) + {} + + virtual ~Error() noexcept + {} + + const char* what() const noexcept override + { + return m_what.c_str(); + } + +private: + std::string m_what; +}; + +class UnderrunError : public Error +{ +public: + UnderrunError() + : Error(std::string("Buffer underrun")) + {} +}; + +class OverflowError : public Error +{ +public: + OverflowError(size_t bytes) + : Error(std::string("Buffer overflow")) + , m_bytes(bytes) + {} + + size_t numBytes() const + { + return m_bytes; + } + +private: + size_t m_bytes; +}; + +class ParseError : public Error +{ +public: + ParseError(const std::string& what = "Parse error") + : Error(what) + {} +}; + +} // namespace OSCPP + +#endif // OSCPP_ERROR_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/print.hpp b/externals/oscpp/include/oscpp/print.hpp new file mode 100644 index 0000000..04f1579 --- /dev/null +++ b/externals/oscpp/include/oscpp/print.hpp @@ -0,0 +1,183 @@ +// OSCpp library +// +// Copyright (c) 2004-2011 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_PRINT_HPP_INCLUDED +#define OSCPP_PRINT_HPP_INCLUDED + +#include +#include + +#include + +namespace OSCPP { namespace detail { + +const size_t kDefaultIndentWidth = 4; + +class Indent +{ +public: + Indent(size_t w) + : m_width(w) + , m_indent(0) + {} + Indent(size_t w, size_t n) + : m_width(w) + , m_indent(n) + {} + Indent(const Indent&) = default; + + operator size_t() const + { + return m_indent; + } + Indent inc() const + { + return Indent(m_width, m_indent + m_width); + } + +private: + size_t m_width; + size_t m_indent; +}; + +inline std::ostream& operator<<(std::ostream& out, const Indent& indent) +{ + size_t n = indent; + while (n-- > 0) + out << ' '; + return out; +} + +inline void printArgs(std::ostream& out, Server::ArgStream args) +{ + while (!args.atEnd()) + { + const char t = args.tag(); + switch (t) + { + case 'i': + out << "i:" << args.int32(); + break; + case 'f': + out << "f:" << args.float32(); + break; + case 's': + out << "s:" << args.string(); + break; + case 'b': + out << "b:" << args.blob().size(); + break; + case '[': + out << "[ "; + printArgs(out, args.array()); + out << " ]"; + break; + default: + out << t << ":?"; + args.drop(); + break; + } + out << ' '; + } +} + +inline void printMessage(std::ostream& out, const Server::Message& msg, + const Indent& indent) +{ + out << indent << msg.address() << ' '; + printArgs(out, msg.args()); +} + +inline void printBundle(std::ostream& out, const Server::Bundle& bundle, + const Indent& indent) +{ + out << indent << "# " << bundle.time() << " [" << std::endl; + Indent nextIndent = indent.inc(); + auto packets = bundle.packets(); + while (!packets.atEnd()) + { + auto packet = packets.next(); + if (packet.isMessage()) + { + printMessage(out, packet, nextIndent); + } + else + { + printBundle(out, packet, nextIndent); + } + out << std::endl; + } + out << indent << "]"; +} + +inline void printPacket(std::ostream& out, const Server::Packet& packet, + const Indent& indent) +{ + if (packet.isMessage()) + { + printMessage(out, packet, indent); + } + else + { + printBundle(out, packet, indent); + } +} + +}} // namespace OSCPP::detail + +namespace OSCPP { namespace Server { + +inline std::ostream& operator<<(std::ostream& out, const Packet& packet) +{ + detail::printPacket(out, packet, + detail::Indent(detail::kDefaultIndentWidth)); + return out; +} + +inline std::ostream& operator<<(std::ostream& out, const Bundle& packet) +{ + detail::printBundle(out, packet, + detail::Indent(detail::kDefaultIndentWidth)); + return out; +} + +inline std::ostream& operator<<(std::ostream& out, const Message& packet) +{ + detail::printMessage(out, packet, + detail::Indent(detail::kDefaultIndentWidth)); + return out; +} + +}} // namespace OSCPP::Server + +namespace OSCPP { namespace Client { + +inline std::ostream& operator<<(std::ostream& out, const Packet& packet) +{ + return out << Server::Packet(packet.data(), packet.size()); +} + +}} // namespace OSCPP::Client + +#endif // OSCPP_PRINT_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/server.hpp b/externals/oscpp/include/oscpp/server.hpp new file mode 100644 index 0000000..a3933f7 --- /dev/null +++ b/externals/oscpp/include/oscpp/server.hpp @@ -0,0 +1,493 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_SERVER_HPP_INCLUDED +#define OSCPP_SERVER_HPP_INCLUDED + +#include +#include + +#include +#include +#include +#include + +namespace OSCPP { namespace Server { + +//! OSC Message Argument Iterator. +/*! + * Retrieve typed arguments from an incoming message. + * + * Supported tags and their correspondong types are: + * + * i -- 32 bit signed integer number
+ * f -- 32 bit floating point number
+ * s -- NULL-terminated string padded to 4-byte boundary
+ * b -- 32-bit integer size followed by 4-byte aligned data + * + * \sa getArgInt32 + * \sa getArgFloat32 + * \sa getArgString + */ +class ArgStream +{ +public: + //* Empty argument stream. + ArgStream() = default; + + //* Construct argument stream from tag and value streams. + ArgStream(const ReadStream& tags, const ReadStream& args) + : m_tags(tags) + , m_args(args) + {} + + //! Constructor. + /*! + * Read arguments from stream, which has to point to the start of a + * message type signature. + * + * \throw OSCPP::UnderrunError stream buffer underrun. + * \throw OSCPP::ParseError error while parsing input stream. + */ + ArgStream(const ReadStream& stream) + { + m_args = stream; + const char* tags = m_args.getString(); + if (tags[0] != ',') + throw ParseError("Tag string doesn't start with ','"); + m_tags = ReadStream(tags + 1, strlen(tags) - 1); + } + + //* Return the number of arguments that can be read from the stream. + size_t size() const + { + return m_tags.capacity(); + } + + //* Return true if no more arguments can be read from the stream. + bool atEnd() const + { + return m_tags.atEnd(); + } + + //* Return tag and argument streams. + std::tuple state() const + { + return std::make_tuple(m_tags, m_args); + } + + //* Return the type tag corresponding to the next message argument. + char tag() const + { + return m_tags.peekChar(); + } + + //* Drop next argument. + void drop() + { + drop(m_tags.getChar()); + } + + //! Get next integer argument. + /*! + * Read next numerical argument from the input stream and convert it + * to an integer. + * + * \exception OSCPP::UnderrunError stream buffer underrun. + * \exception OSCPP::ParseError argument could not be converted. + */ + int32_t int32() + { + const char t = m_tags.getChar(); + if (t == 'i') + return m_args.getInt32(); + if (t == 'f') + return (int32_t)m_args.getFloat32(); + throw ParseError("Cannot convert argument to int"); + } + + //! Get next float argument. + /*! + * Read next numerical argument from the input stream and convert it + * to a float. + * + * \exception OSCPP::UnderrunError stream buffer underrun. + * \exception OSCPP::ParseError argument could not be converted. + */ + float float32() + { + const char t = m_tags.getChar(); + if (t == 'f') + return m_args.getFloat32(); + if (t == 'i') + return (float)m_args.getInt32(); + throw ParseError("Cannot convert argument to float"); + } + + //! Get next string argument. + /*! + * Read next string argument and return it as a NULL-terminated + * string. + * + * \exception OSCPP::UnderrunError stream buffer underrun. + * \exception OSCPP::ParseError argument could not be converted or + * is not a valid string. + */ + const char* string() + { + if (m_tags.getChar() == 's') + { + return m_args.getString(); + } + throw ParseError("Cannot convert argument to string"); + } + + //* Get next blob argument. + // + // @throw OSCPP::UnderrunError stream buffer underrun. + // @throw OSCPP::ParseError argument is not a valid blob + Blob blob() + { + if (m_tags.getChar() == 'b') + { + return parseBlob(); + } + else + { + throw ParseError("Cannot convert argument to blob"); + } + } + + //* Return a stream corresponding to an array argument. + ArgStream array() + { + if (m_tags.getChar() == '[') + { + const char* tags = m_tags.pos(); + const char* args = m_args.pos(); + dropArray(); + // m_tags.pos() points right after the closing ']'. + return ArgStream(ReadStream(tags, m_tags.pos() - tags - 1), + ReadStream(args, m_args.pos() - args)); + } + else + { + throw ParseError("Expected array"); + } + } + + template T next() + { + return T::OSC_Server_ArgStream_next_unimplemented; + } + +private: + // Parse a blob (type tag already consumed). + Blob parseBlob() + { + int32_t size = m_args.getInt32(); + if (size < 0) + { + throw ParseError("Invalid blob size is less than zero"); + } + else + { + static_assert( + sizeof(size_t) >= sizeof(int32_t), + "Size of size_t must be greater than size of int32_t"); + const void* data = m_args.pos(); + m_args.skip(align(size)); + return Blob(data, static_cast(size)); + } + } + // Drop an atomic value of type t (type tag already consumed). + void dropAtom(char t) + { + switch (t) + { + case 'i': + m_args.skip(4); + break; + case 'f': + m_args.skip(4); + break; + case 's': + m_args.getString(); + break; + case 'b': + parseBlob(); + break; + } + } + // Drop a possibly nested array. + void dropArray() + { + unsigned int level = 0; + for (;;) + { + char t = m_tags.getChar(); + if (t == ']') + { + if (level == 0) + break; + else + level--; + } + else if (t == '[') + { + level++; + } + else + { + dropAtom(t); + } + } + } + // Drop the next argument of type t (type tag already consumed). + void drop(char t) + { + switch (t) + { + case '[': + dropArray(); + break; + default: + dropAtom(t); + } + } + +private: + ReadStream m_tags; + ReadStream m_args; +}; + +class Message +{ +public: + Message(const char* address, const ReadStream& stream) + : m_address(address) + , m_args(ArgStream(stream)) + {} + + const char* address() const + { + return m_address; + } + + ArgStream args() const + { + return m_args; + } + +private: + const char* m_address; + ArgStream m_args; +}; + +class PacketStream; + +class Bundle +{ +public: + Bundle(uint64_t time, const ReadStream& stream) + : m_time(time) + , m_stream(stream) + {} + + uint64_t time() const + { + return m_time; + } + + inline PacketStream packets() const; + +private: + uint64_t m_time; + ReadStream m_stream; +}; + +class Packet +{ +public: + Packet() + : m_isBundle(false) + {} + + Packet(const ReadStream& stream) + : m_stream(stream) + , m_isBundle(isBundle(stream)) + { + // Skip over #bundle header + if (m_isBundle) + m_stream.skip(8); + } + + Packet(const void* data, size_t size) + : Packet(ReadStream(data, size)) + {} + + const void* data() const + { + return m_stream.begin(); + } + + size_t size() const + { + return m_stream.capacity(); + } + + bool isBundle() const + { + return m_isBundle; + } + + bool isMessage() const + { + return !isBundle(); + } + + operator Bundle() const + { + if (!isBundle()) + throw ParseError("Packet is not a bundle"); + ReadStream stream(m_stream); + uint64_t time = stream.getUInt64(); + return Bundle(time, std::move(stream)); + } + + operator Message() const + { + if (!isMessage()) + throw ParseError("Packet is not a message"); + ReadStream stream(m_stream); + const char* address = stream.getString(); + return Message(address, std::move(stream)); + } + + static bool isMessage(const void* data, size_t size) + { + return (size > 3) && (static_cast(data)[0] != '#'); + } + + static bool isMessage(const ReadStream& stream) + { + return isMessage(stream.pos(), stream.consumable()); + } + + static bool isBundle(const void* data, size_t size) + { + return (size > 15) && (std::memcmp(data, "#bundle", 8) == 0); + } + + static bool isBundle(const ReadStream& stream) + { + return isBundle(stream.pos(), stream.consumable()); + } + +private: + ReadStream m_stream; + bool m_isBundle; +}; + +class PacketStream +{ +public: + PacketStream(const ReadStream& stream) + : m_stream(stream) + {} + + bool atEnd() const + { + return m_stream.atEnd(); + } + + Packet next() + { + size_t size = m_stream.getInt32(); + ReadStream stream(m_stream, size); + m_stream.skip(size); + return Packet(stream); + } + +private: + ReadStream m_stream; +}; + +template <> inline int32_t ArgStream::next() +{ + return int32(); +} + +template <> inline float ArgStream::next() +{ + return float32(); +} + +template <> inline const char* ArgStream::next() +{ + return string(); +} + +template <> inline Blob ArgStream::next() +{ + return blob(); +} + +template <> inline ArgStream ArgStream::next() +{ + return array(); +} + +PacketStream Bundle::packets() const +{ + return PacketStream(m_stream); +} + +}} // namespace OSCPP::Server + +static inline bool operator==(const OSCPP::Server::Message& msg, + const char* str) +{ + return strcmp(msg.address(), str) == 0; +} + +static inline bool operator==(const char* str, + const OSCPP::Server::Message& msg) +{ + return msg == str; +} + +static inline bool operator!=(const OSCPP::Server::Message& msg, + const char* str) +{ + return !(msg == str); +} + +static inline bool operator!=(const char* str, + const OSCPP::Server::Message& msg) +{ + return msg != str; +} + +#endif // OSCPP_SERVER_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/types.hpp b/externals/oscpp/include/oscpp/types.hpp new file mode 100644 index 0000000..2afc68b --- /dev/null +++ b/externals/oscpp/include/oscpp/types.hpp @@ -0,0 +1,59 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_TYPES_HPP_INCLUDED +#define OSCPP_TYPES_HPP_INCLUDED + +namespace OSCPP { + +class Blob +{ +public: + Blob() + : m_size(0) + , m_data(nullptr) + {} + Blob(const void* data, size_t size) + : m_size(size) + , m_data(data) + {} + Blob(const Blob& other) = default; + + size_t size() const + { + return m_size; + } + const void* data() const + { + return m_data; + } + +private: + size_t m_size; + const void* m_data; +}; + +} // namespace OSCPP + +#endif // OSCPP_TYPES_HPP_INCLUDED diff --git a/externals/oscpp/include/oscpp/util.hpp b/externals/oscpp/include/oscpp/util.hpp new file mode 100644 index 0000000..5e3caa4 --- /dev/null +++ b/externals/oscpp/include/oscpp/util.hpp @@ -0,0 +1,159 @@ +// oscpp library +// +// Copyright (c) 2004-2013 Stefan Kersten +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef OSCPP_UTIL_HPP_INCLUDED +#define OSCPP_UTIL_HPP_INCLUDED + +#include +#include + +namespace OSCPP { + +static const size_t kAlignment = 4; + +inline bool isAligned(const void* ptr, size_t alignment) +{ + return (reinterpret_cast(ptr) & (alignment - 1)) == 0; +} + +constexpr bool isAligned(size_t n) +{ + return (n & 3) == 0; +} + +constexpr size_t align(size_t n) +{ + return (n + 3) & -4; +} + +constexpr size_t padding(size_t n) +{ + return align(n) - n; +} + +inline void checkAlignment(const void* ptr, size_t n) +{ + if (!isAligned(ptr, n)) + { + throw std::runtime_error("Unaligned pointer"); + } +} + +namespace Tags { + +constexpr size_t int32() +{ + return 1; +} +constexpr size_t float32() +{ + return 1; +} +constexpr size_t string() +{ + return 1; +} +constexpr size_t blob() +{ + return 1; +} +constexpr size_t array(size_t numElems) +{ + return numElems + 2; +} +} // namespace Tags + +namespace Size { + +class String +{ +public: + String(const char* x) + : m_value(x) + {} + + operator const char*() const + { + return m_value; + } + +private: + const char* m_value; +}; + +inline size_t string(const String& x) +{ + return align(std::strlen(x) + 1); +} + +template constexpr size_t string(char const (&)[N]) +{ + return align(N); +} + +constexpr size_t bundle(size_t numPackets) +{ + return 8 /* #bundle */ + 8 /* timestamp */ + + 4 * numPackets /* size prefix */; +} + +inline size_t message(const String& address, size_t numArgs) +{ + return string(address) + align(numArgs + 2); +} + +template +constexpr size_t message(char const (&address)[N], size_t numArgs) +{ + return string(address) + align(numArgs + 2); +} + +constexpr size_t int32(size_t n = 1) +{ + return n * 4; +} + +constexpr size_t float32(size_t n = 1) +{ + return n * 4; +} + +constexpr size_t float64(size_t n = 1) +{ + return n * 8; +} + +constexpr size_t string(size_t n) +{ + return align(n + 1); +} + +constexpr size_t blob(size_t size) +{ + return 4 + align(size); +} +} // namespace Size +} // namespace OSCPP + +#endif // OSCPP_UTIL_HPP_INCLUDED diff --git a/externals/oscpp/test/CMakeLists.txt b/externals/oscpp/test/CMakeLists.txt new file mode 100644 index 0000000..e5150f3 --- /dev/null +++ b/externals/oscpp/test/CMakeLists.txt @@ -0,0 +1,42 @@ +set(warnings -Wall -Wextra -Wno-unused-parameter -Werror) + +add_compile_options( + "$<$:${warnings}>" + "$<$:${warnings}>" + "$<$:${warnings}>" +) + +# ============================================================================= +# autocheck tests + +add_executable(oscpp_autocheck + oscpp_autocheck.cpp +) + +target_include_directories(oscpp_autocheck PRIVATE + ../include + autocheck/include +) + +add_test(oscpp_autocheck oscpp_autocheck) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/README.cpp + COMMAND ruby ${CMAKE_CURRENT_SOURCE_DIR}/../tools/mdcode.rb + ${CMAKE_CURRENT_SOURCE_DIR}/../README.md + ${CMAKE_CURRENT_BINARY_DIR}/README.cpp + MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/../README.md +) + +# ============================================================================= +# README code + +add_executable(oscpp_readme + ${CMAKE_CURRENT_BINARY_DIR}/README.cpp +) + +target_include_directories(oscpp_readme PRIVATE + ../include +) + +add_test(oscpp_readme oscpp_readme) diff --git a/externals/oscpp/test/oscpp_autocheck.cpp b/externals/oscpp/test/oscpp_autocheck.cpp new file mode 100644 index 0000000..fdff9a3 --- /dev/null +++ b/externals/oscpp/test/oscpp_autocheck.cpp @@ -0,0 +1,657 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace OSCPP { namespace AST { +class Value +{ +public: + virtual ~Value() + {} + virtual void print(std::ostream& out) const = 0; + virtual void put(OSCPP::Client::Packet& packet) const = 0; +}; + +template using List = std::list>; + +template bool equalList(const List& list1, const List& list2) +{ + if (list1.size() != list2.size()) + return false; + auto it1 = list1.begin(); + auto it2 = list2.begin(); + while ((it1 != list1.end()) && (it2 != list2.end())) + { + if (**it1 == **it2) + { + it1++; + it2++; + } + else + { + return false; + } + } + return true; +} + +template void printList(std::ostream& out, const List& list) +{ + const size_t n = list.size(); + size_t i = 1; + out << '['; + for (auto x : list) + { + x->print(out); + if (i != n) + { + out << ','; + } + i++; + } + out << ']'; +} + +class Argument : public Value +{ +public: + enum Type + { + kInt32, + kFloat32, + kString, + kBlob, + kArray, + }; + static constexpr size_t kNumTypes = kArray + 1; + + Argument(Type type) + : m_type(type) + {} + + Type type() const + { + return m_type; + } + + virtual size_t numTags() const + { + return 1; + } + + static size_t numTags(const List& args) + { + size_t n = 0; + for (auto x : args) + n += x->numTags(); + return n; + } + + bool operator==(const Argument& other) + { + return (type() == other.type()) && equals(other); + } + + virtual size_t size() const = 0; + +protected: + virtual bool equals(const Argument& other) const = 0; + +private: + Type m_type; +}; + +class Bundle; +class Message; + +class Packet : public Value +{ +public: + enum Type + { + kMessage, + kBundle + }; + + Packet(Type type) + : m_type(type) + {} + + Type type() const + { + return m_type; + } + + virtual size_t size() const = 0; + + static std::shared_ptr parse(const OSCPP::Server::Packet& packet) + { + return packet.isBundle() ? parseBundle(packet) : parseMessage(packet); + } + + bool operator==(const Packet& other) const + { + return type() == other.type() && equals(other); + } + +protected: + virtual bool equals(const Packet& other) const = 0; + +private: + static std::shared_ptr + parseBundle(const OSCPP::Server::Bundle& bdl); + static void parseArgs(OSCPP::Server::ArgStream& inArgs, + List& outArgs); + static std::shared_ptr + parseMessage(const OSCPP::Server::Message& msg); + + Type m_type; +}; + +class Bundle : public Packet +{ +public: + Bundle(uint64_t time, List packets) + : Packet(kBundle) + , m_time(time) + , m_packets(packets) + { + // assert(packets.size() > 0); + } + + void print(std::ostream& out) const override + { + out << "Bundle(" << m_time << ", "; + printList(out, m_packets); + out << ')'; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.openBundle(m_time); + for (auto p : m_packets) + p->put(packet); + packet.closeBundle(); + } + + size_t size() const override + { + size_t payload = 0; + for (auto x : m_packets) + payload += x->size(); + assert(OSCPP::isAligned(payload)); + return OSCPP::Size::bundle(m_packets.size()) + payload; + } + +protected: + bool equals(const Packet& other) const override + { + const auto& otherBundle = dynamic_cast(other); + return m_time == otherBundle.m_time && + equalList(m_packets, otherBundle.m_packets); + } + +private: + uint64_t m_time; + List m_packets; +}; + +class Message : public Packet +{ +public: + Message(std::string address, List args) + : Packet(kMessage) + , m_address(address) + , m_args(args) + {} + + void print(std::ostream& out) const override + { + out << "Message(" << m_address << ", "; + printList(out, m_args); + out << ')'; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.openMessage(m_address.c_str(), Argument::numTags(m_args)); + for (auto x : m_args) + x->put(packet); + packet.closeMessage(); + } + + size_t size() const override + { + size_t payload = 0; + for (auto x : m_args) + payload += x->size(); + assert(OSCPP::isAligned(payload)); + return OSCPP::Size::message(OSCPP::Size::String(m_address.c_str()), + Argument::numTags(m_args)) + + payload; + } + +protected: + bool equals(const Packet& other) const override + { + const auto& otherMsg = dynamic_cast(other); + return m_address == otherMsg.m_address && + equalList(m_args, otherMsg.m_args); + } + +private: + std::string m_address; + List m_args; +}; + +class Int32 : public Argument +{ +public: + Int32(int32_t value) + : Argument(kInt32) + , m_value(value) + {} + + void print(std::ostream& out) const override + { + out << "i:" << m_value; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.put(m_value); + } + + size_t size() const override + { + return OSCPP::Size::int32(); + } + +protected: + bool equals(const Argument& other) const override + { + return dynamic_cast(other).m_value == m_value; + } + +private: + int32_t m_value; +}; + +class Float32 : public Argument +{ +public: + Float32(float value) + : Argument(kFloat32) + , m_value(value) + {} + + void print(std::ostream& out) const override + { + out << "f:" << m_value; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.put(m_value); + } + + size_t size() const override + { + return OSCPP::Size::float32(); + } + +protected: + bool equals(const Argument& other) const override + { + return dynamic_cast(other).m_value == m_value; + } + +private: + float m_value; +}; + +class String : public Argument +{ +public: + String(std::string value) + : Argument(kString) + , m_value(value) + {} + + void print(std::ostream& out) const override + { + out << "s:" << m_value; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.put(m_value.c_str()); + } + + size_t size() const override + { + return OSCPP::Size::string(OSCPP::Size::String(m_value.c_str())); + } + +protected: + bool equals(const Argument& other) const override + { + return dynamic_cast(other).m_value == m_value; + } + +private: + std::string m_value; +}; + +class Blob : public Argument +{ +public: + Blob(int32_t size, const void* data = nullptr) + : Argument(kBlob) + , m_size(std::max(0, size)) + , m_data(nullptr) + { + if (m_size > 0) + { + m_data = new char[m_size]; + if (data != nullptr) + std::memcpy(m_data, data, m_size); + } + } + + Blob(OSCPP::Blob b) + : Blob(static_cast(b.size()), b.data()) + {} + + ~Blob() + { + delete[] m_data; + } + + void print(std::ostream& out) const override + { + out << "b:" << m_size; + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.put(OSCPP::Blob(m_data, m_size)); + } + + size_t size() const override + { + return OSCPP::Size::blob(m_size); + } + +protected: + bool equals(const Argument& other) const override + { + const Blob& otherBlob = dynamic_cast(other); + return otherBlob.m_size == m_size && + memcmp(m_data, otherBlob.m_data, m_size) == 0; + } + +private: + size_t m_size; + char* m_data; +}; + +class Array : public Argument +{ +public: + Array(List elems = List()) + : Argument(kArray) + , m_elems(elems) + {} + + void print(std::ostream& out) const override + { + printList(out, m_elems); + } + + void put(OSCPP::Client::Packet& packet) const override + { + packet.openArray(); + for (auto x : m_elems) + x->put(packet); + packet.closeArray(); + } + + size_t size() const override + { + size_t payload = 0; + for (auto x : m_elems) + payload += x->size(); + assert(OSCPP::isAligned(payload)); + return payload; + } + + size_t numTags() const override + { + return OSCPP::Tags::array(Argument::numTags(m_elems)); + } + +protected: + bool equals(const Argument& other) const override + { + return equalList(m_elems, dynamic_cast(other).m_elems); + } + +private: + List m_elems; +}; + +std::shared_ptr Packet::parseBundle(const OSCPP::Server::Bundle& bdl) +{ + List outPackets; + OSCPP::Server::PacketStream inPackets(bdl.packets()); + while (!inPackets.atEnd()) + { + outPackets.push_back(parse(inPackets.next())); + } + return std::make_shared(bdl.time(), std::move(outPackets)); +} + +void Packet::parseArgs(OSCPP::Server::ArgStream& inArgs, + List& outArgs) +{ + while (!inArgs.atEnd()) + { + switch (inArgs.tag()) + { + case 'i': + outArgs.push_back(std::make_shared(inArgs.int32())); + break; + case 'f': + outArgs.push_back(std::make_shared(inArgs.float32())); + break; + case 's': + outArgs.push_back(std::make_shared(inArgs.string())); + break; + case 'b': + outArgs.push_back(std::make_shared(inArgs.blob())); + break; + case '[': + { + OSCPP::Server::ArgStream inElems(inArgs.array()); + List outElems; + parseArgs(inElems, outElems); + outArgs.push_back(std::make_shared(outElems)); + } + break; + } + } +} + +std::shared_ptr Packet::parseMessage(const OSCPP::Server::Message& msg) +{ + OSCPP::Server::ArgStream inArgs(msg.args()); + List outArgs; + parseArgs(inArgs, outArgs); + return std::make_shared(msg.address(), outArgs); +} + +std::ostream& operator<<(std::ostream& out, const Packet& packet) +{ + packet.print(out); + return out; +} + +std::ostream& operator<<(std::ostream& out, + const std::shared_ptr& packet) +{ + packet->print(out); + return out; +} +}} // namespace OSCPP::AST + +namespace ac = autocheck; + +namespace OSCPP { namespace AutoCheck { + +struct MessageArgListGen +{ + typedef AST::List result_type; + result_type operator()(size_t size) const; +}; + +struct MessageArgGen +{ + typedef std::shared_ptr result_type; + result_type operator()(size_t size) const + { + AST::Argument::Type argType = static_cast( + ac::generator()(AST::Argument::kNumTypes - 1)); + switch (argType) + { + case AST::Argument::kInt32: + return std::make_shared( + ac::generator()(size)); + case AST::Argument::kFloat32: + return std::make_shared( + ac::generator()(size)); + case AST::Argument::kString: + return std::make_shared( + ac::string()(std::max(1, size))); + case AST::Argument::kBlob: + return std::make_shared( + ac::generator()(size)); + case AST::Argument::kArray: + // Exponential size backoff + return std::make_shared( + MessageArgListGen()(size / 2)); + default: + throw std::logic_error("Invalid AST::Argument::Type value"); + } + const bool InvalidArgumentType = false; + assert(InvalidArgumentType); + } +}; + +MessageArgListGen::result_type MessageArgListGen::operator()(size_t size) const +{ + const auto& elems = ac::list_of(MessageArgGen())(size); + return AST::List(elems.begin(), elems.end()); +} + +struct PacketGen +{ + // ac::generator> source; + typedef std::shared_ptr result_type; + result_type operator()(size_t size) const + { + return ac::generator()(size) ? gen_bundle(size) + : gen_message(size); + } + + result_type gen_bundle(size_t size) const + { + const auto& packets = ac::list_of(PacketGen())(size / 2); + return std::make_shared( + ac::generator()(size), + AST::List(packets.begin(), packets.end())); + } + + std::string gen_message_address(size_t size) const + { + std::string result( + ac::string()(std::max(2, size))); + if (result[0] != '/') + result[0] = '/'; + return result; + } + + result_type gen_message(size_t size) const + { + return std::make_shared(gen_message_address(size), + MessageArgListGen()(size)); + } +}; +}} // namespace OSCPP::AutoCheck + +bool prop_identity(const std::shared_ptr& packet1) +{ + // packet1->print(std::cerr); std::cerr << "\n"; + const size_t size = packet1->size(); + std::unique_ptr data(new char[size]); + OSCPP::Client::Packet clientPacket(data.get(), size); + packet1->put(clientPacket); + OSCPP::Server::Packet serverPacket(clientPacket.data(), + clientPacket.size()); + auto packet2 = OSCPP::AST::Packet::parse(serverPacket); + using namespace OSCPP::AST; + if (!(*packet1 == *packet2)) + { + std::cerr << packet1 << std::endl; + std::cerr << packet2 << std::endl; + return false; + } + return true; +} + +bool prop_overflow(const std::shared_ptr& packet, + size_t inBufferSize) +{ + const size_t packetSize = packet->size(); + const size_t bufferSize = + inBufferSize == 0 + ? 1 + : (inBufferSize < packetSize ? inBufferSize : packetSize - 1); + std::cerr << "bufferSize " << bufferSize << std::endl; + std::unique_ptr data(new char[bufferSize]); + OSCPP::Client::Packet clientPacket(data.get(), bufferSize); + bool result = false; + try + { + packet->put(clientPacket); + } + catch (OSCPP::OverflowError&) + { + result = true; + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << std::endl; + } + return result; +} + +int main(int argc, char** argv) +{ + using namespace OSCPP::AST; + using namespace OSCPP::AutoCheck; + ac::check>(prop_identity, 150, + ac::make_arbitrary(PacketGen())); + // ac::check,size_t>( + // prop_overflow, + // 150, + // ac::make_arbitrary(PacketGen(), ac::generator()) + // ); + return 0; +} diff --git a/externals/oscpp/tools/clang-format b/externals/oscpp/tools/clang-format new file mode 100755 index 0000000..543e35e --- /dev/null +++ b/externals/oscpp/tools/clang-format @@ -0,0 +1,22 @@ +#!/bin/sh +# clang-format all C/C++/ObjC source files under source control + +function source_files() +{ + git ls-tree -r HEAD --name-only | grep -E '\.(h|hpp|cpp|m|M)$' +} + +function clang_format() +{ + xargs -n1 clang-format -style=file "$@" +} + +case "$1" in + check) + source_files | clang_format -output-replacements-xml + ;; + *) + source_files | clang_format -i + ;; +esac + diff --git a/externals/oscpp/tools/mdcode.rb b/externals/oscpp/tools/mdcode.rb new file mode 100755 index 0000000..40dfdce --- /dev/null +++ b/externals/oscpp/tools/mdcode.rb @@ -0,0 +1,24 @@ +#!/usr/bin/env ruby + +if ARGV.size != 2 + puts "Usage: #{File.basename($0)} INFILE OUTFILE" + exit 1 +end + +cpp = false + +File.open(ARGV[1], "w") do |out| + File.open(ARGV[0]).each do |line| + if cpp + if /^~~~~$/ =~ line + cpp = false + else + out.write(line) + end + else + if /^~~~~cpp$/ =~ line + cpp = true + end + end + end +end diff --git a/jacktrip.pro b/jacktrip.pro index 60c2198..b987594 100644 --- a/jacktrip.pro +++ b/jacktrip.pro @@ -232,9 +232,12 @@ HEADERS += src/DataProtocol.h \ src/RingBuffer.h \ src/RingBufferWavetable.h \ src/Settings.h \ + src/SocketClient.h \ + src/SocketServer.h \ src/UdpDataProtocol.h \ src/UdpHubListener.h \ src/AudioInterface.h \ + src/AudioSocket.h \ src/compressordsp.h \ src/limiterdsp.h \ src/freeverbdsp.h \ @@ -305,10 +308,14 @@ SOURCES += src/DataProtocol.cpp \ src/LoopBack.cpp \ src/PacketHeader.cpp \ src/RingBuffer.cpp \ + src/SampleRateConverter.cpp \ src/Settings.cpp \ + src/SocketClient.cpp \ + src/SocketServer.cpp \ src/UdpDataProtocol.cpp \ src/UdpHubListener.cpp \ src/AudioInterface.cpp \ + src/AudioSocket.cpp \ src/main.cpp \ src/SslServer.cpp \ src/Auth.cpp @@ -375,6 +382,14 @@ rtaudio|bundled_rtaudio { SOURCES += src/RtAudioInterface.cpp } +nooscpp { + DEFINES += NO_OSCPP +} else { + INCLUDEPATH += externals/oscpp externals/oscpp/include + HEADERS += src/OscServer.h + SOURCES += src/OscServer.cpp +} + weakjack { SOURCES += externals/weakjack/weak_libjack.c } diff --git a/linux/Dockerfile.build b/linux/Dockerfile.build new file mode 100644 index 0000000..4af7d42 --- /dev/null +++ b/linux/Dockerfile.build @@ -0,0 +1,79 @@ +# JackTrip build container for Linux +# +# this Dockerfile is used by GitHub CI to create linux builds +# it requires these environment variables: +# +# BUILD_CONTAINER - Debian based container image to build with +# MESON_ARGS - arguments to build using meson +# QT_DOWNLOAD_URL - path to qt download (optional) + +# container image versions +ARG BUILD_CONTAINER=ubuntu:20.04 + +FROM ${BUILD_CONTAINER} AS builder + +# install required packages +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update \ + && apt-get install -yq --no-install-recommends curl python3-pip build-essential git libclang-dev libdbus-1-dev cmake ninja-build libjack-dev \ + && apt-get install -yq --no-install-recommends libfreetype6-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libx11-xcb-dev libdrm-dev libglu1-mesa-dev libwayland-dev libwayland-egl1-mesa libgles2-mesa-dev libwayland-server0 libwayland-egl-backend-dev libxcb1-dev libxext-dev libfontconfig1-dev libxrender-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev '^libxcb.*-dev' libxcb-render-util0-dev libxcomposite-dev libgtk-3-dev \ + && apt-get install -yq --no-install-recommends libasound2-dev libpulse-dev \ + && apt-get install -yq --no-install-recommends help2man clang-tidy desktop-file-utils +RUN python3 -m pip install --upgrade pip \ + && python3 -m pip install --upgrade certifi \ + && python3 -m pip install meson pyyaml Jinja2 + +WORKDIR /opt/jacktrip + +# install qt +ARG QT_DOWNLOAD_URL="" +ENV QT_DOWNLOAD_URL=$QT_DOWNLOAD_URL +ENV QT_INSTALL_PATH="/opt" +RUN if [ -n "$QT_DOWNLOAD_URL" ]; then \ + mkdir -p $QT_INSTALL_PATH; \ + chmod a+rwx $QT_INSTALL_PATH; \ + curl -k -L $QT_DOWNLOAD_URL -o qt.tar.gz; \ + tar -C $QT_INSTALL_PATH -xzf qt.tar.gz; \ + rm qt.tar.gz; \ + else \ + add-apt-repository universe; \ + apt-get update; \ + apt-get install -yq --no-install-recommends qt6-base-dev qt6-base-dev-tools qmake6 qt6-tools-dev qt6-declarative-dev qt6-webengine-dev qt6-webview-dev qt6-webview-plugins libqt6svg6-dev libqt6websockets6-dev libgl1-mesa-dev libqt6core5compat6-dev libqt6shadertools6-dev; \ + qtchooser -install qt6 $(which qmake6); \ + fi + +# install vst3sdk +ARG VST3SDK_DOWNLOAD_URL="" +ENV VST3SDK_DOWNLOAD_URL=$VST3SDK_DOWNLOAD_URL +ENV VST3SDK_INSTALL_PATH="/opt" +RUN if [ -n "$VST3SDK_DOWNLOAD_URL" ]; then \ + mkdir -p $VST3SDK_INSTALL_PATH; \ + chmod a+rwx $VST3SDK_INSTALL_PATH; \ + curl -k -L $VST3SDK_DOWNLOAD_URL -o vst3sdk.tar.gz; \ + tar -C $VST3SDK_INSTALL_PATH -xzf vst3sdk.tar.gz; \ + rm vst3sdk.tar.gz; \ + apt-get install -yq --no-install-recommends libexpat-dev libxml2-dev libxcb-util-dev libxcb-cursor-dev libxcb-keysyms1-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libgtkmm-3.0-dev libsqlite3-dev; \ + fi + +# build jacktrip using meson +COPY . ./ +ARG MESON_ARGS="" +ENV MESON_ARGS=$MESON_ARGS +ENV BUILD_PATH="/opt/jacktrip/builddir" +RUN if [ -n "$QT_DOWNLOAD_URL" ]; then \ + export QT_PATH="/opt/$(echo $QT_DOWNLOAD_URL | sed -e 's,.*/qt/\(qt-[.0-9]*\-[a-z]*\).*,\1,')"; \ + export PATH="$PATH:$QT_PATH/bin"; \ + export PKG_CONFIG_PATH="$QT_PATH/lib/pkgconfig"; \ + export CMAKE_PREFIX_PATH="$QT_PATH"; fi \ + && if [ -n "$VST3SDK_DOWNLOAD_URL" ]; then \ + export MESON_ARGS="-Dvst-sdkdir=${VST3SDK_INSTALL_PATH}/vst3sdk $MESON_ARGS"; fi \ + && export SSL_CERT_FILE=$(python3 -m certifi) \ + && meson setup --buildtype release $MESON_ARGS $BUILD_PATH \ + && meson compile -C $BUILD_PATH -v \ + && strip $BUILD_PATH/jacktrip \ + && if [ -n "$VST3SDK_DOWNLOAD_URL" ]; then \ + strip $BUILD_PATH/JackTrip.vst3; fi + +FROM scratch AS artifact + +COPY --from=builder /opt/jacktrip/builddir/jacktrip /opt/jacktrip/builddir/JackTrip.vs[t]3 /opt/jacktrip/builddir/linux/org.jacktrip.JackTrip.desktop / diff --git a/linux/README.md b/linux/README.md index fb8f267..3d46779 100644 --- a/linux/README.md +++ b/linux/README.md @@ -7,13 +7,13 @@ JackTrip requires that Qt6 is installed on your machine. For Fedora or RedHat: ``` -dnf install -y qt6-qtbase qt6-qtbase-common qt6-qtbase-gui qt6-qtsvg qt6-qtwebsockets qt6-qtwebengine qt6-qtwebchannel qt6-qt5compat +dnf install -y qt6-qtbase qt6-qtbase-common qt6-qtbase-gui qt6-qtsvg qt6-qtwebsockets qt6-qtwebengine qt6-qtwebchannel qt6-qt5compat rtaudio-devel ``` For Debian or Ubuntu: ``` -apt install -y libqt6core6 libqt6gui6 libqt6network6 libqt6widgets6 libqt6qml6 libqt6qmlcore6 libqt6quick6 libqt6quickcontrols2-6 libqt6svg6 libqt6webchannel6 libqt6webengine6-data libqt6webenginecore6 libqt6webenginecore6-bin libqt6webenginequick6 libqt6websockets6 libqt6shadertools6 qt6-qpa-plugins qml6-module-qtquick-controls qml6-module-qtqml-workerscript qml6-module-qtquick-templates qml6-module-qtquick-layouts qml6-module-qt5compat-graphicaleffects qml6-module-qtwebchannel qml6-module-qtwebengine qml6-module-qtquick-window +apt install -y libqt6core6 libqt6gui6 libqt6network6 libqt6widgets6 libqt6qml6 libqt6qmlcore6 libqt6quick6 libqt6quickcontrols2-6 libqt6svg6 libqt6webchannel6 libqt6webengine6-data libqt6webenginecore6 libqt6webenginecore6-bin libqt6webenginequick6 libqt6websockets6 libqt6shadertools6 qt6-qpa-plugins qml6-module-qtquick-controls qml6-module-qtqml-workerscript qml6-module-qtquick-templates qml6-module-qtquick-layouts qml6-module-qt5compat-graphicaleffects qml6-module-qtwebchannel qml6-module-qtwebengine qml6-module-qtquick-window libjack-jackd2-0 librtaudio6 libgtkmm-3.0-1t64 libxcb-cursor0 ``` To install JackTrip as a Linux desktop application: @@ -27,6 +27,13 @@ desktop-file-install --dir=$HOME/.local/share/applications org.jacktrip.JackTrip update-desktop-database $HOME/.local/share/applications ``` +To install the JackTrip Audio Bridge VST3 plugin: + +``` +mkdir -p $HOME/.vst3 +cp -r JackTrip.vst3 $HOME/.vst3 +``` + To install the manual page for JackTrip: ``` diff --git a/macos/JackTrip.vst3_template/Contents/Info.plist b/macos/JackTrip.vst3_template/Contents/Info.plist new file mode 100644 index 0000000..5cb1588 --- /dev/null +++ b/macos/JackTrip.vst3_template/Contents/Info.plist @@ -0,0 +1,36 @@ + + + + + BuildMachineOSBuild + 19E287 + CFBundleDevelopmentRegion + English + CFBundleExecutable + JackTrip.vst3 + CFBundleGetInfoString + JackTrip Audio Bridge + CFBundleIconFile + jacktrip + CFBundleIdentifier + %BUNDLEID% + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + + CFBundleName + %BUNDLENAME% + CFBundlePackageType + BNDL + CFBundleShortVersionString + + CFBundleSignature + ???? + CFBundleVersion + %VERSION% + CSResourcesFileMapped + + NSHumanReadableCopyright + Copyright © 2024-2025 JackTrip Labs, Inc. + + diff --git a/macos/JackTrip.vst3_template/Contents/PkgInfo b/macos/JackTrip.vst3_template/Contents/PkgInfo new file mode 100644 index 0000000..19a9cf6 --- /dev/null +++ b/macos/JackTrip.vst3_template/Contents/PkgInfo @@ -0,0 +1 @@ +BNDL???? \ No newline at end of file diff --git a/macos/assemble_app.sh b/macos/assemble_app.sh index 22475f3..fdc07fa 100755 --- a/macos/assemble_app.sh +++ b/macos/assemble_app.sh @@ -17,6 +17,7 @@ KEY_STORE="AC_PASSWORD" TEMP_KEYCHAIN="" USE_DEFAULT_KEYCHAIN=false BINARY="../builddir/jacktrip" +VST_BINARY="../builddir/$APPNAME.vst3" PSI=false OPTIND=1 @@ -140,7 +141,7 @@ sed -i '' "s/%BUNDLEID%/$BUNDLE_ID/" "$APPNAME.app/Contents/Info.plist" if [ -n "$DYNAMIC_QT" ]; then QT_VERSION="qt$(echo "$DYNAMIC_QT" | sed -E '1!d;s/.*compatibility version ([0-9]+)\.[0-9]+\.[0-9]+.*/\1/g')" - echo "Detected a dynamic Qt$QT_VERSION binary" + echo "Detected a dynamic $QT_VERSION binary" DEPLOY_CMD="$(which macdeployqt)" if [ -z "$DEPLOY_CMD" ]; then # Attempt to find macdeployqt. Try macports location first, then brew. @@ -171,6 +172,24 @@ if [ -n "$DYNAMIC_QT" ]; then fi fi +if [ -f "$VST_BINARY" ]; then + echo "Building bundle $APPNAME.vst3 (id: $BUNDLE_ID.vst3)" + rm -rf "$APPNAME.vst3" + [ ! -d "JackTrip.vst3_template/Contents/MacOS" ] && mkdir JackTrip.vst3_template/Contents/MacOS + [ ! -d "JackTrip.vst3_template/Contents/Resources" ] && mkdir JackTrip.vst3_template/Contents/Resources + [ ! -d "JackTrip.app_template/Contents/Resources" ] && mkdir JackTrip.vst3_template/Contents/Resources + cp -a JackTrip.vst3_template "$APPNAME.vst3" + cp -f $VST_BINARY "$APPNAME.vst3/Contents/MacOS/" + # copy licenses + cp -f ../LICENSE.md "$APPNAME.vst3/Contents/Resources/" + cp -Rf ../LICENSES "$APPNAME.vst3/Contents/Resources/" + cp ../src/vst3/resources/* "$APPNAME.vst3/Contents/Resources/" + sed -i '' "s/%VERSION%/$VERSION/" "$APPNAME.vst3/Contents/Resources/moduleinfo.json" + sed -i '' "s/%VERSION%/$VERSION/" "$APPNAME.vst3/Contents/Info.plist" + sed -i '' "s/%BUNDLENAME%/$APPNAME.vst3/" "$APPNAME.vst3/Contents/Info.plist" + sed -i '' "s/%BUNDLEID%/$BUNDLE_ID.vst3/" "$APPNAME.vst3/Contents/Info.plist" +fi + [ $BUILD_INSTALLER = true ] || exit 0 # If you have Packages installed, you can build an installer for the newly created app bundle. @@ -185,6 +204,10 @@ fi if [ -n "$CERTIFICATE" ]; then echo "Signing $APPNAME.app" codesign -f -s "$CERTIFICATE" --timestamp --entitlements entitlements.plist --options "runtime" "$APPNAME.app" + if [ -f "$VST_BINARY" ]; then + echo "Signing $APPNAME.vst3" + codesign -f -s "$CERTIFICATE" --timestamp --entitlements entitlements.plist --options "runtime" "$APPNAME.vst3" + fi fi # prepare license @@ -206,7 +229,11 @@ cp ../README.md "$README_PATH" sed -i '' "s/# //" "$README_PATH" # remove markdown header perl -ane 'chop;print "\n\n" if(/^\s*$/); map{print "$_ ";}@F;' "$README_PATH" > tmp && mv tmp "$README_PATH" # unwrap lines -cp package/JackTrip.pkgproj_template package/JackTrip.pkgproj +if [ -f "$VST_BINARY" ]; then + cp package/JackTrip.pkgproj_template_with_vst3 package/JackTrip.pkgproj +else + cp package/JackTrip.pkgproj_template package/JackTrip.pkgproj +fi sed -i '' "s/%VERSION%/$VERSION/" package/JackTrip.pkgproj sed -i '' "s/%BUNDLENAME%/$APPNAME/" package/JackTrip.pkgproj sed -i '' "s/%BUNDLEID%/$BUNDLE_ID/" package/JackTrip.pkgproj diff --git a/macos/package/JackTrip.pkgproj_template_with_vst3 b/macos/package/JackTrip.pkgproj_template_with_vst3 new file mode 100644 index 0000000..d0be9eb --- /dev/null +++ b/macos/package/JackTrip.pkgproj_template_with_vst3 @@ -0,0 +1,1740 @@ + + + + + PACKAGES + + + MUST-CLOSE-APPLICATION-ITEMS + + MUST-CLOSE-APPLICATIONS + + PACKAGE_FILES + + DEFAULT_INSTALL_LOCATION + / + HIERARCHY + + CHILDREN + + + CHILDREN + + + CHILDREN + + GID + 80 + PATH + Jack + PATH_TYPE + 2 + PERMISSIONS + 509 + TYPE + 2 + UID + 0 + + + BUNDLE_CAN_DOWNGRADE + + BUNDLE_POSTINSTALL_PATH + + PATH + postinstall.sh + PATH_TYPE + 1 + + BUNDLE_PREINSTALL_PATH + + PATH_TYPE + 0 + + CHILDREN + + GID + 80 + PATH + ../%BUNDLENAME%.app + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + Utilities + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + GID + 80 + PATH + Applications + PATH_TYPE + 0 + PERMISSIONS + 509 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + bin + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 80 + PATH + Application Support + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Audio + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Automator + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + ColorPickers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Documentation + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Extensions + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Filesystems + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + Fonts + PATH_TYPE + 0 + PERMISSIONS + 1021 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Frameworks + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Input Methods + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Internet Plug-Ins + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + LaunchAgents + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + LaunchDaemons + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PreferencePanes + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Preferences + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + Printers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PrivilegedHelperTools + PATH_TYPE + 0 + PERMISSIONS + 1005 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickLook + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickTime + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Screen Savers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Scripts + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Services + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Widgets + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + etc + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + var + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + GID + 0 + PATH + private + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + sbin + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + Extensions + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + System + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + Shared + PATH_TYPE + 0 + PERMISSIONS + 1023 + TYPE + 1 + UID + 0 + + + GID + 80 + PATH + Users + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + bin + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + include + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + lib + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + bin + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + GID + 0 + PATH + local + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + sbin + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + share + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + GID + 0 + PATH + usr + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + -1 + UID + 0 + + + GID + 0 + PATH + / + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + PAYLOAD_TYPE + 0 + PRESERVE_EXTENDED_ATTRIBUTES + + SHOW_INVISIBLE + + SPLIT_FORKS + + TREAT_MISSING_FILES_AS_WARNING + + VERSION + 5 + + PACKAGE_SCRIPTS + + POSTINSTALL_PATH + + PATH_TYPE + 0 + + PREINSTALL_PATH + + PATH_TYPE + 0 + + RESOURCES + + + PACKAGE_SETTINGS + + AUTHENTICATION + 1 + CONCLUSION_ACTION + 0 + FOLLOW_SYMBOLIC_LINKS + + IDENTIFIER + %BUNDLEID% + LOCATION + 0 + NAME + %BUNDLENAME% + OVERWRITE_PERMISSIONS + + PAYLOAD_SIZE + -1 + REFERENCE_PATH + + RELOCATABLE + + USE_HFS+_COMPRESSION + + VERSION + %VERSION% + + TYPE + 0 + UUID + 10E1CE8D-C84E-45FC-81DA-B174548AE779 + + + MUST-CLOSE-APPLICATION-ITEMS + + MUST-CLOSE-APPLICATIONS + + PACKAGE_FILES + + DEFAULT_INSTALL_LOCATION + / + HIERARCHY + + CHILDREN + + + CHILDREN + + GID + 80 + PATH + Applications + PATH_TYPE + 0 + PERMISSIONS + 509 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 80 + PATH + Application Support + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + + CHILDREN + + + BUNDLE_CAN_DOWNGRADE + + CHILDREN + + GID + 0 + PATH + ../%BUNDLENAME%.vst3 + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + GID + 0 + PATH + VST3 + PATH_TYPE + 2 + PERMISSIONS + 509 + TYPE + 2 + UID + 0 + + + GID + 0 + PATH + Plug-Ins + PATH_TYPE + 2 + PERMISSIONS + 509 + TYPE + 2 + UID + 0 + + + GID + 0 + PATH + Audio + PATH_TYPE + 2 + PERMISSIONS + 509 + TYPE + 2 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Automator + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Documentation + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Extensions + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Filesystems + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Frameworks + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Input Methods + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Internet Plug-Ins + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Keyboard Layouts + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + LaunchAgents + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + LaunchDaemons + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PreferencePanes + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Preferences + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 80 + PATH + Printers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + PrivilegedHelperTools + PATH_TYPE + 0 + PERMISSIONS + 1005 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickLook + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + QuickTime + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Screen Savers + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Scripts + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Services + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + GID + 0 + PATH + Widgets + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + CHILDREN + + + CHILDREN + + GID + 0 + PATH + Shared + PATH_TYPE + 0 + PERMISSIONS + 1023 + TYPE + 1 + UID + 0 + + + GID + 80 + PATH + Users + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + / + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + PAYLOAD_TYPE + 0 + PRESERVE_EXTENDED_ATTRIBUTES + + SHOW_INVISIBLE + + SPLIT_FORKS + + TREAT_MISSING_FILES_AS_WARNING + + VERSION + 5 + + PACKAGE_SCRIPTS + + POSTINSTALL_PATH + + PATH_TYPE + 0 + + PREINSTALL_PATH + + PATH_TYPE + 0 + + RESOURCES + + + PACKAGE_SETTINGS + + AUTHENTICATION + 1 + CONCLUSION_ACTION + 0 + FOLLOW_SYMBOLIC_LINKS + + IDENTIFIER + %BUNDLEID%.vst3 + LOCATION + 0 + NAME + %BUNDLENAME%.vst3 + OVERWRITE_PERMISSIONS + + PAYLOAD_SIZE + -1 + REFERENCE_PATH + + RELOCATABLE + + USE_HFS+_COMPRESSION + + VERSION + %VERSION% + + TYPE + 0 + UUID + 8CAD404A-E34F-469F-93DD-D2D2125F35F5 + + + PROJECT + + PROJECT_COMMENTS + + NOTES + + + + PROJECT_PRESENTATION + + BACKGROUND + + APPAREANCES + + DARK_AQUA + + LIGHT_AQUA + + + SHARED_SETTINGS_FOR_ALL_APPAREANCES + + + INSTALLATION_STEPS + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewIntroductionController + INSTALLER_PLUGIN + Introduction + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewReadMeController + INSTALLER_PLUGIN + ReadMe + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewLicenseController + INSTALLER_PLUGIN + License + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewDestinationSelectController + INSTALLER_PLUGIN + TargetSelect + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationTypeController + INSTALLER_PLUGIN + PackageSelection + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationController + INSTALLER_PLUGIN + Install + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewSummaryController + INSTALLER_PLUGIN + Summary + LIST_TITLE_KEY + InstallerSectionTitle + + + INTRODUCTION + + LOCALIZATIONS + + + LICENSE + + LOCALIZATIONS + + + LANGUAGE + English + VALUE + + PATH + license.txt + PATH_TYPE + 3 + + + + MODE + 0 + + README + + LOCALIZATIONS + + + LANGUAGE + English + VALUE + + PATH + readme.txt + PATH_TYPE + 3 + + + + + TITLE + + LOCALIZATIONS + + + + PROJECT_REQUIREMENTS + + LIST + + RESOURCES + + ROOT_VOLUME_ONLY + + + PROJECT_SETTINGS + + BUILD_FORMAT + 0 + BUILD_PATH + + PATH + build + PATH_TYPE + 1 + + EXCLUDED_FILES + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + .DS_Store + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove .DS_Store files + PROXY_TOOLTIP + Remove ".DS_Store" files created by the Finder. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + .pbdevelopment + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove .pbdevelopment files + PROXY_TOOLTIP + Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + CVS + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .cvsignore + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + .cvspass + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + .svn + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .git + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .gitignore + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove SCM metadata + PROXY_TOOLTIP + Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + classes.nib + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + designable.db + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + info.nib + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Optimize nib files + PROXY_TOOLTIP + Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + Resources Disabled + TYPE + 1 + + + PROTECTED + + PROXY_NAME + Remove Resources Disabled folders + PROXY_TOOLTIP + Remove "Resources Disabled" folders. + STATE + + + + SEPARATOR + + + + NAME + %BUNDLENAME% + PAYLOAD_ONLY + + TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING + + + + TYPE + 0 + VERSION + 2 + + diff --git a/macos/package/postinstall.sh b/macos/package/postinstall.sh index a668d3c..b443867 100755 --- a/macos/package/postinstall.sh +++ b/macos/package/postinstall.sh @@ -6,5 +6,5 @@ rm -f /usr/local/bin/jacktrip ln -s "$2"/Contents/MacOS/jacktrip /usr/local/bin/jacktrip # Open JackTrip on intaller finish -open -a /Applications/JackTrip.app +sudo -u $USER open -a /Applications/JackTrip.app exit 0 diff --git a/macos/sign-stuff.sh b/macos/sign-stuff.sh index ed020aa..fe92b5c 100755 --- a/macos/sign-stuff.sh +++ b/macos/sign-stuff.sh @@ -5,6 +5,7 @@ CERTIFICATE="" PACKAGE_CERT="" USERNAME="" PASSWORD="" +# Only needed if you belong to more than one dev team TEAM_ID="" if [ -z $1 ]; then diff --git a/meson.build b/meson.build index 0685415..2bba8cb 100644 --- a/meson.build +++ b/meson.build @@ -31,7 +31,10 @@ defines = ['-DWAIRTOHUB'] c_defines = [] incdirs = [] -if get_option('debug') == false +if get_option('debug') == true + defines += ['-D_DEBUG'] + c_defines += ['-D_DEBUG'] +else defines += ['-DNDEBUG', '-DQT_NO_DEBUG'] c_defines += ['-DNDEBUG', '-DQT_NO_DEBUG'] endif @@ -55,6 +58,7 @@ endif src = [ 'src/DataProtocol.cpp', 'src/JackTrip.cpp', 'src/ProcessPlugin.cpp', + 'src/AudioSocket.cpp', 'src/AudioTester.cpp', 'src/jacktrip_globals.cpp', 'src/JackTripWorker.cpp', @@ -63,7 +67,10 @@ src = [ 'src/DataProtocol.cpp', 'src/RingBuffer.cpp', 'src/JitterBuffer.cpp', 'src/Regulator.cpp', + 'src/SampleRateConverter.cpp', 'src/Settings.cpp', + 'src/SocketClient.cpp', + 'src/SocketServer.cpp', 'src/UdpDataProtocol.cpp', 'src/UdpHubListener.cpp', 'src/AudioInterface.cpp', @@ -82,6 +89,7 @@ src = [ 'src/DataProtocol.cpp', moc_h = ['src/DataProtocol.h', 'src/JackTrip.h', 'src/ProcessPlugin.h', + 'src/AudioSocket.h', 'src/Meter.h', 'src/Monitor.h', 'src/StereoToMono.h', @@ -91,11 +99,23 @@ moc_h = ['src/DataProtocol.h', 'src/PacketHeader.h', 'src/Regulator.h', 'src/Settings.h', + 'src/SocketClient.h', + 'src/SocketServer.h', 'src/UdpDataProtocol.h', 'src/UdpHubListener.h', 'src/Auth.h', 'src/SslServer.h'] +if get_option('nooscpp') == true + defines += '-DNO_OSCPP' + c_defines += '-DNO_OSCPP' +else + incdirs += include_directories('externals/oscpp', is_system: true) + incdirs += include_directories('externals/oscpp/include', is_system: true) + src += ['src/OscServer.cpp'] + moc_h += ['src/OscServer.h'] +endif + ui_h = [] qres = [] deps = [dependency('threads')] @@ -117,7 +137,7 @@ else 'src/Patcher.cpp'] moc_h += ['src/Patcher.h'] if get_option('weakjack') == true - incdirs += include_directories('externals/weakjack') + incdirs += include_directories('externals/weakjack', is_system: true) src += 'externals/weakjack/weak_libjack.c' defines += '-DUSE_WEAK_JACK' c_defines += '-DUSE_WEAK_JACK' @@ -128,11 +148,16 @@ else endif endif +qmake = '' +qt_core_deps = [] if qt_version == '5' - deps += dependency('qt5', modules: ['Core', 'Network'], include_type: 'system') + qmake = find_program('qmake', required: true) + qt_core_deps = dependency('qt5', modules: ['Core', 'Network'], include_type: 'system') else - deps += dependency('qt6', modules: ['Core', 'Network'], include_type: 'system') + qmake = find_program('qmake6', required: true) + qt_core_deps = dependency('qt6', modules: ['Core', 'Network'], include_type: 'system') endif +deps += qt_core_deps if get_option('nogui') == true or (get_option('noclassic') == true and get_option('novs') == true) # command line only @@ -246,52 +271,58 @@ else endif endif +static_deps = [] +static_src = [] +static_link_args = [] if get_option('default_library') == 'static' # use qmake to get paths for qt libraries and plugins # seems like qt module should have a method for this, but it doesn't - qmake = find_program('qmake', required: true) qt_libdir = run_command(qmake, '-query', 'QT_INSTALL_LIBS', check : true).stdout().strip() qt_plugindir = run_command(qmake, '-query', 'QT_INSTALL_PLUGINS', check : true).stdout().strip() if qt_version == '6' # qt6 requires "Bundled*" modules for linking - deps += dependency('qt6', modules: ['BundledLibpng', 'BundledPcre2', 'BundledHarfbuzz', 'BundledZLIB'], include_type: 'system') + static_deps += dependency('qt6', modules: ['DBus', 'BundledLibpng', 'BundledPcre2', 'BundledHarfbuzz', 'BundledZLIB'], include_type: 'system') else - deps += compiler.find_library('qtpcre2', required : true, dirs : [qt_libdir]) + static_deps += compiler.find_library('qtpcre2', required : true, dirs : [qt_libdir]) endif if (host_machine.system() == 'linux') # linux static - deps += compiler.find_library('ssl', required : true, dirs : [qt_libdir]) - deps += compiler.find_library('crypto', required : true, dirs : [qt_libdir]) - deps += compiler.find_library('dl', required : true) - deps += compiler.find_library('glib-2.0', required : true) + static_deps += compiler.find_library('ssl', required : true, dirs : [qt_libdir]) + static_deps += compiler.find_library('crypto', required : true, dirs : [qt_libdir]) + static_deps += compiler.find_library('dl', required : true) + static_deps += compiler.find_library('glib-2.0', required : true) if qt_version == '6' # we need a Q_IMPORT_LIBRARY for the openssl backend on linux - deps += compiler.find_library('qopensslbackend', required : true, dirs : [qt_plugindir+'/tls']) - src += ['src/QtStaticPlugins.cpp'] + static_deps += compiler.find_library('dbus-1', required : true) + static_deps += compiler.find_library('qopensslbackend', required : true, dirs : [qt_plugindir+'/tls']) + static_src += ['src/QtStaticPlugins.cpp'] endif else if (host_machine.system() == 'windows') # windows static - deps += compiler.find_library('bcrypt', required : true) - deps += compiler.find_library('winmm', required : true) - deps += compiler.find_library('Crypt32', required : true) + static_deps += compiler.find_library('bcrypt', required : true) + static_deps += compiler.find_library('winmm', required : true) + static_deps += compiler.find_library('Crypt32', required : true) if qt_version == '6' - deps += compiler.find_library('Authz', required : true) + static_deps += compiler.find_library('Authz', required : true) endif else # mac static # this approach fails for universal builds, so we have to just append to link_args - #deps += dependency('CoreServices', required : true) - link_args += ['-framework', 'CoreServices'] - link_args += ['-framework', 'CFNetwork'] - link_args += ['-framework', 'AppKit'] - link_args += ['-framework', 'IOKit'] - link_args += ['-framework', 'Security'] - link_args += ['-framework', 'GSS'] - link_args += ['-framework', 'SystemConfiguration'] - deps += dependency('zlib', required : true) + #static_deps += dependency('CoreServices', required : true) + static_link_args += ['-framework', 'CoreServices'] + static_link_args += ['-framework', 'CFNetwork'] + static_link_args += ['-framework', 'AppKit'] + static_link_args += ['-framework', 'IOKit'] + static_link_args += ['-framework', 'Security'] + static_link_args += ['-framework', 'GSS'] + static_link_args += ['-framework', 'SystemConfiguration'] + static_deps += dependency('zlib', required : true) endif endif + deps += static_deps + src += static_src + link_args += static_link_args endif # QT_OPENSOURCE should only be defined for open source Qt distribution @@ -313,6 +344,28 @@ if rtaudio_dep.found() == false and jack_dep.found() == false configure.''') endif +libsamplerate_dep = [] +found_libsamplerate = false +if get_option('libsamplerate').allowed() + opt_var = cmake.subproject_options() + if get_option('buildtype') == 'release' + opt_var.add_cmake_defines({'CMAKE_BUILD_TYPE': 'Release'}) + else + opt_var.add_cmake_defines({'CMAKE_BUILD_TYPE': 'Debug'}) + endif + opt_var.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON'}) + libsamplerate_subproject = cmake.subproject('libsamplerate', options: opt_var) + libsamplerate_dep = libsamplerate_subproject.dependency('samplerate') + found_libsamplerate = libsamplerate_dep.found() + if not found_libsamplerate and not get_option('libsamplerate').auto() + error('failed to configure libsamplerate') + endif + if found_libsamplerate + defines += '-DHAVE_LIBSAMPLERATE' + deps += libsamplerate_dep + endif +endif + if host_machine.system() == 'darwin' src += ['src/NoNap.mm'] # Adding CoreAudio here is a workaround and should be removed @@ -342,6 +395,124 @@ endif jacktrip = executable('jacktrip', src, qres_files, ui_files, moc_files, include_directories: incdirs, dependencies: deps, link_args: link_args, c_args: c_defines, cpp_args: defines, install: true ) +vst_sdkdir = get_option('vst-sdkdir') +if vst_sdkdir != '' + # adapted from https://github.com/centricular/gstreamer-vst3 + vst_includedir = '@0@/public.sdk/source'.format(vst_sdkdir) + vst_pluginterfaces_includedir = '@0@'.format(vst_sdkdir) + vst_incdirs = [] + vst_incdirs += include_directories('@0@'.format(vst_includedir), is_system: true) + vst_incdirs += include_directories('@0@'.format(vst_pluginterfaces_includedir), is_system: true) + vst_incdirs += include_directories('@0@/vstgui4'.format(vst_pluginterfaces_includedir), is_system: true) + + vst_libdir = get_option('vst-libdir') + if vst_libdir == '' + vst_libdir = vst_sdkdir + '/lib' + endif + libbase_dep = compiler.find_library('base', required : true, dirs : [vst_libdir]) + libsdk_dep = compiler.find_library('sdk', required : true, dirs : [vst_libdir]) + libsdk_common_dep = compiler.find_library('sdk_common', required : true, dirs : [vst_libdir]) + libvstgui_dep = compiler.find_library('vstgui', required : true, dirs : [vst_libdir]) + libvstgui_support_dep = compiler.find_library('vstgui_support', required : true, dirs : [vst_libdir]) + libvstgui_uidescription_dep = compiler.find_library('vstgui_uidescription', required : true, dirs : [vst_libdir]) + libpluginterfaces_dep = compiler.find_library('pluginterfaces', required : true, dirs : [vst_libdir]) + vst_deps = [libbase_dep, libsdk_dep, libsdk_common_dep, libvstgui_dep, libvstgui_uidescription_dep, libvstgui_support_dep, libpluginterfaces_dep] + vst_deps += qt_core_deps + + vst_sources = ['src/vst3/JackTripVSTController.cpp', 'src/vst3/JackTripVSTEntry.cpp', 'src/vst3/JackTripVSTProcessor.cpp'] + + # uncomment for live editor + # vst_sources += ['@0@/vstgui4/vstgui/vstgui_uidescription.cpp'.format(vst_sdkdir), '@0@/vstgui4/vstgui/plugin-bindings/vst3editor.cpp'.format(vst_sdkdir)] + # defines += ['-DVSTGUI_LIVE_EDITING=1'] + + vst_link_args = [] + if (host_machine.system() == 'linux') + vst_sources += '@0@/main/linuxmain.cpp'.format(vst_includedir) + vst_deps += static_deps + vst_sources += static_src + vst_link_args += static_link_args + vst_deps += compiler.find_library('xcb-util', required : true) + vst_deps += compiler.find_library('xcb-cursor', required : true) + vst_deps += compiler.find_library('xkbcommon-x11', required : true) + vst_deps += compiler.find_library('xml2', required : true) + vst_deps += compiler.find_library('cairo', required : true) + vst_deps += compiler.find_library('pango-1.0', required : true) + vst_deps += compiler.find_library('pangocairo-1.0', required : true) + vst_deps += compiler.find_library('expat', required : true) + vst_deps += compiler.find_library('fontconfig', required : true) + elif (host_machine.system() == 'darwin') + vst_sources += '@0@/main/macmain.cpp'.format(vst_includedir) + vst_link_args += ['-framework', 'CoreServices'] + vst_link_args += ['-framework', 'CFNetwork'] + vst_link_args += ['-framework', 'AppKit'] + vst_link_args += ['-framework', 'IOKit'] + vst_link_args += ['-framework', 'Security'] + vst_link_args += ['-framework', 'GSS'] + vst_link_args += ['-framework', 'SystemConfiguration'] + vst_deps += dependency('zlib', required : true) + if (qt_version == '5') + vst_link_args += '@0@/libQt5Core.a'.format(vst_libdir) + vst_link_args += '@0@/libQt5Network.a'.format(vst_libdir) + else + vst_link_args += '@0@/libQt6Core.a'.format(vst_libdir) + vst_link_args += '@0@/libQt6Network.a'.format(vst_libdir) + vst_link_args += '@0@/libQt6BundledPcre2.a'.format(vst_libdir) + endif + elif (host_machine.system() == 'windows') + vst_sources += '@0@/main/dllmain.cpp'.format(vst_includedir) + vst_deps += static_deps + vst_sources += static_src + vst_link_args += static_link_args + vst_deps += compiler.find_library('bcrypt', required : true) + vst_deps += compiler.find_library('winmm', required : true) + vst_deps += compiler.find_library('Crypt32', required : true) + vst_deps += compiler.find_library('ws2_32', required: true) + vst_link_args += 'userenv.lib' + vst_link_args += 'Synchronization.lib' + vst_link_args += 'Netapi32.lib' + vst_link_args += 'Version.lib' + vst_link_args += 'Dwrite.lib' + vst_link_args += 'Iphlpapi.lib' + vst_link_args += 'Secur32.lib' + vst_link_args += 'Winhttp.lib' + vst_link_args += 'Dnsapi.lib' + vst_link_args += 'Iphlpapi.lib' + else + error('Unsupported platform: ' + host_machine.system()) + endif + + if found_libsamplerate + vst_deps += libsamplerate_dep + endif + + audio_socket_moc_h = ['src/AudioSocket.h', 'src/SocketClient.h', 'src/ProcessPlugin.h'] + audio_socket_sources = qt.compile_moc(headers: audio_socket_moc_h, extra_args: defines) + audio_socket_sources += [ + 'src/AudioSocket.cpp', + 'src/SocketClient.cpp', + 'src/ProcessPlugin.cpp', + 'src/jacktrip_globals.cpp' + ] + audio_socket_test = executable('audio_socket_tests', + ['tests/audio_socket_test.cpp'] + audio_socket_sources, + cpp_args : defines, + dependencies : vst_deps, + include_directories: vst_incdirs + include_directories('src/'), + link_args: vst_link_args + ) + + vst3 = shared_module('JackTrip', + vst_sources, audio_socket_sources, + name_prefix: '', + name_suffix: 'vst3', + cpp_args : defines, + dependencies : vst_deps, + include_directories: vst_incdirs, + link_args: vst_link_args, + cpp_args: defines + ) +endif + help2man = find_program('help2man', required: false) if (host_machine.system() == 'linux') if help2man.found() @@ -373,4 +544,5 @@ summary({'JACK': jack_dep.found(), summary({'Application ID': application_id, 'GUI': not get_option('nogui'), 'WAIR': get_option('wair'), + 'Sample rate conversions': found_libsamplerate, 'Manpage': help2man.found()}, bool_yn: true, section: 'Configuration') diff --git a/meson_options.txt b/meson_options.txt index ec66535..a1850ae 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -2,8 +2,10 @@ option('wair', type : 'boolean', value : false, description: 'WAIR') option('rtaudio', type : 'feature', value : 'auto', description: 'Build with RtAudio Backend') option('jack', type : 'feature', value : 'auto', description: 'Build with JACK Backend') option('weakjack', type : 'boolean', value : false, description: 'Weak link JACK library') +option('libsamplerate', type : 'feature', value : 'auto', description: 'Support for sample rate conversions') option('nogui', type : 'boolean', value : false, description: 'Build without graphical user interface') option('novs', type : 'boolean', value : false, description: 'Build without Virtual Studio support') +option('nooscpp', type : 'boolean', value : false, description: 'Build without OSC support') option('noclassic', type : 'boolean', value : false, description: 'Build without classic mode support') option('vsftux', type : 'boolean', value : false, description: 'Build with Virtual Studio first launch experience') option('noupdater', type : 'boolean', value : false, description: 'Build without auto-update support') @@ -11,4 +13,8 @@ option('nofeedback', type : 'boolean', value : false, description: 'Build withou option('profile', type: 'combo', choices: ['default', 'development'], value: 'default', description: 'Choose build profile / Sets desktop id accordingly') option('qtversion', type : 'combo', choices: ['', '5', '6'], description: 'Choose to build with either Qt5 or Qt6') option('qtedition', type : 'combo', choices: ['opensource', 'commercial'], description: 'Choose license edition for Qt') -option('buildinfo', type : 'string', value : '', yield : true, description: 'Additional info used to describe the build') \ No newline at end of file +option('buildinfo', type : 'string', value : '', yield : true, description: 'Additional info used to describe the build') +option('vst-libdir', type : 'string', value : '', yield : true, + description : 'Directory with VST SDK3 libraries (e.g. libsdk.a, libbase.a)') +option('vst-sdkdir', type : 'string', value : '', yield : true, + description : 'Directory with VST SDK3 headers (e.g. public.sdk/source/vst/hosting/module.h)') \ No newline at end of file diff --git a/src/Analyzer.cpp b/src/Analyzer.cpp index 824eba6..9ef9e3d 100644 --- a/src/Analyzer.cpp +++ b/src/Analyzer.cpp @@ -83,7 +83,7 @@ Analyzer::~Analyzer() void Analyzer::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); mPushBuffer.resize(mBufferSize); mCircularBufferPtr = new WaitFreeFrameBuffer<4096>(mBufferSize * sizeof(float)); diff --git a/src/AudioInterface.cpp b/src/AudioInterface.cpp index 97cb28d..7450912 100644 --- a/src/AudioInterface.cpp +++ b/src/AudioInterface.cpp @@ -41,7 +41,9 @@ #include #include +#include "AudioSocket.h" #include "JackTrip.h" +#include "ProcessPlugin.h" using std::cout; using std::endl; @@ -95,18 +97,10 @@ AudioInterface::~AudioInterface() delete[] mAPInBuffer[i]; } #endif // endwhere - for (auto* i : std::as_const(mProcessPluginsFromNetwork)) { - i->disconnect(); - delete i; - } - for (auto* i : std::as_const(mProcessPluginsToNetwork)) { - i->disconnect(); - delete i; - } - for (auto* i : std::as_const(mProcessPluginsToMonitor)) { - i->disconnect(); - delete i; - } + mProcessPluginsFromNetwork.clear(); + mProcessPluginsToNetwork.clear(); + mProcessPluginsToMonitor.clear(); + mAudioSockets.clear(); } //******************************************************************************* @@ -195,6 +189,10 @@ void AudioInterface::audioInputCallback(QVarLengthArray& in_buffer, } #ifndef WAIR + for (auto& s : qAsConst(mAudioSockets)) { + s->getFromAudioSocketPlugin()->compute(n_frames, in_buffer.data(), + in_buffer.data()); + } if (mMonitorQueuePtr != nullptr && mProcessPluginsToMonitor.size() > 0) { // copy audio input to monitor queue for (int i = 0; i < mInputChans.size(); i++) { @@ -206,7 +204,7 @@ void AudioInterface::audioInputCallback(QVarLengthArray& in_buffer, #endif // not WAIR // process incoming signal from audio interface using process plugins - for (auto* p : std::as_const(mProcessPluginsToNetwork)) { + for (auto& p : qAsConst(mProcessPluginsToNetwork)) { if (p->getInited()) { p->compute(n_frames, in_buffer.data(), in_buffer.data()); } @@ -268,7 +266,7 @@ void AudioInterface::audioOutputCallback(QVarLengthArray& out_buffer, /// with one. do it chaining outputs to inputs in the buffers. May need a tempo buffer #ifndef WAIR // NOT WAIR: - for (auto* p : std::as_const(mProcessPluginsFromNetwork)) { + for (auto& p : qAsConst(mProcessPluginsFromNetwork)) { if (p->getInited()) { p->compute(n_frames, out_buffer.data(), out_buffer.data()); } @@ -302,7 +300,7 @@ void AudioInterface::audioOutputCallback(QVarLengthArray& out_buffer, std::memcpy(mOutProcessBuffer[i], sample_ptr, sizeof(sample_t) * n_frames); } for (int i = 0; i < mProcessPluginsToMonitor.size(); i++) { - ProcessPlugin* p = mProcessPluginsToMonitor[i]; + ProcessPlugin* p = mProcessPluginsToMonitor[i].get(); if (p->getInited()) { // note: for monitor plugins, the output is out_buffer (to the speakers) p->compute(n_frames, mOutProcessBuffer.data(), out_buffer.data()); @@ -310,6 +308,11 @@ void AudioInterface::audioOutputCallback(QVarLengthArray& out_buffer, } } + for (auto& s : qAsConst(mAudioSockets)) { + s->getToAudioSocketPlugin()->compute(n_frames, out_buffer.data(), + out_buffer.data()); + } + #else // WAIR: // nib16 result now in mNetInBuffer int nChansIn = mInputChans.size(); @@ -642,9 +645,9 @@ void AudioInterface::setPipewireLatency(unsigned int bufferSize, unsigned int sa } //******************************************************************************* -void AudioInterface::appendProcessPluginToNetwork(ProcessPlugin* plugin) +void AudioInterface::appendProcessPluginToNetwork(QSharedPointer& plugin) { - if (!plugin) { + if (plugin.isNull()) { return; } @@ -663,9 +666,9 @@ void AudioInterface::appendProcessPluginToNetwork(ProcessPlugin* plugin) mProcessPluginsToNetwork.append(plugin); } -void AudioInterface::appendProcessPluginFromNetwork(ProcessPlugin* plugin) +void AudioInterface::appendProcessPluginFromNetwork(QSharedPointer& plugin) { - if (!plugin) { + if (plugin.isNull()) { return; } @@ -684,9 +687,9 @@ void AudioInterface::appendProcessPluginFromNetwork(ProcessPlugin* plugin) mProcessPluginsFromNetwork.append(plugin); } -void AudioInterface::appendProcessPluginToMonitor(ProcessPlugin* plugin) +void AudioInterface::appendProcessPluginToMonitor(QSharedPointer& plugin) { - if (!plugin) { + if (plugin.isNull()) { return; } @@ -715,34 +718,53 @@ void AudioInterface::appendProcessPluginToMonitor(ProcessPlugin* plugin) mProcessPluginsToMonitor.append(plugin); } +void AudioInterface::appendAudioSocket(QSharedPointer& s) +{ + if (s.isNull()) + return; + static_cast(s->getFromAudioSocketPlugin().data()) + ->setPassthrough(true); + mAudioSockets.append(s); +} + void AudioInterface::initPlugins(bool verbose) { const int nChansIn = (MIXTOMONO == mInputMixMode) ? 1 : mInputChans.size(); const int nChansOut = mOutputChans.size(); const int nChansMon = getNumMonChannels(); int nPlugins = mProcessPluginsFromNetwork.size() + mProcessPluginsToNetwork.size() - + mProcessPluginsToMonitor.size(); + + mProcessPluginsToMonitor.size() + (mAudioSockets.size() * 2); if (nPlugins > 0) { if (verbose) { std::cout << "Initializing Faust plugins (have " << nPlugins << ") at sampling rate " << mSampleRate << "\n"; } - for (ProcessPlugin* plugin : std::as_const(mProcessPluginsFromNetwork)) { + for (auto& plugin : qAsConst(mProcessPluginsFromNetwork)) { plugin->setOutgoingToNetwork(false); plugin->updateNumChannels(nChansIn, nChansOut); plugin->init(mSampleRate, mBufferSizeInSamples); } - for (ProcessPlugin* plugin : std::as_const(mProcessPluginsToNetwork)) { + for (auto& plugin : qAsConst(mProcessPluginsToNetwork)) { plugin->setOutgoingToNetwork(true); plugin->updateNumChannels(nChansIn, nChansOut); plugin->init(mSampleRate, mBufferSizeInSamples); } - for (ProcessPlugin* plugin : std::as_const(mProcessPluginsToMonitor)) { + for (auto& plugin : qAsConst(mProcessPluginsToMonitor)) { plugin->setOutgoingToNetwork(false); plugin->updateNumChannels(nChansMon, nChansMon); plugin->init(mSampleRate, mBufferSizeInSamples); } + for (auto& s : qAsConst(mAudioSockets)) { + auto* plugin = s->getFromAudioSocketPlugin().get(); + plugin->setOutgoingToNetwork(true); + plugin->updateNumChannels(nChansIn, nChansOut); + plugin->init(mSampleRate, mBufferSizeInSamples); + plugin = s->getToAudioSocketPlugin().get(); + plugin->setOutgoingToNetwork(false); + plugin->updateNumChannels(nChansIn, nChansOut); + plugin->init(mSampleRate, mBufferSizeInSamples); + } } } diff --git a/src/AudioInterface.h b/src/AudioInterface.h index d752222..3de02af 100644 --- a/src/AudioInterface.h +++ b/src/AudioInterface.h @@ -38,17 +38,19 @@ #ifndef __AUDIOINTERFACE_H__ #define __AUDIOINTERFACE_H__ +#include #include #include #include #include "AudioTester.h" -#include "ProcessPlugin.h" #include "WaitFreeFrameBuffer.h" #include "jacktrip_types.h" // Forward declarations +class AudioSocket; class JackTrip; +class ProcessPlugin; // using namespace JackTripNamespace; @@ -190,7 +192,7 @@ class AudioInterface * using something like:\n * std::tr1::shared_ptr loopback(new ProcessPluginName); */ - virtual void appendProcessPluginToNetwork(ProcessPlugin* plugin); + virtual void appendProcessPluginToNetwork(QSharedPointer& plugin); /** \brief appendProcessPluginFromNetwork(): * Same as appendProcessPluginToNetwork() except that these plugins operate @@ -200,12 +202,17 @@ class AudioInterface * -> remote JackTrip server * -> JackTrip client -> processPlugin from network -> JACK -> audio */ - virtual void appendProcessPluginFromNetwork(ProcessPlugin* plugin); + virtual void appendProcessPluginFromNetwork(QSharedPointer& plugin); /** \brief appendProcessPluginToMonitor(): * Appends plugins used for local monitoring */ - virtual void appendProcessPluginToMonitor(ProcessPlugin* plugin); + virtual void appendProcessPluginToMonitor(QSharedPointer& plugin); + + /** \brief appendAudioSocket(): + * Appends audio socket connections + */ + virtual void appendAudioSocket(QSharedPointer& s); /** \brief initPlugins(): * Initialize all ProcessPlugin modules. @@ -337,12 +344,14 @@ class AudioInterface std::string mInputDeviceName, mOutputDeviceName; ///< RTAudio device names uint32_t mBufferSizeInSamples; ///< Buffer size in samples size_t mSizeInBytesPerChannel; ///< Size in bytes per audio channel - QVector + QVector > mProcessPluginsFromNetwork; ///< Vector of ProcessPlugins - QVector + QVector > mProcessPluginsToNetwork; ///< Vector of ProcessPlugins - QVector + QVector > mProcessPluginsToMonitor; ///< Vector of ProcessPlugins + QVector > + mAudioSockets; ///< Vector of AudioSockets QVarLengthArray mInProcessBuffer; ///< Vector of Input buffers/channel for ProcessPlugin QVarLengthArray diff --git a/src/AudioSocket.cpp b/src/AudioSocket.cpp new file mode 100644 index 0000000..298f74d --- /dev/null +++ b/src/AudioSocket.cpp @@ -0,0 +1,738 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file AudioSocket.cpp + * \author Mike Dickey + * \date December 2024 + * \license MIT + */ + +#include "AudioSocket.h" + +#include +#include + +#include "SocketClient.h" +#include "jacktrip_globals.h" + +using namespace std; + +constexpr int BytesPerSample = sizeof(float); +constexpr int BytesForFullSample = BytesPerSample * AudioSocketNumChannels; + +//******************************************************************************* +ToAudioSocketPlugin::ToAudioSocketPlugin(AudioSocketQueueT& sendQueue, + AudioSocketQueueT& receiveQueue) + : mSendQueue(sendQueue), mReceiveQueue(receiveQueue) +{ + mSendBuffer.resize(AudioSocketMaxSamplesPerBlock * BytesForFullSample + + BytesPerSample); +} + +//******************************************************************************* +ToAudioSocketPlugin::~ToAudioSocketPlugin() {} + +//******************************************************************************* +void ToAudioSocketPlugin::init(int samplingRate, int bufferSize) +{ + if (bufferSize < 8) { + cerr << "*** ToAudioSocketPlugin " << this << ": bufferSize (" << bufferSize + << ") < 8! Setting to 8." << endl; + bufferSize = 8; + } + ProcessPlugin::init(samplingRate, bufferSize); + inited = true; +} + +//******************************************************************************* +void ToAudioSocketPlugin::compute(int nframes, float** inputs, + [[maybe_unused]] float** outputs) +{ + if (!inited) { + cerr << "*** ToAudioSocketPlugin " << this << ": init never called! Doing it now." + << endl; + init(0, 0); + } + + if (!mIsConnected) { + return; + } + + if (!mSentAudioHeader) { + // send audio socket header + emit signalSendAudioHeader(getSampleRate(), getBufferSize()); + mSentAudioHeader = true; + return; + } + + if (!mRemoteIsReady) { + // waiting to receive audio header + return; + } + + if (nframes > AudioSocketMaxSamplesPerBlock) { + // just a sanity check; shouldn't happen + nframes = AudioSocketMaxSamplesPerBlock; + } + + // interleave samples into send buffer + float* framePtr = reinterpret_cast(mSendBuffer.data()); + *(framePtr++) = nframes; // first value represents number of samples + for (int nextSample = 0; nextSample < nframes; ++nextSample) { + for (int i = 0; i < AudioSocketNumChannels; i++) { + int chan = i < getNumInputs() ? i : 0; // mono => dual mono + *(framePtr++) = inputs[chan][nextSample]; + } + } + + // send the samples to queue + mSendQueue.push(reinterpret_cast(mSendBuffer.data())); + emit signalSendAudio(); + + // note: outputs are ignored +} + +//******************************************************************************* +void ToAudioSocketPlugin::updateNumChannels(int nChansIn, int nChansOut) +{ + if (outgoingPluginToNetwork) { + mNumChannels = nChansIn; + } else { + mNumChannels = nChansOut; + } +} + +//******************************************************************************* +void ToAudioSocketPlugin::remoteIsReady() +{ + mRemoteIsReady = true; +} + +//******************************************************************************* +void ToAudioSocketPlugin::gotConnection() +{ + mSentAudioHeader = false; + mRemoteIsReady = false; + mIsConnected = true; +} + +//******************************************************************************* +void ToAudioSocketPlugin::lostConnection() +{ + mIsConnected = false; +} + +//******************************************************************************* +FromAudioSocketPlugin::FromAudioSocketPlugin(AudioSocketQueueT& sendQueue, + AudioSocketQueueT& receiveQueue, + bool passthrough) + : mSendQueue(sendQueue), mReceiveQueue(receiveQueue), mPassthrough(passthrough) +{ + mRecvBuffer.resize(AudioSocketMaxSamplesPerBlock * BytesForFullSample + + BytesPerSample); + mExtraSamples = new float*[AudioSocketNumChannels]; + for (int i = 0; i < AudioSocketNumChannels; i++) { + mExtraSamples[i] = new float[AudioSocketMaxSamplesPerBlock]; + } +} + +//******************************************************************************* +FromAudioSocketPlugin::~FromAudioSocketPlugin() +{ + for (int i = 0; i < AudioSocketNumChannels; i++) { + delete[] mExtraSamples[i]; + } + delete[] mExtraSamples; +} + +//******************************************************************************* +void FromAudioSocketPlugin::init(int samplingRate, int bufferSize) +{ + if (bufferSize < 8) { + cerr << "*** FromAudioSocketPlugin " << this << ": bufferSize (" << bufferSize + << ") < 8! Setting to 8." << endl; + bufferSize = 8; + } + ProcessPlugin::init(samplingRate, bufferSize); + inited = true; +} + +//******************************************************************************* +void FromAudioSocketPlugin::compute(int nframes, [[maybe_unused]] float** inputs, + float** outputs) +{ + if (!inited) { + cerr << "*** FromAudioSocketPlugin " << this + << ": init never called! Doing it now." << endl; + init(0, 0); + } + + // copy inputs to outputs + const int bytesPerChannel = nframes * BytesPerSample; + for (int i = 0; i < getNumOutputs(); i++) { + if (mPassthrough) { + memcpy(outputs[i], inputs[i], bytesPerChannel); + } else { + memset(outputs[i], 0, bytesPerChannel); + } + } + + if (!mIsConnected) { + return; + } + + if (!mRemoteIsReady) { + // waiting to receive audio header + return; + } + + int nextSample = 0; + while (true) { + // use extra samples first + while (mNextExtraSample != mLastExtraSample && nextSample < nframes) { + for (int i = 0; i < AudioSocketNumChannels; i++) { + int chan = i < getNumOutputs() ? i : 0; // mix to mono + outputs[chan][nextSample] += mExtraSamples[i][mNextExtraSample]; + } + if (++mNextExtraSample >= AudioSocketMaxSamplesPerBlock) { + mNextExtraSample = 0; + } + ++nextSample; + } + + if (nextSample >= nframes) { + break; + } + + // get bytes from next packet + int8_t* recvPtr = reinterpret_cast(mRecvBuffer.data()); + if (!mReceiveQueue.pop(recvPtr)) { + // qDebug() << "Audio socket glitch: receive queue empty"; + break; + } + + // copy bytes from packet to extras + float* framePtr = reinterpret_cast(mRecvBuffer.data()); + int newSamples = static_cast(*(framePtr++)); + for (int j = 0; j < newSamples; j++) { + for (int i = 0; i < AudioSocketNumChannels; i++) { + mExtraSamples[i][mLastExtraSample] = *(framePtr++); + } + if (++mLastExtraSample >= AudioSocketMaxSamplesPerBlock) { + mLastExtraSample = 0; + } + } + } + + updateQueueStats(nframes); +} + +//******************************************************************************* +void FromAudioSocketPlugin::updateNumChannels(int nChansIn, int nChansOut) +{ + if (outgoingPluginToNetwork) { + mNumChannels = nChansIn; + } else { + mNumChannels = nChansOut; + } +} + +//******************************************************************************* +void FromAudioSocketPlugin::remoteIsReady() +{ + mNextExtraSample = 0; + mLastExtraSample = 0; + mQueueCheckSec = 2; + mRemoteIsReady = true; + resetQueueStats(); +} + +//******************************************************************************* +void FromAudioSocketPlugin::gotConnection() +{ + mRemoteIsReady = false; + mIsConnected = true; +} + +//******************************************************************************* +void FromAudioSocketPlugin::lostConnection() +{ + mIsConnected = false; +} + +//******************************************************************************* +void FromAudioSocketPlugin::updateQueueStats(int nframes) +{ + // update receive queue stats + int remainingPackets = static_cast(mReceiveQueue.size()); + if (remainingPackets < mMinQueuePackets) { + mMinQueuePackets = remainingPackets; + } + if (remainingPackets > mMaxQueuePackets) { + mMaxQueuePackets = remainingPackets; + } + if (mNextQueueCheck > static_cast(nframes)) { + mNextQueueCheck -= nframes; + return; + } + + // qDebug() << "Audio socket receive queue: min =" << mMinQueuePackets + // << ", max =" << mMaxQueuePackets; + + if (mMinQueuePackets > 0) { + // drain the queue to minimize latency + // qDebug() << "Audio socket draining" << mMinQueuePackets + // << "packets from receive queue"; + int8_t* recvPtr = reinterpret_cast(mRecvBuffer.data()); + do { + mReceiveQueue.pop(recvPtr); + } while (--mMinQueuePackets > 0); + } + + resetQueueStats(); +} + +//******************************************************************************* +void FromAudioSocketPlugin::resetQueueStats() +{ + mMinQueuePackets = AudioSocketMaxQueueSize; + mMaxQueuePackets = 0; + mNextQueueCheck = getSampleRate() * mQueueCheckSec; + if (mQueueCheckSec < 512) // max interval of about 8.5 minutes + mQueueCheckSec *= 2; +} + +//******************************************************************************* +AudioSocketWorker::AudioSocketWorker(AudioSocketQueueT& sendQueue, + AudioSocketQueueT& receiveQueue, + QSharedPointer& s) + : mSendQueue(sendQueue), mReceiveQueue(receiveQueue), mSocketPtr(s) +{ + mSendBuffer.resize(AudioSocketMaxSamplesPerBlock * BytesForFullSample + + BytesPerSample); + mRecvBuffer.resize(AudioSocketMaxSamplesPerBlock * BytesForFullSample + + BytesPerSample); + mPopBuffer.resize(AudioSocketMaxSamplesPerBlock * BytesForFullSample + + BytesPerSample); +} + +//******************************************************************************* +AudioSocketWorker::~AudioSocketWorker() +{ +#ifdef HAVE_LIBSAMPLERATE + if (mSrcStatePtr != nullptr) { + src_delete(mSrcStatePtr); + } + delete[] mSrcInDataPtr; +#endif +} + +//**************************************************************************** +void AudioSocketWorker::start() +{ + setRealtimeProcessPriority(); +} + +//**************************************************************************** +void AudioSocketWorker::connect() +{ + if (isConnected()) { + return; + } + + SocketClient c(mSocketPtr); + + if (!c.connect()) { + emit signalConnectionFailed(); + return; + } + + if (!c.sendHeader("audio")) { + mSocketPtr->close(); + emit signalConnectionFailed(); + return; + } + + cout << "Established audio socket connection" << endl; + emit signalConnectionEstablished(); +} + +//******************************************************************************* +void AudioSocketWorker::close() +{ + if (mSocketPtr->state() == QLocalSocket::UnconnectedState + || mSocketPtr->state() == QLocalSocket::ClosingState) { + return; + } + mSocketPtr->close(); + mSocketPtr->disconnect(); +} + +//******************************************************************************* +void AudioSocketWorker::sendAudioHeader(uint32_t sampleRate, uint16_t bufferSize) +{ + mLocalSampleRate = sampleRate; + + // send audio socket header + QByteArray headerBuffer; + headerBuffer.resize(AudioSocketHeaderSize); + char* headPtr = headerBuffer.data(); + memcpy(headPtr, &sampleRate, sizeof(uint32_t)); + headPtr += 4; + memcpy(headPtr, &bufferSize, sizeof(uint16_t)); + mSocketPtr->write(headerBuffer); + mSocketPtr->waitForBytesWritten(-1); + + // read audio header from remote to get settings + emit signalReadAudioHeader(); +} + +//******************************************************************************* +void AudioSocketWorker::readAudioHeader() +{ + if (!mSocketPtr->waitForReadyRead(100)) { + // check if connection was lost + if (isConnected()) { + // schedule another attempt + emit signalReadAudioHeader(); + } else { + // lost audio socket connection + cout << "Lost audio socket connection" << endl; + mSocketPtr->disconnect(); + emit signalLostConnection(); + } + return; + } + + uint32_t headSampleRate; + uint16_t headBufferSize; + QByteArray headerBuffer; + headerBuffer.resize(AudioSocketHeaderSize); + memset(headerBuffer.data(), 0, AudioSocketHeaderSize); + mSocketPtr->read(headerBuffer.data(), AudioSocketHeaderSize); + char* headPtr = headerBuffer.data(); + memcpy(&headSampleRate, headPtr, sizeof(uint32_t)); + headPtr += 4; + memcpy(&headBufferSize, headPtr, sizeof(uint16_t)); + + // sanity checks (should never happen) + if (headSampleRate != 44100 && headSampleRate != 48000 && headSampleRate != 96000) { + cerr << "Audio socket received invalid sample rate = " << headSampleRate << endl; + mSocketPtr->close(); + return; + } + if (headBufferSize < 2) { + cerr << "Audio socket received invalid buffer size = " << headBufferSize << endl; + mSocketPtr->close(); + return; + } + + cout << "Received audio socket header: sample rate = " << headSampleRate + << ", buffer size = " << headBufferSize << endl; + + mRemoteSampleRate = headSampleRate; + +#ifdef HAVE_LIBSAMPLERATE + if (mRemoteSampleRate != mLocalSampleRate) { + if (mSrcStatePtr == nullptr) { + int srcErr; + mSrcStatePtr = src_new(SRC_SINC_BEST_QUALITY, 2, &srcErr); + if (mSrcStatePtr == nullptr) { + cerr << "Failed to prepare sample rate converter: " + << src_strerror(srcErr) << endl; + mSocketPtr->close(); + return; + } + if (mSrcInDataPtr == nullptr) { + mSrcInDataPtr = + new float[AudioSocketMaxSamplesPerBlock * BytesForFullSample]; + } + mSrcData.data_in = mSrcInDataPtr; + mSrcData.data_out = + reinterpret_cast(mRecvBuffer.data() + BytesPerSample); + mSrcData.output_frames = AudioSocketMaxSamplesPerBlock; + } else { + src_reset(mSrcStatePtr); + } + mSrcData.src_ratio = static_cast(mLocalSampleRate) / mRemoteSampleRate; + mSrcData.end_of_input = 0; + mSrcInSamples = 0; + } +#else + if (mRemoteSampleRate != mLocalSampleRate) { + cerr << "Audio socket sample rate conversion not supported: " << mRemoteSampleRate + << " != " << mLocalSampleRate << endl; + mSocketPtr->close(); + return; + } +#endif + + QObject::connect(mSocketPtr.data(), &QLocalSocket::readyRead, this, + &AudioSocketWorker::receiveAudio, Qt::QueuedConnection); + emit signalRemoteIsReady(); +} + +//******************************************************************************* +void AudioSocketWorker::sendAudio() +{ + if (!mSocketPtr->isValid() || mSocketPtr->state() != QLocalSocket::ConnectedState) { + // lost audio socket connection + cout << "Lost audio socket connection" << endl; + mSocketPtr->disconnect(); + emit signalLostConnection(); + return; + } + + if (mSendQueue.empty()) { + return; + } + + // send local audio packets to remote + int8_t* popPtr = reinterpret_cast(mPopBuffer.data()); + while (mSendQueue.pop(popPtr)) { + float* framePtr = reinterpret_cast(mPopBuffer.data()); + int bytesToSend = *(framePtr++) * BytesForFullSample; + mSendBuffer.resize(bytesToSend); + memcpy(mSendBuffer.data(), framePtr, bytesToSend); + mSocketPtr->write(mSendBuffer); + } + mSocketPtr->waitForBytesWritten(-1); +} + +//******************************************************************************* +void AudioSocketWorker::receiveAudio() +{ + while (mSocketPtr->bytesAvailable() > BytesForFullSample) { + qint64 bytesToRead = mSocketPtr->bytesAvailable(); + if (bytesToRead + BytesPerSample > mRecvBuffer.size()) + bytesToRead = mRecvBuffer.size() - BytesPerSample; + if (bytesToRead % BytesForFullSample > 0) + bytesToRead -= (bytesToRead % BytesForFullSample); + int newSamples = bytesToRead / BytesForFullSample; + +#ifdef HAVE_LIBSAMPLERATE + if (mRemoteSampleRate == mLocalSampleRate) { + mSocketPtr->read(mRecvBuffer.data() + BytesPerSample, bytesToRead); + } else { + // convert remote to local sample rate + mSrcData.input_frames = newSamples + mSrcInSamples; + mSocketPtr->read(reinterpret_cast(mSrcInDataPtr) + + (mSrcInSamples * BytesForFullSample), + bytesToRead); + int srcErr = src_process(mSrcStatePtr, &mSrcData); + if (srcErr != 0) { + cerr << "Sample rate conversion failure: " << src_strerror(srcErr) + << endl; + mSocketPtr->close(); + return; + } + mSrcInSamples = mSrcData.input_frames - mSrcData.input_frames_used; + if (mSrcInSamples > 0) { + // save remaining input frames for later + if (mSrcData.input_frames_used > 0) { + // shift samples in memory buffer + char* nextFramePtr = + reinterpret_cast(mSrcInDataPtr) + + (mSrcData.input_frames_used * BytesForFullSample); + memmove(mSrcInDataPtr, nextFramePtr, + mSrcInSamples * BytesForFullSample); + } + } + newSamples = mSrcData.output_frames_gen; + } +#else + mSocketPtr->read(mRecvBuffer.data() + BytesPerSample, bytesToRead); +#endif + + if (newSamples > 0) { + // first value represents number of samples + float* framePtr = reinterpret_cast(mRecvBuffer.data()); + *framePtr = newSamples; + mReceiveQueue.push(reinterpret_cast(mRecvBuffer.data())); + } + } +} + +//******************************************************************************* +void AudioSocketWorker::scheduleReconnect() +{ + if (mRetryConnection) { + qDebug() << "Attempting to reconnect audio socket"; + if (mTimerPtr.isNull()) { + mTimerPtr.reset(new QTimer); + QObject::connect(mTimerPtr.data(), &QTimer::timeout, this, + &AudioSocketWorker::connect); + } + mTimerPtr->start(1000); // try reconnecting in 1 second + } +} + +//******************************************************************************* +AudioSocket::AudioSocket(bool retryConnection) + : mThread() + , mSendQueue(AudioSocketMaxSamplesPerBlock * BytesForFullSample + BytesPerSample) + , mReceiveQueue(AudioSocketMaxSamplesPerBlock * BytesForFullSample + BytesPerSample) + , mToAudioSocketPluginPtr(new ToAudioSocketPlugin(mSendQueue, mReceiveQueue)) + , mFromAudioSocketPluginPtr(new FromAudioSocketPlugin(mSendQueue, mReceiveQueue)) +{ + mThread.setObjectName("AudioSocket"); + mThread.start(); + + QSharedPointer s(new QLocalSocket); + s->moveToThread(&mThread); + + mWorkerPtr.reset(new AudioSocketWorker(mSendQueue, mReceiveQueue, s)); + mWorkerPtr->moveToThread(&mThread); + mWorkerPtr->setRetryConnection(retryConnection); + + initWorker(); +} + +//******************************************************************************* +AudioSocket::AudioSocket(QSharedPointer& s) + : mThread() + , mSendQueue(AudioSocketMaxSamplesPerBlock * BytesForFullSample + BytesPerSample) + , mReceiveQueue(AudioSocketMaxSamplesPerBlock * BytesForFullSample + BytesPerSample) + , mToAudioSocketPluginPtr(new ToAudioSocketPlugin(mSendQueue, mReceiveQueue)) + , mFromAudioSocketPluginPtr(new FromAudioSocketPlugin(mSendQueue, mReceiveQueue)) + , mWorkerPtr(new AudioSocketWorker(mSendQueue, mReceiveQueue, s)) +{ + mThread.setObjectName("AudioSocket"); + mThread.start(); + + s->moveToThread(&mThread); + mWorkerPtr->moveToThread(&mThread); + + initWorker(); +} + +//******************************************************************************* +void AudioSocket::initWorker() +{ + auto* toPluginPtr = static_cast(mToAudioSocketPluginPtr.get()); + auto* fromPluginPtr = + static_cast(mFromAudioSocketPluginPtr.get()); + + QObject::connect(this, &AudioSocket::signalConnect, mWorkerPtr.data(), + &AudioSocketWorker::connect, Qt::QueuedConnection); + QObject::connect(this, &AudioSocket::signalClose, mWorkerPtr.data(), + &AudioSocketWorker::close, Qt::QueuedConnection); + QObject::connect(this, &AudioSocket::signalStartWorker, mWorkerPtr.data(), + &AudioSocketWorker::start, Qt::QueuedConnection); + QObject::connect(toPluginPtr, &ToAudioSocketPlugin::signalSendAudioHeader, + mWorkerPtr.data(), &AudioSocketWorker::sendAudioHeader, + Qt::QueuedConnection); + QObject::connect(toPluginPtr, &ToAudioSocketPlugin::signalSendAudio, + mWorkerPtr.data(), &AudioSocketWorker::sendAudio, + Qt::QueuedConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalRemoteIsReady, + toPluginPtr, &ToAudioSocketPlugin::remoteIsReady, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalRemoteIsReady, + fromPluginPtr, &FromAudioSocketPlugin::remoteIsReady, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalConnectionEstablished, + toPluginPtr, &ToAudioSocketPlugin::gotConnection, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalConnectionEstablished, + fromPluginPtr, &FromAudioSocketPlugin::gotConnection, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalLostConnection, + toPluginPtr, &ToAudioSocketPlugin::lostConnection, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalLostConnection, + fromPluginPtr, &FromAudioSocketPlugin::lostConnection, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalLostConnection, + mWorkerPtr.data(), &AudioSocketWorker::scheduleReconnect, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalConnectionFailed, + mWorkerPtr.data(), &AudioSocketWorker::scheduleReconnect, + Qt::DirectConnection); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalReadAudioHeader, + mWorkerPtr.data(), &AudioSocketWorker::readAudioHeader, + Qt::QueuedConnection); + + if (isConnected()) { + toPluginPtr->gotConnection(); + fromPluginPtr->gotConnection(); + } + + emit signalStartWorker(); +} + +//******************************************************************************* +AudioSocket::~AudioSocket() +{ + mThread.quit(); + mThread.wait(); + mWorkerPtr.reset(); +} + +//******************************************************************************* +bool AudioSocket::connect(int samplingRate, int bufferSize) +{ + if (mWorkerPtr->isConnected()) { + return true; + } + + mFromAudioSocketPluginPtr->init(samplingRate, bufferSize); + mToAudioSocketPluginPtr->init(samplingRate, bufferSize); + emit signalConnect(); + + QTimer timer; + timer.setTimerType(Qt::CoarseTimer); + timer.setSingleShot(true); + + QEventLoop loop; + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalConnectionEstablished, + &loop, &QEventLoop::quit); + QObject::connect(mWorkerPtr.data(), &AudioSocketWorker::signalConnectionFailed, &loop, + &QEventLoop::quit); + QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + timer.start(1000); + loop.exec(); + + return mWorkerPtr->isConnected(); +} + +//******************************************************************************* +void AudioSocket::compute(int nframes, float** inputs, float** outputs) +{ + mToAudioSocketPluginPtr->compute(nframes, inputs, outputs); + mFromAudioSocketPluginPtr->compute(nframes, inputs, outputs); +} + +//******************************************************************************* +void AudioSocket::close() +{ + emit signalClose(); +} diff --git a/src/AudioSocket.h b/src/AudioSocket.h new file mode 100644 index 0000000..3d1be40 --- /dev/null +++ b/src/AudioSocket.h @@ -0,0 +1,280 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file AudioSocket.h + * \author Mike Dickey + * \date December 2024 + * \license MIT + */ + +#ifndef __AUDIOSOCKET_H__ +#define __AUDIOSOCKET_H__ + +#include +#include +#include +#include +#include +#include + +#include "ProcessPlugin.h" +#include "WaitFreeFrameBuffer.h" + +#ifdef HAVE_LIBSAMPLERATE +#include "samplerate.h" +#endif + +// assume stereo audio for this implementation +constexpr int AudioSocketNumChannels = 2; + +// assume max buffer size of 8192 samples +constexpr int AudioSocketMaxSamplesPerBlock = 8192; + +// allow up to 1024 frames +constexpr int AudioSocketMaxQueueSize = 1024; + +// audio header is 4 bytes for the number of samples + 2 bytes for the buffer size +constexpr int AudioSocketHeaderSize = 4 + 2; + +// data type for audio socket circular buffer +typedef WaitFreeFrameBuffer AudioSocketQueueT; + +/** \brief ToAudioSocketPlugin is used to send audio from a signal chain to an audio + * socket + */ +class ToAudioSocketPlugin : public ProcessPlugin +{ + Q_OBJECT; + + public: + ToAudioSocketPlugin(AudioSocketQueueT& sendQueue, AudioSocketQueueT& receiveQueue); + virtual ~ToAudioSocketPlugin(); + + void init(int samplingRate, int bufferSize) override; + int getNumInputs() override { return (mNumChannels); } + int getNumOutputs() override { return (mNumChannels); } + void compute(int nframes, float** inputs, float** outputs) override; + const char* getName() const override { return "ToAudioSocket"; }; + void updateNumChannels(int nChansIn, int nChansOut) override; + + signals: + void signalSendAudioHeader(uint32_t sampleRate, uint16_t bufferSize); + void signalSendAudio(); + + public slots: + void remoteIsReady(); + void gotConnection(); + void lostConnection(); + + private: + AudioSocketQueueT& mSendQueue; + AudioSocketQueueT& mReceiveQueue; + QByteArray mSendBuffer; + int mNumChannels = AudioSocketNumChannels; + bool mSentAudioHeader = false; + bool mRemoteIsReady = false; + bool mIsConnected = false; +}; + +/** \brief FromAudioSocketPlugin is used mix audio from an audio socket into a signal + * chain + */ +class FromAudioSocketPlugin : public ProcessPlugin +{ + Q_OBJECT; + + public: + FromAudioSocketPlugin(AudioSocketQueueT& sendQueue, AudioSocketQueueT& receiveQueue, + bool passthrough = false); + virtual ~FromAudioSocketPlugin(); + + void init(int samplingRate, int bufferSize) override; + int getNumInputs() override { return (mNumChannels); } + int getNumOutputs() override { return (mNumChannels); } + void compute(int nframes, float** inputs, float** outputs) override; + const char* getName() const override { return "FromAudioSocket"; }; + void updateNumChannels(int nChansIn, int nChansOut) override; + void setPassthrough(bool b) { mPassthrough = b; } + + public slots: + void remoteIsReady(); + void gotConnection(); + void lostConnection(); + + protected: + void updateQueueStats(int nframes); + void resetQueueStats(); + + private: + AudioSocketQueueT& mSendQueue; + AudioSocketQueueT& mReceiveQueue; + QByteArray mRecvBuffer; + float** mExtraSamples = nullptr; + int mNumChannels = AudioSocketNumChannels; + int mNextExtraSample = 0; + int mLastExtraSample = 0; + int mMinQueuePackets = 0; + int mMaxQueuePackets = 0; + int mQueueCheckSec = 0; + uint32_t mNextQueueCheck = 0; + bool mRemoteIsReady = false; + bool mIsConnected = false; + bool mPassthrough = false; +}; + +/** \brief AudioSocketWorker is used to perform socket operations in a separate thread + */ +class AudioSocketWorker : public QObject +{ + Q_OBJECT; + + public: + AudioSocketWorker(AudioSocketQueueT& sendQueue, AudioSocketQueueT& receiveQueue, + QSharedPointer& s); + virtual ~AudioSocketWorker(); + + inline void setRetryConnection(bool retry) { mRetryConnection = retry; } + inline bool isConnected() + { + return mSocketPtr->state() == QLocalSocket::ConnectedState; + } + inline QLocalSocket& getSocket() { return *mSocketPtr; } + + signals: + void signalReadAudioHeader(); + void signalConnectionEstablished(); + void signalConnectionFailed(); + void signalLostConnection(); + void signalRemoteIsReady(); + + public slots: + // sets a few things up at startup + void start(); + + // attempts to connect to remote instance's socket server + // returns true if connection was successfully established + // returns false and schedules retry if connection failed + void connect(); + + /// \brief closes the connection to remote instance's socket server + void close(); + + /// \brief send audio header to remote instance + void sendAudioHeader(uint32_t sampleRate, uint16_t bufferSize); + + /// \brief read audio header from remote instance + void readAudioHeader(); + + /// \brief sends audio packets to remote instance + void sendAudio(); + + /// \brief receives audio bytes from remote instance + void receiveAudio(); + + /// \brief schedules a reconnect attempt + void scheduleReconnect(); + + private: + AudioSocketQueueT& mSendQueue; + AudioSocketQueueT& mReceiveQueue; + QScopedPointer mTimerPtr; + QSharedPointer mSocketPtr; + QByteArray mSendBuffer; + QByteArray mRecvBuffer; + QByteArray mPopBuffer; + bool mRetryConnection = false; + int mLocalSampleRate = 0; + int mRemoteSampleRate = 0; +#ifdef HAVE_LIBSAMPLERATE + SRC_DATA mSrcData; + SRC_STATE* mSrcStatePtr = nullptr; + float* mSrcInDataPtr = nullptr; + int mSrcInSamples = 0; +#endif +}; + +/** \brief An AudioSocket is used to exchange audio with another processes via a local + * socket + */ +class AudioSocket : public QObject +{ + Q_OBJECT; + + public: + AudioSocket(bool retryConnection = false); + AudioSocket(QSharedPointer& s); + virtual ~AudioSocket(); + + inline bool isConnected() { return mWorkerPtr->isConnected(); } + inline QLocalSocket& getSocket() { return mWorkerPtr->getSocket(); } + inline int getSampleRate() const { return mToAudioSocketPluginPtr->getSampleRate(); } + inline int getBufferSize() const { return mToAudioSocketPluginPtr->getBufferSize(); } + inline QSharedPointer& getToAudioSocketPlugin() + { + return mToAudioSocketPluginPtr; + } + inline QSharedPointer& getFromAudioSocketPlugin() + { + return mFromAudioSocketPluginPtr; + } + inline void setRetryConnection(bool retry) { mWorkerPtr->setRetryConnection(retry); } + + // attempts to connect to remote instance's socket server + // returns true if connection was successfully established + // returns false and schedules retry if connection failed + bool connect(int samplingRate, int bufferSize); + + /// \brief audio callback for duplex processing + void compute(int nframes, float** inputs, float** outputs); + + /// \brief closes the connection to remote instance's socket server + void close(); + + signals: + void signalStartWorker(); + void signalConnect(); + void signalClose(); + + private: + /// \brief initializes worker and worker thread + void initWorker(); + + QThread mThread; + AudioSocketQueueT mSendQueue; + AudioSocketQueueT mReceiveQueue; + QSharedPointer mToAudioSocketPluginPtr; + QSharedPointer mFromAudioSocketPluginPtr; + QScopedPointer mWorkerPtr; + + friend class AudioSocketWorker; +}; + +#endif \ No newline at end of file diff --git a/src/Compressor.cpp b/src/Compressor.cpp index 04311fe..a58bbd7 100644 --- a/src/Compressor.cpp +++ b/src/Compressor.cpp @@ -95,7 +95,7 @@ void Compressor::setParamAllChannels(const char pName[], float p) void Compressor::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(compressorP[i]) ->init(fs); // compression filter parameters depend on sampling rate diff --git a/src/JackTrip.cpp b/src/JackTrip.cpp index ad5bd5b..2813da1 100644 --- a/src/JackTrip.cpp +++ b/src/JackTrip.cpp @@ -460,27 +460,27 @@ void JackTrip::setPeerAddress(const QString& PeerHostOrIP) } //******************************************************************************* -void JackTrip::appendProcessPluginToNetwork(ProcessPlugin* plugin) +void JackTrip::appendProcessPluginToNetwork(QSharedPointer& plugin) { - if (plugin) { + if (!plugin.isNull()) { mProcessPluginsToNetwork.append(plugin); // ownership transferred // mAudioInterface->appendProcessPluginToNetwork(plugin); } } //******************************************************************************* -void JackTrip::appendProcessPluginFromNetwork(ProcessPlugin* plugin) +void JackTrip::appendProcessPluginFromNetwork(QSharedPointer& plugin) { - if (plugin) { + if (!plugin.isNull()) { mProcessPluginsFromNetwork.append(plugin); // ownership transferred // mAudioInterface->appendProcessPluginFromNetwork(plugin); } } //******************************************************************************* -void JackTrip::appendProcessPluginToMonitor(ProcessPlugin* plugin) +void JackTrip::appendProcessPluginToMonitor(QSharedPointer& plugin) { - if (plugin) { + if (!plugin.isNull()) { mProcessPluginsToMonitor.append(plugin); // ownership transferred // mAudioInterface->appendProcessPluginFromNetwork(plugin); } @@ -769,7 +769,9 @@ void JackTrip::onStatTimer() // pkt_stat.lost << "/" // << pkt_stat.outOfOrder << "/" << pkt_stat.revived << " \n tot: " << pkt_stat.tot << " \t tol: " << setw(5) - << INVFLOATFACTOR * recv_io_stat.autoq_corr << " \t dsp (max): " << setw(5) + << INVFLOATFACTOR * recv_io_stat.autoq_corr + << " \t latency (max): " << setw(5) << std::setprecision(3) + << mReceiveRingBuffer->getLatency() << " \t dsp (max): " << setw(5) << INVFLOATFACTOR * recv_io_stat.autoq_rate // << " sync: " << recv_io_stat.level << "/" // << recv_io_stat.buf_inc_underrun << "/" diff --git a/src/JackTrip.h b/src/JackTrip.h index 166106b..00b9cce 100644 --- a/src/JackTrip.h +++ b/src/JackTrip.h @@ -173,9 +173,9 @@ class JackTrip : public QObject * \param plugin Pointer to ProcessPlugin Class */ // void appendProcessPlugin(const std::tr1::shared_ptr plugin); - virtual void appendProcessPluginToNetwork(ProcessPlugin* plugin); - virtual void appendProcessPluginFromNetwork(ProcessPlugin* plugin); - virtual void appendProcessPluginToMonitor(ProcessPlugin* plugin); + virtual void appendProcessPluginToNetwork(QSharedPointer& plugin); + virtual void appendProcessPluginFromNetwork(QSharedPointer& plugin); + virtual void appendProcessPluginToMonitor(QSharedPointer& plugin); /// \brief Start the processing threads virtual void startProcess( @@ -219,9 +219,18 @@ class JackTrip : public QObject createHeader(mPacketHeaderType); } /// \brief Sets (override) Buffer Queue Length Mode after construction - virtual void setBufferQueueLength(int BufferQueueLength) + virtual void setBufferQueueLength(int queueBuffer) { - mBufferQueueLength = BufferQueueLength; + if (mBufferQueueLength == queueBuffer) { + return; + } + mBufferQueueLength = queueBuffer; + if (mReceiveRingBuffer != nullptr + && (mBufferStrategy == 3 || mBufferStrategy == 4)) { + // mReceiveRingBuffer should be an instance of Regulator when mBufferStrategy + // is 3 or 4 + mReceiveRingBuffer->setQueueBufferLength(mBufferQueueLength); + } } virtual void setBufferStrategy(int BufferStrategy) { @@ -542,6 +551,10 @@ class JackTrip : public QObject return (mAudioInterface == nullptr) ? false : mAudioInterface->getHighLatencyFlag(); } + double getLatency() const + { + return mReceiveRingBuffer == nullptr ? -1 : mReceiveRingBuffer->getLatency(); + } //@} //------------------------------------------------------------------------------------ @@ -705,11 +718,11 @@ class JackTrip : public QObject JackTrip::hubConnectionModeT mHubConnectionModeT; ///< Hub Server Jack Audio Patch Connection Mode - QVector + QVector > mProcessPluginsFromNetwork; ///< Vector of ProcessPlugins - QVector + QVector > mProcessPluginsToNetwork; ///< Vector of ProcessPlugins - QVector + QVector > mProcessPluginsToMonitor; ///< Vector of ProcessPlugins QTimer mTimeoutTimer; QTimer mRetryTimer; diff --git a/src/JackTripWorker.h b/src/JackTripWorker.h index dc31a15..091f983 100644 --- a/src/JackTripWorker.h +++ b/src/JackTripWorker.h @@ -112,6 +112,15 @@ class JackTripWorker : public QObject } void setBroadcast(int broadcast_queue) { mBroadcastQueue = broadcast_queue; } void setUseRtUdpPriority(bool use) { mUseRtUdpPriority = use; } + void setBufferQueueLength(int queueBufferLength) + { + QMutexLocker lock(&mMutex); + if (mJackTrip.isNull() || mBufferQueueLength == queueBufferLength) { + return; + } + mBufferQueueLength = queueBufferLength; + mJackTrip->setBufferQueueLength(mBufferQueueLength); + } void setIOStatTimeout(int timeout) { mIOStatTimeout = timeout; } void setIOStatStream(QSharedPointer statStream) diff --git a/src/JitterBuffer.h b/src/JitterBuffer.h index a4ca931..e94ecc7 100644 --- a/src/JitterBuffer.h +++ b/src/JitterBuffer.h @@ -55,6 +55,9 @@ class JitterBuffer : public RingBuffer virtual bool getStats(IOStat* stat, bool reset); + /// @brief returns max latency during previous interval, in milliseconds + virtual double getLatency() const { return mMaxLatency; } + void setJackTrip(JackTrip* jackTrip) { mJackTrip = jackTrip; } protected: diff --git a/src/Limiter.cpp b/src/Limiter.cpp index 8796075..d803264 100644 --- a/src/Limiter.cpp +++ b/src/Limiter.cpp @@ -85,7 +85,7 @@ Limiter::~Limiter() void Limiter::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(limiterP[i]) ->init(fs); // compression filter parameters depend on sampling rate diff --git a/src/Meter.cpp b/src/Meter.cpp index a641e8b..f77336b 100644 --- a/src/Meter.cpp +++ b/src/Meter.cpp @@ -76,7 +76,7 @@ void Meter::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(meterP[i])->init(fs); } diff --git a/src/Monitor.cpp b/src/Monitor.cpp index 2f9a7d2..4ebf0d1 100644 --- a/src/Monitor.cpp +++ b/src/Monitor.cpp @@ -70,7 +70,7 @@ Monitor::~Monitor() void Monitor::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(monitorP[i]) diff --git a/src/OscServer.cpp b/src/OscServer.cpp new file mode 100644 index 0000000..5c3b61b --- /dev/null +++ b/src/OscServer.cpp @@ -0,0 +1,143 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file OscServer.cpp + * \author Nelson Wang + * \date November 2024 + */ + +#include "OscServer.h" + +#include + +using std::cout; +using std::endl; + +//******************************************************************************* +OscServer::OscServer(quint16 port, QObject* parent) : QObject(parent), mPort(port) {} + +//******************************************************************************* +OscServer::~OscServer() +{ + stop(); +} + +//******************************************************************************* +void OscServer::stop() +{ + closeSocket(); +} + +//******************************************************************************* +void OscServer::closeSocket() +{ + if (!mOscServerSocket.isNull()) { + mOscServerSocket->close(); + mOscServerSocket.reset(); + } +} + +//******************************************************************************* +void OscServer::start() +{ + mOscServerSocket.reset(new QUdpSocket(this)); + qDebug() << "Binding OSC server socket to UDP port " << mPort; + if (!mOscServerSocket->bind(QHostAddress::LocalHost, mPort)) { + qDebug() << "Error binding OSC server socket"; + return; + } + + connect(mOscServerSocket.get(), &QUdpSocket::readyRead, this, + &OscServer::readPendingDatagrams); + qDebug() << "OSC server started on UDP port " << mPort; +} + +//******************************************************************************* +void OscServer::readPendingDatagrams() +{ + while (mOscServerSocket->hasPendingDatagrams()) { + QByteArray datagram; + datagram.resize(mOscServerSocket->pendingDatagramSize()); + QHostAddress sender; + quint16 senderPort; + + mOscServerSocket->readDatagram(datagram.data(), datagram.size(), &sender, + &senderPort); + qDebug() << "Received datagram from" << sender << ":" << senderPort; + qDebug() << " - Data:" << datagram; +#ifndef NO_OSCPP + handlePacket(OSCPP::Server::Packet(datagram.data(), datagram.size())); +#endif // NO_OSCPP + // Send a reply back to the client + // QByteArray replyData("Reply from server"); + // socket->writeDatagram(replyData, sender, senderPort); + } +} + +//******************************************************************************* +#ifndef NO_OSCPP +void OscServer::handlePacket(const OSCPP::Server::Packet& packet) +{ + try { + if (packet.isBundle()) { + // Convert to bundle + OSCPP::Server::Bundle bundle(packet); + // Get packet stream + OSCPP::Server::PacketStream packets(bundle.packets()); + + // Iterate over all the packets and call handlePacket recursively. + while (!packets.atEnd()) { + handlePacket(packets.next()); + } + } else { + // Convert to message + OSCPP::Server::Message msg(packet); + // Get argument stream + OSCPP::Server::ArgStream args(msg.args()); + + if (msg == "/config") { + const char* key = args.string(); + const float value = args.float32(); + cout << "Config received - key (" << key << ") value (" << value << ")" + << endl; + if (strcmp("queueBuffer", key) == 0) { + emit signalQueueBufferChanged(static_cast(value)); + } + } else { + // Simply print unknown messages + cout << "Unknown message:" << msg.address() << endl; + } + } + } catch (std::exception& e) { + cout << "Exception:" << e.what() << endl; + } +} +#endif // NO_OSCPP diff --git a/src/OscServer.h b/src/OscServer.h new file mode 100644 index 0000000..5b2b55c --- /dev/null +++ b/src/OscServer.h @@ -0,0 +1,100 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file OscServer.h + * \author Nelson Wang + * \date November 2024 + */ + +#ifndef __OSCSERVER_H__ +#define __OSCSERVER_H__ + +#include +#include +#include + +#ifndef NO_OSCPP +#include "oscpp/client.hpp" +#include "oscpp/server.hpp" +#endif // NO_OSCPP + +class OscServer : public QObject +{ + Q_OBJECT; + + public: + OscServer(quint16 port, QObject* parent = nullptr); + + /// \brief The class destructor + virtual ~OscServer(); + void start(); + void stop(); + + static size_t makeConfigPacket(void* buffer, size_t size, const char* key, + float value) + { +#ifndef NO_OSCPP + // Construct a packet + OSCPP::Client::Packet packet(buffer, size); + packet + // Open a bundle with a timetag + .openBundle(1234ULL) + // Add a message with two arguments + // for efficiency this needs to be known in advance. + .openMessage("/config", 2) + // Write the arguments + .string(key) + .float32(value) + // Every `open` needs a corresponding `close` + .closeMessage() + .closeBundle(); + return packet.size(); +#else + return 0; +#endif // NO_OSCPP + } + signals: + void signalQueueBufferChanged(int queueBufferSize); + + private slots: + void readPendingDatagrams(); + + private: + void closeSocket(); +#ifndef NO_OSCPP + void handlePacket(const OSCPP::Server::Packet& packet); +#endif // NO_OSCPP + + QSharedPointer mOscServerSocket; + quint16 mPort; +}; + +#endif diff --git a/src/ProcessPlugin.h b/src/ProcessPlugin.h index e4af0ed..f8fb64a 100644 --- a/src/ProcessPlugin.h +++ b/src/ProcessPlugin.h @@ -39,7 +39,6 @@ #define __PROCESSPLUGIN_H__ #include -#include /** \brief Interface for the process plugins to add to the JACK callback process in * JackAudioInterface @@ -56,14 +55,22 @@ class ProcessPlugin : public QObject public: /// \brief The Class Constructor ProcessPlugin(){}; + /// \brief The Class Destructor virtual ~ProcessPlugin(){}; /// \brief Return Number of Input Channels virtual int getNumInputs() = 0; + /// \brief Return Number of Output Channels virtual int getNumOutputs() = 0; + /// \brief Return local audio sample rate + int getSampleRate() const { return mSampleRate; } + + /// \brief Return local audio buffer size + int getBufferSize() const { return mBufferSize; } + // virtual void buildUserInterface(UI* interface) = 0; virtual const char* getName() const = 0; // get name of DERIVED class @@ -83,8 +90,8 @@ class ProcessPlugin : public QObject bufferSize = 128; printf("%s: *** HAD TO GUESS the buffer size (chose 128) ***\n", getName()); } - fSamplingFreq = samplingRate; - mBufferSize = bufferSize; + mSampleRate = samplingRate; + mBufferSize = bufferSize; if (verbose) { printf("%s: init(%d, %d)\n", getName(), samplingRate, bufferSize); } @@ -109,8 +116,8 @@ class ProcessPlugin : public QObject virtual void updateNumChannels(int /*nChansIn*/, int /*nChansOut*/) { return; }; protected: - int fSamplingFreq; //< Faust Data member, Sampling Rate - int mBufferSize; //< expected number of samples per compute callbacks + int mSampleRate; //< local audio sampling rate + int mBufferSize; //< expected number of samples per compute callbacks bool inited = false; bool verbose = false; bool outgoingPluginToNetwork = false; //< Tells the plugin if it processes audio diff --git a/src/Regulator.cpp b/src/Regulator.cpp index cbf06d7..faffb2c 100644 --- a/src/Regulator.cpp +++ b/src/Regulator.cpp @@ -104,7 +104,7 @@ constexpr double AutoInitValFactor = // tweak constexpr int WindowDivisor = 8; // for faster auto tracking constexpr double AutoHeadroomGlitchTolerance = - 0.01; // Acceptable rate of skips before auto headroom is increased (1.0%) + 0.01; // Acceptable rate of glitches before auto headroom is increased (1.0%) constexpr double AutoHistoryWindow = 60; // rolling window of time (in seconds) over which auto tolerance roughly adjusts constexpr double AutoSmoothingFactor = @@ -372,6 +372,9 @@ void Regulator::setFPPratio(int len) ////////////////////////////////////// if (mPeerFPP != mLocalFPP) { + // adjust broadcast queue length so that time duration matches across all clients + if (m_b_BroadcastQueueLength) + m_b_BroadcastQueueLength = (m_b_BroadcastQueueLength * mLocalFPP) / mPeerFPP; if (mPeerFPP > mLocalFPP) mFPPratioDenominator = mPeerFPP / mLocalFPP; else @@ -479,29 +482,30 @@ void Regulator::updateTolerance(int glitches, int skipped) // only increase headroom if doing so would have reduced the number of // glitches that occured over the past second by 1% or more. // prevent headroom from growing beyond rolling average of max. - int skipsAllowed; + const int maxHeadroom = pushStat->longTermMax + 1; + int glitchesAllowed; if (mMsecTolerance >= (mPeerFPPdurMsec * 2)) { - // calculate skips allowed if tolerance if above or equal to duration of two - // packets - skipsAllowed = + // calculate glitches allowed if tolerance if above or equal to duration of + // two packets + glitchesAllowed = static_cast(AutoHeadroomGlitchTolerance * mSampleRate / mPeerFPP); } else { - // zero skips allowed if tolerance is below duration of two packets - skipsAllowed = 0; + // zero glitches allowed if tolerance is below duration of two packets + glitchesAllowed = 0; // also don't require two intervals in a row (override) mSkipAutoHeadroom = false; } - if (glitches > 0 && skipped > skipsAllowed - && mCurrentHeadroom + 1 <= pushStat->longTermMax) { + if (skipped > 0 && glitches > glitchesAllowed + && mCurrentHeadroom + 1 <= maxHeadroom) { if (mSkipAutoHeadroom) { mSkipAutoHeadroom = false; } else { // don't increase headroom two intervals in a row mSkipAutoHeadroom = true; ++mCurrentHeadroom; - cout << "PLC glitches=" << glitches << " skipped=" << skipped << ">" - << skipsAllowed << ", increasing headroom to " << mCurrentHeadroom - << " (max=" << pushStat->longTermMax << ")" << endl; + cout << "PLC skipped=" << skipped << " glitches=" << glitches << ">" + << glitchesAllowed << ", increasing headroom to " << mCurrentHeadroom + << " (max=" << maxHeadroom << ")" << endl; } } else { // thresholds not met: require 2 intervals in a row @@ -549,9 +553,11 @@ void Regulator::updatePushStats(int seq_num) const int newSkipped = totalSkipped - mLastSkipped; mLastGlitches = totalGlitches; mLastSkipped = totalSkipped; + mLastMaxLatency = mStatsMaxLatency; + mStatsMaxLatency = 0; if (mAuto && pushStat->lastTime > AutoInitDur) { // after AutoInitDur: update auto tolerance once per second - if (pushStat->lastTime <= (AutoInitDur + 3000)) { + if (pushStat->lastTime <= mAutoHeadroomStartTime) { // Ignore glitches and skips for the first 3 seconds after // we have switched from using the startup tolerance to // a calculated tolerance. Otherwise, the switch can @@ -565,6 +571,29 @@ void Regulator::updatePushStats(int seq_num) } } +//******************************************************************************* +void Regulator::setQueueBufferLength(int queueBuffer) +{ + if (queueBuffer > 0) { + // update to a fixed tolerance + mAuto = false; + mCurrentHeadroom = 0; + mMsecTolerance = queueBuffer; + return; + } + // update auto headroom for auto tolerance + mAuto = true; + if (queueBuffer == -500.0) { + mAutoHeadroom = -1; + mCurrentHeadroom = 0; + mSkipAutoHeadroom = true; + mAutoHeadroomStartTime = pushStat ? (pushStat->lastTime + 3000.0) : 3000.0; + } else { + mAutoHeadroom = std::abs(queueBuffer); + mCurrentHeadroom = mAutoHeadroom; + } +} + //******************************************************************************* void Regulator::pushPacket(const int8_t* buf, int seq_num) { @@ -621,6 +650,10 @@ bool Regulator::pullPacket() // next is the best candidate memcpy(mXfrBuffer, mSlots[next], mPeerBytes); mLastSeqNumOut = next; + double latency = (now - mIncomingTiming[mLastSeqNumOut]); + if (latency > mStatsMaxLatency) { + mStatsMaxLatency = latency; + } goto PACKETOK; } // track how many good packets we skipped due to tolerance < 1ms @@ -822,11 +855,16 @@ bool StdDev::tick(double prevTime, double curTime) return false; data[ctr] = msElapsed; - if (msElapsed < min) + acc += msElapsed; + if (ctr == 0) { min = msElapsed; - else if (msElapsed > max) max = msElapsed; - acc += msElapsed; + } else { + if (msElapsed < min) + min = msElapsed; + if (msElapsed > max) + max = msElapsed; + } if (ctr == 0 && longTermCnt % WindowDivisor == 0) { lastMin = msElapsed; lastMax = msElapsed; @@ -1098,7 +1136,8 @@ bool Regulator::getStats(RingBuffer::IOStat* stat, bool reset) } // hijack of struct IOStat { - stat->underruns = mLastGlitches - mStatsGlitches; + const int lastGlitches = mLastGlitches; + stat->underruns = lastGlitches - mStatsGlitches; #define FLOATFACTOR 1000.0 stat->overflows = FLOATFACTOR * pushStat->longTermStdDev; stat->skew = FLOATFACTOR * pushStat->lastMean; @@ -1114,7 +1153,7 @@ bool Regulator::getStats(RingBuffer::IOStat* stat, bool reset) stat->broadcast_delta = FLOATFACTOR * pullStat->lastStdDev; stat->autoq_rate = FLOATFACTOR * mStatsMaxPLCdspElapsed; // reset a few stats for next time - mStatsGlitches = mLastGlitches; + mStatsGlitches = lastGlitches; mStatsMaxPLCdspElapsed = 0.0; // none are unused return true; diff --git a/src/Regulator.h b/src/Regulator.h index c65c3d2..2be916f 100644 --- a/src/Regulator.h +++ b/src/Regulator.h @@ -225,9 +225,15 @@ class Regulator : public RingBuffer /// @brief returns true if worker thread & queue is enabled inline bool isWorkerEnabled() const { return mWorkerEnabled; } - // virtual QString getStats(uint32_t statCount, uint32_t lostCount); + /// @brief returns statistics for -I command line option virtual bool getStats(IOStat* stat, bool reset); + /// @brief sets length of queue buffer + virtual void setQueueBufferLength([[maybe_unused]] int queueBuffer); + + /// @brief returns max latency during previous interval, in milliseconds + virtual double getLatency() const { return mLastMaxLatency; } + private: void pushPacket(const int8_t* buf, int seq_num); void updatePushStats(int seq_num); @@ -294,8 +300,11 @@ class Regulator : public RingBuffer int mLastSkipped = 0; int mLastGlitches = 0; int mStatsGlitches = 0; + double mLastMaxLatency = 0; + double mStatsMaxLatency = 0; double mStatsMaxPLCdspElapsed = 0; double mCurrentHeadroom = 0; + double mAutoHeadroomStartTime = 6000.0; double mAutoHeadroom = -1; Time* mTime = nullptr; diff --git a/src/Reverb.cpp b/src/Reverb.cpp index c8f3b45..d3ccdd4 100644 --- a/src/Reverb.cpp +++ b/src/Reverb.cpp @@ -106,7 +106,7 @@ Reverb::~Reverb() void Reverb::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); if (mReverbLevel <= 1.0) { // freeverb: static_cast(freeverbStereoP) ->init(fs); // compression filter parameters depend on sampling rate diff --git a/src/RingBuffer.cpp b/src/RingBuffer.cpp index 370355e..ea8243c 100644 --- a/src/RingBuffer.cpp +++ b/src/RingBuffer.cpp @@ -224,6 +224,13 @@ void RingBuffer::readBroadcastSlot(int8_t* ptrToReadSlot) std::memset(ptrToReadSlot, 0, mSlotSize); } +//******************************************************************************* +// Not supported in RingBuffer +void RingBuffer::setQueueBufferLength([[maybe_unused]] int queueBuffer) +{ + return; +} + //******************************************************************************* void RingBuffer::setUnderrunReadSlot(int8_t* ptrToReadSlot) { @@ -319,3 +326,10 @@ void RingBuffer::updateReadStats() mUnderrunsNew = 0; mLevel = std::ceil(mLevelCur); } + +//******************************************************************************* +// Not supported in RingBuffer +double RingBuffer::getLatency() const +{ + return -1; +} diff --git a/src/RingBuffer.h b/src/RingBuffer.h index a35f0b2..9cc07ad 100644 --- a/src/RingBuffer.h +++ b/src/RingBuffer.h @@ -101,6 +101,9 @@ class RingBuffer virtual void readSlotNonBlocking(int8_t* ptrToReadSlot); virtual void readBroadcastSlot(int8_t* ptrToReadSlot); + /// @brief sets length of queue buffer + virtual void setQueueBufferLength([[maybe_unused]] int queueBuffer); + struct IOStat { uint32_t underruns; uint32_t overflows; @@ -117,8 +120,13 @@ class RingBuffer int32_t autoq_corr; int32_t autoq_rate; }; + + /// @brief returns statistics for -I command line option virtual bool getStats(IOStat* stat, bool reset); + /// @brief returns max latency during previous interval, in milliseconds + virtual double getLatency() const; + protected: /** \brief Sets the memory in the Read Slot when uderrun occurs. By default, * this sets it to 0. Override this method in a subclass for a different behavior. diff --git a/src/RtAudioInterface.cpp b/src/RtAudioInterface.cpp index 3fa35cd..8ff1599 100644 --- a/src/RtAudioInterface.cpp +++ b/src/RtAudioInterface.cpp @@ -42,6 +42,7 @@ #include #include "JackTrip.h" +#include "SampleRateConverter.h" #include "StereoToMono.h" #include "jacktrip_globals.h" @@ -83,6 +84,13 @@ void RtAudioDevice::printVerbose() const #endif } +//******************************************************************************* +bool RtAudioDevice::isAirpods() const +{ + return name.substr(0, 11) == "Apple Inc.:" + && name.find("AirPods") != std::string::npos; +} + //******************************************************************************* bool RtAudioDevice::checkSampleRate(unsigned int srate) const { @@ -93,6 +101,22 @@ bool RtAudioDevice::checkSampleRate(unsigned int srate) const return false; } +//******************************************************************************* +unsigned int RtAudioDevice::getClosestSampleRate(unsigned int srate) const +{ + unsigned int bestResult = 0; + const unsigned int doubleSrate = srate * 2; + for (unsigned int i = 0; i < this->sampleRates.size(); i++) { + if (this->sampleRates[i] == srate) + return srate; + // pick the next highest rate available, or 2x if available + if (this->sampleRates[i] == doubleSrate + || (bestResultsampleRates[i]> bestResult)) + bestResult = this->sampleRates[i]; + } + return bestResult; +} + //******************************************************************************* RtAudioDevice& RtAudioDevice::operator=(const RtAudio::DeviceInfo& info) { @@ -243,6 +267,31 @@ void RtAudioInterface::setup(bool verbose) } } + mInSampleRate = mOutSampleRate = getSampleRate(); +#ifdef HAVE_LIBSAMPLERATE + if (!in_device.checkSampleRate(getSampleRate())) { + mInSampleRate = in_device.getClosestSampleRate(getSampleRate()); + mInSrcPtr.reset(new SampleRateConverter(mInSampleRate, getSampleRate(), + in_chans_num, getBufferSizeInSamples())); + cout << "Converting input sample rate from " << mInSampleRate << " to " + << getSampleRate() << endl; + } + // special hack for apple's airpods. these work at 48khz ONLY for output. + // they will only run at 24k for input, and if input is active, they will + // also run output at 24k, despite claiming to be working at 48k. + if (in_device.isAirpods() && out_device.isAirpods()) { + mOutSampleRate = 24000; + } else if (!out_device.checkSampleRate(getSampleRate())) { + mOutSampleRate = out_device.getClosestSampleRate(getSampleRate()); + } + if (mOutSampleRate != getSampleRate()) { + mOutSrcPtr.reset(new SampleRateConverter( + getSampleRate(), mOutSampleRate, out_chans_num, getBufferSizeInSamples())); + mOutTmpPtr.reset(new float[getBufferSizeInSamples() * out_chans_num]); + cout << "Converting output sample rate from " << mOutSampleRate << " to " + << getSampleRate() << endl; + } +#else if (!in_device.checkSampleRate(getSampleRate())) { QString errorMsg; QTextStream(&errorMsg) << "Input device \"" << QString::fromStdString(in_name) @@ -257,6 +306,7 @@ void RtAudioInterface::setup(bool verbose) << getSampleRate(); throw std::runtime_error(errorMsg.toStdString()); } +#endif // provide warnings for common known failure cases const QString out_device_lower_name = @@ -325,8 +375,6 @@ void RtAudioInterface::setup(bool verbose) // Setup buffers mInBuffer.resize(in_chans_num); mOutBuffer.resize(out_chans_num); - - unsigned int sampleRate = getSampleRate(); // mSamplingRate; unsigned int bufferFrames = getBufferSizeInSamples(); // mBufferSize; if (in_device.api != out_device.api) @@ -348,15 +396,15 @@ void RtAudioInterface::setup(bool verbose) try { if (mDuplexMode) { mRtAudioInput->openStream( - &out_params, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + &out_params, &in_params, RTAUDIO_FLOAT32, mInSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options, errorFunc); } else { mRtAudioInput->openStream( - nullptr, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + nullptr, &in_params, RTAUDIO_FLOAT32, mInSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options, errorFunc); const unsigned int inputBufferFrames = bufferFrames; mRtAudioOutput->openStream( - &out_params, nullptr, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + &out_params, nullptr, RTAUDIO_FLOAT32, mOutSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options, errorFunc); if (inputBufferFrames != bufferFrames) { // output device doesn't support the same buffer size @@ -364,7 +412,7 @@ void RtAudioInterface::setup(bool verbose) const unsigned int outputBufferFrames = bufferFrames; mRtAudioInput->closeStream(); mRtAudioInput->openStream( - nullptr, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + nullptr, &in_params, RTAUDIO_FLOAT32, mInSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options, errorFunc); if (outputBufferFrames != bufferFrames) { // just give up if this still doesn't work @@ -385,7 +433,7 @@ void RtAudioInterface::setup(bool verbose) if (mDuplexMode) { if (RTAUDIO_NO_ERROR != mRtAudioInput->openStream( - &out_params, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + &out_params, &in_params, RTAUDIO_FLOAT32, mInSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options)) { errorText = mRtAudioInput->getErrorText(); } @@ -393,14 +441,14 @@ void RtAudioInterface::setup(bool verbose) mRtAudioOutput->setErrorCallback(errorFunc); if (RTAUDIO_NO_ERROR != mRtAudioInput->openStream( - nullptr, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + nullptr, &in_params, RTAUDIO_FLOAT32, mInSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options)) { errorText = mRtAudioInput->getErrorText(); } else { const unsigned int inputBufferFrames = bufferFrames; if (RTAUDIO_NO_ERROR != mRtAudioOutput->openStream( - &out_params, nullptr, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, + &out_params, nullptr, RTAUDIO_FLOAT32, mOutSampleRate, &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, &options)) { errorText = mRtAudioOutput->getErrorText(); } else if (inputBufferFrames != bufferFrames) { @@ -410,8 +458,9 @@ void RtAudioInterface::setup(bool verbose) mRtAudioInput->closeStream(); if (RTAUDIO_NO_ERROR != mRtAudioInput->openStream( - nullptr, &in_params, RTAUDIO_FLOAT32, sampleRate, &bufferFrames, - &RtAudioInterface::wrapperRtAudioCallback, this, &options)) { + nullptr, &in_params, RTAUDIO_FLOAT32, mInSampleRate, + &bufferFrames, &RtAudioInterface::wrapperRtAudioCallback, this, + &options)) { errorText = mRtAudioInput->getErrorText(); } else if (outputBufferFrames != bufferFrames) { // just give up if this still doesn't work @@ -450,7 +499,7 @@ void RtAudioInterface::setup(bool verbose) // Setup StereoToMonoMixer // This MUST be after RtAudio::openSteram in case bufferFrames changes mStereoToMonoMixerPtr.reset(new StereoToMono()); - mStereoToMonoMixerPtr->init(sampleRate, bufferFrames); + mStereoToMonoMixerPtr->init(getSampleRate(), bufferFrames); } //******************************************************************************* @@ -550,47 +599,85 @@ long RtAudioInterface::getDefaultDeviceForLinuxPulseAudio(bool isInput) //******************************************************************************* int RtAudioInterface::RtAudioCallback(void* outputBuffer, void* inputBuffer, - unsigned int nFrames, double /*streamTime*/, + unsigned int nframes, double /*streamTime*/, RtAudioStreamStatus /*status*/) { - sample_t* inputBuffer_sample = static_cast(inputBuffer); - sample_t* outputBuffer_sample = static_cast(outputBuffer); - int in_chans_num = getNumInputChannels(); - if (mDuplexMode) { - if (inputBuffer_sample == NULL || outputBuffer_sample == NULL) { + if (inputBuffer == NULL || outputBuffer == NULL) { return 0; } - } else if (inputBuffer_sample == NULL && outputBuffer_sample == NULL) { + } else if (inputBuffer == NULL && outputBuffer == NULL) { return 0; } - // process input before output to minimize monitor latency on duplex devices - if (inputBuffer_sample != NULL) { - // copy samples to input buffer - for (int i = 0; i < mInBuffer.size(); i++) { - // Input Ports are READ ONLY - mInBuffer[i] = inputBuffer_sample + (nFrames * i); +#ifdef HAVE_LIBSAMPLERATE + uint32_t bufferSize = getBufferSizeInSamples(); + if (inputBuffer != NULL && getSampleRate() != mInSampleRate) { + int framesAvailable = mInSrcPtr->push(inputBuffer, nframes); + if (framesAvailable < 0) { + std::cerr << "RtAudioInterface sample rate conversion error" << std::endl; + return -1; } - if (in_chans_num == 2 && mInBuffer.size() == in_chans_num - && mInputMixMode == AudioInterface::MIXTOMONO) { - mStereoToMonoMixerPtr->compute(nFrames, mInBuffer.data(), mInBuffer.data()); + while (static_cast(framesAvailable) >= bufferSize) { + prepareInputBuffer(mInSrcPtr->pop(bufferSize), bufferSize); + AudioInterface::audioInputCallback(mInBuffer, bufferSize); + framesAvailable -= bufferSize; } - AudioInterface::audioInputCallback(mInBuffer, nFrames); + inputBuffer = NULL; + } + if (outputBuffer != NULL && getSampleRate() != mOutSampleRate) { + prepareOutputBuffer(mOutTmpPtr.get(), bufferSize); + int framesAvailable = mOutSrcPtr->getFramesAvailable(); + while (static_cast(framesAvailable) < nframes) { + AudioInterface::audioOutputCallback(mOutBuffer, bufferSize); + framesAvailable = mOutSrcPtr->push(mOutTmpPtr.get(), bufferSize); + if (framesAvailable < 0) { + std::cerr << "RtAudioInterface sample rate conversion error" << std::endl; + return -1; + } + } + memcpy(outputBuffer, mOutSrcPtr->pop(nframes), + nframes * mOutBuffer.size() * sizeof(float)); + outputBuffer = NULL; } +#endif - if (outputBuffer_sample != NULL) { - // copy samples to output buffer - for (int i = 0; i < mOutBuffer.size(); i++) { - // Output Ports are WRITABLE - mOutBuffer[i] = outputBuffer_sample + (nFrames * i); - } - AudioInterface::audioOutputCallback(mOutBuffer, nFrames); + // process input before output to minimize monitor latency on duplex devices + if (inputBuffer != NULL) { + prepareInputBuffer(static_cast(inputBuffer), nframes); + AudioInterface::audioInputCallback(mInBuffer, nframes); + } + + if (outputBuffer != NULL) { + prepareOutputBuffer(static_cast(outputBuffer), nframes); + AudioInterface::audioOutputCallback(mOutBuffer, nframes); } return 0; } +//******************************************************************************* +void RtAudioInterface::prepareInputBuffer(sample_t* ptr, unsigned int nframes) +{ + for (int i = 0; i < mInBuffer.size(); i++) { + // Input Ports are READ ONLY + mInBuffer[i] = ptr + (nframes * i); + } + if (getNumInputChannels() == 2 && mInBuffer.size() == getNumInputChannels() + && mInputMixMode == AudioInterface::MIXTOMONO) { + mStereoToMonoMixerPtr->compute(nframes, mInBuffer.data(), mInBuffer.data()); + } +} + +//******************************************************************************* +void RtAudioInterface::prepareOutputBuffer(sample_t* ptr, unsigned int nframes) +{ + for (int i = 0; i < mOutBuffer.size(); i++) { + // Output Ports are WRITABLE + mOutBuffer[i] = ptr + (nframes * i); + } +} + //******************************************************************************* int RtAudioInterface::wrapperRtAudioCallback(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, diff --git a/src/RtAudioInterface.h b/src/RtAudioInterface.h index b58125c..1207eb6 100644 --- a/src/RtAudioInterface.h +++ b/src/RtAudioInterface.h @@ -52,7 +52,10 @@ #include "AudioInterface.h" #include "StereoToMono.h" #include "jacktrip_globals.h" -class JackTrip; // Forward declaration + +// Forward declarations +class JackTrip; +class SampleRateConverter; /// \brief Simple Class that represents an audio interface available via RtAudio class RtAudioDevice : public RtAudio::DeviceInfo @@ -64,7 +67,9 @@ class RtAudioDevice : public RtAudio::DeviceInfo RtAudio::Api api; void print() const; void printVerbose() const; + bool isAirpods() const; bool checkSampleRate(unsigned int srate) const; + unsigned int getClosestSampleRate(unsigned int srate) const; RtAudioDevice& operator=(const RtAudio::DeviceInfo& info); }; @@ -125,6 +130,8 @@ class RtAudioInterface : public AudioInterface private: int RtAudioCallback(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status); + void prepareInputBuffer(sample_t* ptr, unsigned int nframes); + void prepareOutputBuffer(sample_t* ptr, unsigned int nframes); static int wrapperRtAudioCallback(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void* userData); @@ -155,6 +162,11 @@ class RtAudioInterface : public AudioInterface bool mDuplexMode; ///< true if using duplex stream mode (input device == output ///< device) QScopedPointer mStereoToMonoMixerPtr; + QScopedPointer mInSrcPtr; + QScopedPointer mOutSrcPtr; + QScopedPointer mOutTmpPtr; + uint32_t mInSampleRate; ///< Actual sampling rate for input device + uint32_t mOutSampleRate; ///< Actual sampling rate for output device }; #endif // __RTAUDIOINTERFACE_H__ diff --git a/src/SampleRateConverter.cpp b/src/SampleRateConverter.cpp new file mode 100644 index 0000000..f784c74 --- /dev/null +++ b/src/SampleRateConverter.cpp @@ -0,0 +1,141 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SampleRateConverter.cpp + * \author Mike Dickey + * \date January 2025 + */ + +#include "SampleRateConverter.h" + +#include +#include +#include + +using namespace std; + +constexpr int BufferSizeMultiple = 3; +constexpr int BytesPerSample = sizeof(float); + +//******************************************************************************* +SampleRateConverter::SampleRateConverter(unsigned int inRate, unsigned int outRate, + unsigned int numChans, unsigned int bufferSize) + : mBytesPerFrame(numChans * BytesPerSample) + , mNumChannels(numChans) + , mBufferSize(bufferSize) +{ +#ifdef HAVE_LIBSAMPLERATE + int srcErr; + mStatePtr = src_new(SRC_SINC_BEST_QUALITY, numChans, &srcErr); + if (mStatePtr == nullptr) { + string errorMsg("Failed to prepare sample rate converter: "); + errorMsg += src_strerror(srcErr); + throw runtime_error(errorMsg); + } + mInDataPtr = new char[BufferSizeMultiple * mBufferSize * mBytesPerFrame]; + mOutDataPtr = new char[BufferSizeMultiple * mBufferSize * mBytesPerFrame]; + mOutPopPtr = new float[mBufferSize * mNumChannels]; + mData.data_in = reinterpret_cast(mInDataPtr); + mData.src_ratio = static_cast(outRate) / inRate; + mData.end_of_input = 0; + mInFramesLeftover = 0; + mOutFramesAvailable = 0; +#else + throw runtime_error("JackTrip was not built with support for sample rate conversion"); +#endif +} + +//******************************************************************************* +SampleRateConverter::~SampleRateConverter() +{ +#ifdef HAVE_LIBSAMPLERATE + if (mStatePtr != nullptr) { + src_delete(mStatePtr); + } + delete[] mInDataPtr; + delete[] mOutDataPtr; + delete[] mOutPopPtr; +#endif +} + +//******************************************************************************* +int SampleRateConverter::push(void* inPtr, unsigned int nframes) +{ +#ifdef HAVE_LIBSAMPLERATE + char* framePtr = mOutDataPtr + (mOutFramesAvailable * mBytesPerFrame); + mData.data_out = reinterpret_cast(framePtr); + mData.output_frames = (BufferSizeMultiple * mBufferSize) - mOutFramesAvailable; + mData.input_frames = nframes + mInFramesLeftover; + // interleave input + float* fromPtr = reinterpret_cast(inPtr); + float* toPtr = + reinterpret_cast(mInDataPtr + (mInFramesLeftover * mBytesPerFrame)); + for (unsigned int i = 0; i < nframes; ++i) { + for (unsigned int c = 0; c < mNumChannels; ++c) { + *(toPtr++) = fromPtr[i + (c * nframes)]; + } + } + if (src_process(mStatePtr, &mData) != 0) + return -1; + mInFramesLeftover = mData.input_frames - mData.input_frames_used; + if (mInFramesLeftover > 0 && mData.input_frames_used > 0) { + memmove(mInDataPtr, mInDataPtr + (mData.input_frames_used * mBytesPerFrame), + mInFramesLeftover * mBytesPerFrame); + } + mOutFramesAvailable += mData.output_frames_gen; +#endif + return mOutFramesAvailable; +} + +//******************************************************************************* +float* SampleRateConverter::pop(unsigned int nframes) +{ +#ifdef HAVE_LIBSAMPLERATE + // de-interleave output + float* fromPtr = reinterpret_cast(mOutDataPtr); + float* toPtr = mOutPopPtr; + for (unsigned int c = 0; c < mNumChannels; ++c) { + for (unsigned int i = 0; i < nframes; ++i) { + *(toPtr++) = fromPtr[c + (i * mNumChannels)]; + } + } + // pop frames + const unsigned int remainingFrames = mOutFramesAvailable - nframes; + if (remainingFrames > 0) { + memmove(mOutDataPtr, mOutDataPtr + (nframes * mBytesPerFrame), + (remainingFrames * mBytesPerFrame)); + } + mOutFramesAvailable = remainingFrames; + return mOutPopPtr; +#else + return nullptr; +#endif +} diff --git a/src/SampleRateConverter.h b/src/SampleRateConverter.h new file mode 100644 index 0000000..8f1c1d7 --- /dev/null +++ b/src/SampleRateConverter.h @@ -0,0 +1,78 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SampleRateConverter.h + * \author Mike Dickey + * \date January 2025 + */ + +#ifndef __SAMPLERATECONVERTER_H__ +#define __SAMPLERATECONVERTER_H__ + +#ifdef HAVE_LIBSAMPLERATE +#include "samplerate.h" +#endif + +/// \brief Trivial wrapper for sample rate conversion +class SampleRateConverter +{ + public: + SampleRateConverter(unsigned int inRate, unsigned int outRate, unsigned int numChans, + unsigned int bufferSize); + ~SampleRateConverter(); + + /// processes nframes non-interleaved samples from inPtr and returns + /// the number of output samples available, or -1 if there is an error + int push(void* inPtr, unsigned int nframes); + + /// pops next block of nframes and returns a pointer to + /// non-interleaved buffer + float* pop(unsigned int nframes); + + /// \brief returns the number of converted samples that are ready + inline int getFramesAvailable() const { return mOutFramesAvailable; } + +#ifdef HAVE_LIBSAMPLERATE + private: + SRC_DATA mData; + SRC_STATE* mStatePtr = nullptr; + char* mInDataPtr = nullptr; + char* mOutDataPtr = nullptr; + float* mOutPopPtr = nullptr; +#endif + unsigned int mInFramesLeftover = 0; + unsigned int mOutFramesAvailable = 0; + unsigned int mBytesPerFrame = 0; + unsigned int mNumChannels = 0; + unsigned int mBufferSize = 0; +}; + +#endif // __SAMPLERATECONVERTER_H__ diff --git a/src/Settings.cpp b/src/Settings.cpp index 28ffb13..9ee0a43 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -981,19 +981,56 @@ void Settings::setDevicesByString(std::string nameArg) { size_t commaPos; char delim = ','; - if (std::count(nameArg.begin(), nameArg.end(), delim) > 1) { + + // Some audio device names contain commas. Allow these to be escaped with a backslash. + int delimCount = std::count(nameArg.begin(), nameArg.end(), delim); + std::string escaped = "\\,"; + std::vector escapedPositions; + + size_t position = nameArg.find(escaped, 0); + while (position != std::string::npos) { + // Store our comma locations for future reference. + escapedPositions.push_back(position + 1); + cout << position + 1 << endl; + position = nameArg.find(escaped, position + escaped.length()); + } + + if (delimCount - escapedPositions.size() > 1) { throw std::invalid_argument( - "Found multiple commas in the --audiodevice argument, cannot parse " + "Found multiple unescaped commas in the --audiodevice argument, cannot parse " "reliably."); } - commaPos = nameArg.rfind(delim); + int index = escapedPositions.size() - 1; + commaPos = nameArg.rfind(delim); + while (commaPos > 0 && index >= 0 && commaPos == escapedPositions.at(index)) { + commaPos = nameArg.rfind(delim, commaPos - 1); + index--; + } + if (commaPos || nameArg[0] == delim) { mInputDeviceName = nameArg.substr(0, commaPos); mOutputDeviceName = nameArg.substr(commaPos + 1); } else { mInputDeviceName = mOutputDeviceName = nameArg; } + + if (escapedPositions.size() > 0) { + // We have to get rid of instances of our escape character. + position = 0; + while ((position = mInputDeviceName.find(escaped, position)) + != std::string::npos) { + mInputDeviceName.replace(position, escaped.length(), ","); + position++; + } + position = 0; + while ((position = mOutputDeviceName.find(escaped, position)) + != std::string::npos) { + mOutputDeviceName.replace(position, escaped.length(), ","); + position++; + } + } } + #endif //******************************************************************************* @@ -1226,13 +1263,15 @@ JackTrip* Settings::getConfiguredJackTrip() std::vector outgoingEffects = mEffects.allocateOutgoingEffects(mNumAudioInputChans - nReservedChans); for (auto p : outgoingEffects) { - jackTrip->appendProcessPluginToNetwork(p); + QSharedPointer pShared(p); + jackTrip->appendProcessPluginToNetwork(pShared); } std::vector incomingEffects = mEffects.allocateIncomingEffects(mNumAudioOutputChans - nReservedChans); for (auto p : incomingEffects) { - jackTrip->appendProcessPluginFromNetwork(p); + QSharedPointer pShared(p); + jackTrip->appendProcessPluginFromNetwork(pShared); } #ifdef WAIR // WAIR diff --git a/src/SocketClient.cpp b/src/SocketClient.cpp new file mode 100644 index 0000000..a9ef002 --- /dev/null +++ b/src/SocketClient.cpp @@ -0,0 +1,89 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2022-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SocketClient.cpp + * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton + * \date December 2024 + */ + +#include "SocketClient.h" + +#include + +SocketClient::SocketClient(QObject* parent) + : QObject(parent), m_socket(new QLocalSocket(this)), m_owns_socket(true) +{ +} + +SocketClient::SocketClient(QSharedPointer& s, QObject* parent) + : QObject(parent), m_socket(s), m_owns_socket(false) +{ +} + +SocketClient::~SocketClient() +{ + if (isConnected() && m_owns_socket) { + m_socket->close(); + m_socket->waitForDisconnected(1000); // wait for up to 1 second + } +} + +bool SocketClient::connect() +{ + if (isConnected()) { + return true; + } + m_socket->connectToServer(JACKTRIP_SOCKET_NAME); + return m_socket->waitForConnected(1000); // wait for up to 1 second +} + +void SocketClient::close() +{ + if (isConnected()) { + m_socket->close(); + m_socket->waitForDisconnected(1000); // wait for up to 1 second + } +} + +bool SocketClient::sendHeader(const QString& handler) +{ + // sanity check + if (!isConnected()) { + return false; + } + QString headerStr = "JackTrip/1.0 "; + headerStr += handler; + headerStr += "\n"; + QByteArray headerBytes = headerStr.toLocal8Bit(); + qint64 writeBytes = m_socket->write(headerBytes); + m_socket->waitForBytesWritten(-1); + return writeBytes > 0; +} diff --git a/src/SocketClient.h b/src/SocketClient.h new file mode 100644 index 0000000..281d029 --- /dev/null +++ b/src/SocketClient.h @@ -0,0 +1,89 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2022-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SocketClient.h + * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton + * \date December 2024 + */ + +#ifndef __SocketClient_H__ +#define __SocketClient_H__ + +#include +#include + +// name of the local socket used by JackTrip +constexpr const char* JACKTRIP_SOCKET_NAME = "JackTrip"; + +// SocketClient lists for local socket connections from remote JackTrip processes +class SocketClient : public QObject +{ + Q_OBJECT + + public: + // default constructor + SocketClient(QObject* parent = nullptr); + + // construct with an existing socket + SocketClient(QSharedPointer& s, QObject* parent = nullptr); + + // virtual destructor since it inherits from QObject + virtual ~SocketClient(); + + // return local socket connection + inline bool isConnected() + { + return m_socket->state() == QLocalSocket::ConnectedState; + } + + // return local socket connection + inline QLocalSocket& getSocket() { return *m_socket; } + + // attempts to connect to remote instance's socket server + // returns true if connection was successfully established + // returns false if connection failed + bool connect(); + + // closes the connection to remote instance's socket server + void close(); + + // send connection header with name of handler to use + bool sendHeader(const QString& handler); + + private: + // used to check if there is another server already running + QSharedPointer m_socket; + + // true if a this owns the socket and should close on destruction + bool m_owns_socket = false; +}; + +#endif // __SocketClient_H__ diff --git a/src/SocketServer.cpp b/src/SocketServer.cpp new file mode 100644 index 0000000..ed36602 --- /dev/null +++ b/src/SocketServer.cpp @@ -0,0 +1,140 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2022-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SocketServer.cpp + * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton + * \date December 2024 + */ + +#include "SocketServer.h" + +#include +#include + +#include "SocketClient.h" + +using namespace std; + +bool SocketServer::start() +{ + // sanity check for repeated calls + if (!m_instanceServer.isNull()) { + m_serverStarted = true; + return m_serverStarted; + } + + // attempt local socket connection to check for an existing instance + SocketClient c; + bool established = c.connect(); + + if (established) { + c.close(); + m_serverStarted = false; + } else { + // confirmed that no other jacktrip instance is running + m_instanceServer.reset(new QLocalServer()); + m_instanceServer->setSocketOptions(QLocalServer::WorldAccessOption); + QObject::connect(m_instanceServer.data(), &QLocalServer::newConnection, this, + &SocketServer::handlePendingConnections, Qt::QueuedConnection); + QString serverName(JACKTRIP_SOCKET_NAME); + QLocalServer::removeServer(serverName); + m_serverStarted = m_instanceServer->listen(serverName); + if (m_serverStarted) { + cout << "Listening for local connections: " + << m_instanceServer->fullServerName().toStdString() << endl; + } else { + cerr << "Error listening for local connections: " + << m_instanceServer->errorString().toStdString() << endl; + } + } + + // return true if a local socket server was started + return m_serverStarted; +} + +void SocketServer::handlePendingConnections() +{ + while (m_instanceServer->hasPendingConnections()) { + QLocalSocket* connectedSocket = m_instanceServer->nextPendingConnection(); + + if (connectedSocket == nullptr || !connectedSocket->waitForConnected()) { + qDebug() << "Socket server: never received connection"; + continue; + } + + if (!connectedSocket->waitForReadyRead() + && connectedSocket->bytesAvailable() <= 0) { + qDebug() << "Socket server: not ready and no bytes available: " + << connectedSocket->errorString(); + continue; + } + + if (connectedSocket->bytesAvailable() < (int)sizeof(quint16)) { + qDebug() << "Socket server: ready but no bytes available"; + continue; + } + + // first line should be in the format "JackTrip/1.0 HandlerName" + // where HandlerName indicates which handler should be used + QByteArray in(connectedSocket->readLine()); + QString header(in); + if (!header.startsWith("JackTrip/1.0 ")) { + if (header.startsWith("JackTrip/")) { + cerr << "Socket server: unknown version: " << header.toStdString() + << endl; + } else { + cerr << "Socket server: invalid header: " << header.toStdString() << endl; + } + continue; + } + QString handlerName(header); + handlerName.replace("JackTrip/1.0 ", ""); + handlerName.replace("\n", ""); + + cout << "Socket server: received connection for " << handlerName.toStdString() + << endl; + connectedSocket->setParent(nullptr); + QSharedPointer sharedSocket(connectedSocket); + handleConnection(handlerName, sharedSocket); + } +} + +void SocketServer::handleConnection(const QString& name, + QSharedPointer& socket) +{ + auto it = m_handlers.find(name); + if (it == m_handlers.end()) { + cerr << "Socket server: request for unknown handler: " << name.toStdString() + << endl; + return; + } + it.value()(socket); +} \ No newline at end of file diff --git a/src/SocketServer.h b/src/SocketServer.h new file mode 100644 index 0000000..840dafe --- /dev/null +++ b/src/SocketServer.h @@ -0,0 +1,89 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2022-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +/** + * \file SocketServer.h + * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton + * \date December 2024 + */ + +#ifndef __SocketServer_H__ +#define __SocketServer_H__ + +#include +#include +#include +#include +#include +#include + +// SocketHandler is used to handle a new socket connection +typedef std::function&)> SocketHandler; + +// SocketServer lists for local socket connections from remote JackTrip processes +class SocketServer : public QObject +{ + Q_OBJECT + + public: + // default constructor + SocketServer() {} + + // virtual destructor since it inherits from QObject + virtual ~SocketServer() {} + + // sets handler for local socket connections + void addHandler(QString name, SocketHandler f) { m_handlers[name] = f; } + + // attempts to start the local socket server + // returns true if it started successfully + // returns false if already running in another JackTrip process + bool start(); + + private slots: + + // called by local socket server to handle requests + void handlePendingConnections(); + + private: + // called by local socket server to handle requests + void handleConnection(const QString& name, QSharedPointer& socket); + + // used to listen for requests via local socket connections + QScopedPointer m_instanceServer; + + // used to handle requests + QHash m_handlers; + + // true if a local socket server was started, false if remote was detected + bool m_serverStarted = false; +}; + +#endif // __SocketServer_H__ diff --git a/src/StereoToMono.cpp b/src/StereoToMono.cpp index fa99c33..861ed4b 100644 --- a/src/StereoToMono.cpp +++ b/src/StereoToMono.cpp @@ -60,7 +60,7 @@ void StereoToMono::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); static_cast(stereoToMonoP)->init(fs); inited = true; diff --git a/src/Tone.cpp b/src/Tone.cpp index b003ebe..fa6af19 100644 --- a/src/Tone.cpp +++ b/src/Tone.cpp @@ -71,7 +71,7 @@ Tone::~Tone() void Tone::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(toneP[i])->init( diff --git a/src/UdpHubListener.cpp b/src/UdpHubListener.cpp index ecd588f..1d602dc 100644 --- a/src/UdpHubListener.cpp +++ b/src/UdpHubListener.cpp @@ -220,6 +220,8 @@ void UdpHubListener::start() mAuth.reset(new Auth(mCredsFile, true)); } + startOscServer(); + cout << "JackTrip HUB SERVER: Waiting for client connections..." << endl; cout << "JackTrip HUB SERVER: Hub auto audio patch setting = " << mHubPatch << " (" << mHubPatchDescriptions.at(mHubPatch).toStdString() << ")" << endl; @@ -364,6 +366,19 @@ void UdpHubListener::stopCheck() } } +void UdpHubListener::queueBufferChanged(int queueBufferSize) +{ + cout << "Updating queueBuffer to " << queueBufferSize << endl; + QMutexLocker lock(&mMutex); + mBufferQueueLength = queueBufferSize; + // Now that we have our actual port, remove any duplicate workers. + for (int i = 0; i < gMaxThreads; i++) { + if (mJTWorkers->at(i) != nullptr) { + mJTWorkers->at(i)->setBufferQueueLength(mBufferQueueLength); + } + } +} + //******************************************************************************* // Returns 0 on error int UdpHubListener::readClientUdpPort(QSslSocket* clientConnection, QString& clientName) diff --git a/src/UdpHubListener.h b/src/UdpHubListener.h index a810025..1570180 100644 --- a/src/UdpHubListener.h +++ b/src/UdpHubListener.h @@ -54,6 +54,7 @@ #include "Patcher.h" #endif #include "Auth.h" +#include "OscServer.h" #include "SslServer.h" class JackTripWorker; // forward declaration @@ -109,6 +110,7 @@ class UdpHubListener : public QObject } void receivedNewConnection(); void stopCheck(); + void queueBufferChanged(int queueBufferSize); signals: void signalStarted(); @@ -129,6 +131,16 @@ class UdpHubListener : public QObject int checkAuthAndReadPort(QSslSocket* clientConnection, QString& clientName); int sendUdpPort(QSslSocket* clientConnection, qint32 udp_port); + void startOscServer() + { + // start osc server to listen to config updates + mOscServer = new OscServer(mServerPort, this); + mOscServer->start(); + + QObject::connect(mOscServer, &OscServer::signalQueueBufferChanged, this, + &UdpHubListener::queueBufferChanged, Qt::QueuedConnection); + }; + /** * \brief Send the JackTripWorker to the thread pool. This will run * until it's done. We still have control over the prototype class. @@ -156,6 +168,8 @@ class UdpHubListener : public QObject // JackTripWorker* mJTWorker; ///< Class that will be used as prototype QVector* mJTWorkers; ///< Vector of JackTripWorkers + // Pointer to OscServer + OscServer* mOscServer; SslServer mTcpServer; int mServerPort; //< Server known port number diff --git a/src/Volume.cpp b/src/Volume.cpp index 1690b07..7707bc1 100644 --- a/src/Volume.cpp +++ b/src/Volume.cpp @@ -70,7 +70,7 @@ Volume::~Volume() void Volume::init(int samplingRate, int bufferSize) { ProcessPlugin::init(samplingRate, bufferSize); - fs = float(fSamplingFreq); + fs = float(mSampleRate); for (int i = 0; i < mNumChannels; i++) { static_cast(volumeP[i]) diff --git a/src/gui/about.cpp b/src/gui/about.cpp index bfe7afe..c235779 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -87,7 +87,7 @@ About::About(QWidget* parent) : QDialog(parent), m_ui(new Ui::About) m_ui->aboutLabel->text().replace(QLatin1String("%BUILD%"), buildString)); #ifdef __APPLE__ - m_ui->aboutImage->setPixmap(QPixmap(":/images/icon_256.png")); + m_ui->aboutImage->setPixmap(QPixmap(":/images/icon_128@2x.png")); #endif aboutText.setHtml(m_ui->aboutLabel->text()); diff --git a/src/gui/about.ui b/src/gui/about.ui index e30f1a6..fa992b2 100644 --- a/src/gui/about.ui +++ b/src/gui/about.ui @@ -148,7 +148,7 @@ border: 4px solid black; - + diff --git a/src/gui/qjacktrip.cpp b/src/gui/qjacktrip.cpp index f7a91ec..aec0546 100644 --- a/src/gui/qjacktrip.cpp +++ b/src/gui/qjacktrip.cpp @@ -497,7 +497,11 @@ void QJackTrip::processFinished() if (m_ui->disconnectScriptCheckBox->isChecked()) { QStringList arguments = m_ui->disconnectScriptEdit->text().split( +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) QStringLiteral(" "), Qt::SkipEmptyParts); +#else + QStringLiteral(" "), QString::SkipEmptyParts); +#endif if (!arguments.isEmpty()) { QProcess disconnectScript; disconnectScript.setProgram(arguments.takeFirst()); @@ -547,7 +551,12 @@ void QJackTrip::receivedConnectionFromPeer() m_assignedClientName = m_jackTrip->getAssignedClientName(); if (m_ui->connectScriptCheckBox->isChecked()) { QStringList arguments = m_ui->connectScriptEdit->text().split(QStringLiteral(" "), +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) Qt::SkipEmptyParts); +#else + QString:: + SkipEmptyParts); +#endif if (!arguments.isEmpty()) { QProcess connectScript; connectScript.setProgram(arguments.takeFirst()); @@ -1631,53 +1640,61 @@ void QJackTrip::appendPlugins(JackTrip* jackTrip, int numSendChannels, // These effects are currently deleted by the AudioInterface of jacktrip. // May need to change this code if we move to smart pointers. if (m_ui->outCompressorCheckBox->isChecked()) { - jackTrip->appendProcessPluginToNetwork( + QSharedPointer pluginPtr( new Compressor(numSendChannels, false, CompressorPresets::voice)); + jackTrip->appendProcessPluginToNetwork(pluginPtr); } if (m_ui->inCompressorCheckBox->isChecked()) { - jackTrip->appendProcessPluginFromNetwork( + QSharedPointer pluginPtr( new Compressor(numRecvChannels, false, CompressorPresets::voice)); + jackTrip->appendProcessPluginFromNetwork(pluginPtr); } if (m_ui->outZitarevCheckBox->isChecked()) { qreal wetness = m_ui->outZitarevWetnessSlider->value() / 100.0; - jackTrip->appendProcessPluginToNetwork( + QSharedPointer pluginPtr( new Reverb(numSendChannels, numSendChannels, 1.0 + wetness)); + jackTrip->appendProcessPluginToNetwork(pluginPtr); } if (m_ui->inZitarevCheckBox->isChecked()) { qreal wetness = m_ui->inZitarevWetnessSlider->value() / 100.0; - jackTrip->appendProcessPluginFromNetwork( + QSharedPointer pluginPtr( new Reverb(numRecvChannels, numRecvChannels, 1.0 + wetness)); + jackTrip->appendProcessPluginFromNetwork(pluginPtr); } if (m_ui->outFreeverbCheckBox->isChecked()) { qreal wetness = m_ui->outFreeverbWetnessSlider->value() / 100.0; - jackTrip->appendProcessPluginToNetwork( + QSharedPointer pluginPtr( new Reverb(numSendChannels, numSendChannels, wetness)); + jackTrip->appendProcessPluginToNetwork(pluginPtr); } if (m_ui->inFreeverbCheckBox->isChecked()) { qreal wetness = m_ui->inFreeverbWetnessSlider->value() / 100.0; - jackTrip->appendProcessPluginFromNetwork( + QSharedPointer pluginPtr( new Reverb(numRecvChannels, numRecvChannels, wetness)); + jackTrip->appendProcessPluginFromNetwork(pluginPtr); } // Limiters go last in the plugin sequence. if (m_ui->outLimiterCheckBox->isChecked()) { - jackTrip->appendProcessPluginToNetwork( + QSharedPointer pluginPtr( new Limiter(numSendChannels, m_ui->outClientsSpinBox->value())); + jackTrip->appendProcessPluginToNetwork(pluginPtr); } if (m_ui->inLimiterCheckBox->isChecked()) { - jackTrip->appendProcessPluginFromNetwork(new Limiter(numRecvChannels, 1)); + QSharedPointer pluginPtr(new Limiter(numRecvChannels, 1)); + jackTrip->appendProcessPluginFromNetwork(pluginPtr); } } void QJackTrip::createMeters(quint32 inputChannels, quint32 outputChannels) { // These pointers are also deleted by AudioInterface. - Meter* inputMeter = new Meter(inputChannels); - Meter* outputMeter = new Meter(outputChannels); - m_jackTrip->appendProcessPluginToNetwork(inputMeter); - m_jackTrip->appendProcessPluginFromNetwork(outputMeter); + QSharedPointer inputMeterPtr(new Meter(inputChannels)); + QSharedPointer outputMeterPtr(new Meter(outputChannels)); + m_jackTrip->appendProcessPluginToNetwork(inputMeterPtr); + m_jackTrip->appendProcessPluginFromNetwork(outputMeterPtr); // Create our widgets. for (quint32 i = 0; i < inputChannels; i++) { @@ -1703,9 +1720,11 @@ void QJackTrip::createMeters(quint32 inputChannels, quint32 outputChannels) } m_outputLayout->setRowStretch(outputChannels, 100); - QObject::connect(inputMeter, &Meter::onComputedVolumeMeasurements, this, + QObject::connect(static_cast(inputMeterPtr.get()), + &Meter::onComputedVolumeMeasurements, this, &QJackTrip::updatedInputMeasurements); - QObject::connect(outputMeter, &Meter::onComputedVolumeMeasurements, this, + QObject::connect(static_cast(outputMeterPtr.get()), + &Meter::onComputedVolumeMeasurements, this, &QJackTrip::updatedOutputMeasurements); } @@ -1956,8 +1975,12 @@ QString QJackTrip::commandLineFromCurrentOptions() if (m_ui->outputDeviceComboBox->currentIndex() > 0) { outDevice = m_ui->outputDeviceComboBox->currentText(); } - commandLine.append( - QStringLiteral(" --audiodevice \"%1\",\"%2\"").arg(inDevice, outDevice)); + QString inDeviceEscaped = + QString(inDevice).replace(QStringLiteral(","), QStringLiteral("\\,")); + QString outDeviceEscaped = + QString(outDevice).replace(QStringLiteral(","), QStringLiteral("\\,")); + commandLine.append(QStringLiteral(" --audiodevice \"%1\",\"%2\"") + .arg(inDeviceEscaped, outDeviceEscaped)); } #endif diff --git a/src/gui/qjacktrip.ui b/src/gui/qjacktrip.ui index 0c537cc..995d809 100644 --- a/src/gui/qjacktrip.ui +++ b/src/gui/qjacktrip.ui @@ -2000,7 +2000,7 @@ To connect to a hub server you need to run as a hub client. disconnectScriptBrowse - + diff --git a/src/images/images.qrc b/src/images/images.qrc index 12f7129..90fc3dc 100644 --- a/src/images/images.qrc +++ b/src/images/images.qrc @@ -1,6 +1,7 @@ icon_256.png + icon_256.png icon_128.png icon_32.png diff --git a/src/jacktrip_globals.h b/src/jacktrip_globals.h index daeed16..c2ed233 100644 --- a/src/jacktrip_globals.h +++ b/src/jacktrip_globals.h @@ -38,9 +38,9 @@ #ifndef __JACKTRIP_GLOBALS_H__ #define __JACKTRIP_GLOBALS_H__ -#include "AudioInterface.h" +#include "jacktrip_types.h" -constexpr const char* const gVersion = "2.4.1"; ///< JackTrip version +constexpr const char* const gVersion = "2.5.0"; ///< JackTrip version //******************************************************************************* /// \name Default Values @@ -75,10 +75,6 @@ constexpr int gDefaultAddCombFilterLength = 0; constexpr int gDefaultCombFilterFeedback = 0; #endif // endwhere -// const JackAudioInterface::audioBitResolutionT gDefaultBitResolutionMode = -// JackAudioInterface::BIT16; -constexpr AudioInterface::audioBitResolutionT gDefaultBitResolutionMode = - AudioInterface::BIT16; constexpr int gDefaultQueueLength = 4; constexpr int gDefaultOutputQueueLength = 4; constexpr uint32_t gDefaultSampleRate = 48000; @@ -87,7 +83,7 @@ constexpr uint32_t gDefaultBufferSizeInSamples = 128; constexpr const char* gDefaultLocalAddress = ""; constexpr int gDefaultRedundancy = 1; constexpr int gTimeOutMultiThreadedServer = 10000; // seconds -constexpr int gUdpWaitTimeout = 50; // milliseconds +constexpr int gUdpWaitTimeout = 512; // milliseconds //@} //******************************************************************************* diff --git a/src/vs/AudioSettings.qml b/src/vs/AudioSettings.qml index 0b56065..a02a8de 100644 --- a/src/vs/AudioSettings.qml +++ b/src/vs/AudioSettings.qml @@ -793,11 +793,39 @@ Rectangle { id: scanningDevicesLabel x: 0; y: 0 width: parent.width - (16 * virtualstudio.uiScale) - text: "Scanning audio devices..." + text: (Qt.platform.os == "osx" && permissions.micPermission != "granted") ? "Microphone permissions not permitted" : "Scanning audio devices..." font { family: "Poppins"; pixelSize: fontMedium * virtualstudio.fontScale * virtualstudio.uiScale } wrapMode: Text.WordWrap color: textColour } + + Button { + id: openSettingsButton + visible: Qt.platform.os == "osx" && permissions.micPermission != "granted" + background: Rectangle { + radius: 6 * virtualstudio.uiScale + color: openSettingsButton.down ? buttonPressedColour : buttonColour + border.width: 1 + border.color: openSettingsButton.down || openSettingsButton.hovered ? buttonPressedStroke : buttonStroke + layer.enabled: openSettingsButton.hovered && !openSettingsButton.down + } + onClicked: { + permissions.openSystemPrivacy(); + } + anchors.top: scanningDevicesLabel.bottom + anchors.topMargin: 16 * virtualstudio.uiScale + anchors.horizontalCenter: parent.horizontalCenter + width: 200 * virtualstudio.uiScale; height: 30 * virtualstudio.uiScale + Text { + text: "Open Privacy Settings" + font.family: "Poppins" + font.pixelSize: 11 * virtualstudio.fontScale * virtualstudio.uiScale + font.weight: Font.Bold + color: textColour + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } } } } diff --git a/src/vs/ChangeDevices.qml b/src/vs/ChangeDevices.qml index 1a8dcfe..dcff434 100644 --- a/src/vs/ChangeDevices.qml +++ b/src/vs/ChangeDevices.qml @@ -25,6 +25,12 @@ Rectangle { property string shadowColour: virtualstudio.darkMode ? "#40000000" : "#80A1A1A1" property string toolTipBackgroundColour: virtualstudio.darkMode ? "#323232" : "#F3F3F3" property string toolTipTextColour: textColour + property string sliderColour: virtualstudio.darkMode ? "#BABCBC" : "#EAECEC" + property string sliderPressedColour: virtualstudio.darkMode ? "#ACAFAF" : "#DEE0E0" + property string sliderTrackColour: virtualstudio.darkMode ? "#5B5858" : "light gray" + property string sliderActiveTrackColour: virtualstudio.darkMode ? "light gray" : "black" + property string checkboxStroke: "#0062cc" + property string checkboxPressedStroke: "#007AFF" property string browserButtonColour: virtualstudio.darkMode ? "#494646" : "#EAECEC" property string browserButtonHoverColour: virtualstudio.darkMode ? "#5B5858" : "#D3D4D4" @@ -35,6 +41,13 @@ Rectangle { property string linkText: virtualstudio.darkMode ? "#8B8D8D" : "#272525" + function getQueueBufferString () { + if (virtualstudio.queueBuffer == 0) { + return "auto"; + } + return virtualstudio.queueBuffer + " ms"; + } + MouseArea { anchors.fill: parent propagateComposedEvents: false @@ -43,7 +56,6 @@ Rectangle { Rectangle { id: audioSettingsView width: parent.width; - height: parent.height; color: backgroundColour radius: 6 * virtualstudio.uiScale @@ -78,6 +90,149 @@ Rectangle { anchors.top: refreshButton.bottom; anchors.topMargin: 16 * virtualstudio.uiScale; } + + Rectangle { + id: latencyDivider + anchors.top: audioSettings.bottom + anchors.topMargin: 54 * virtualstudio.uiScale + x: 24 * virtualstudio.uiScale + width: parent.width - x - (24 * virtualstudio.uiScale); + height: 2 * virtualstudio.uiScale + color: "#E0E0E0" + } + + Text { + id: queueBufferLabel + anchors.top: latencyDivider.bottom + anchors.topMargin: 16 * virtualstudio.uiScale + x: 24 * virtualstudio.uiScale + text: "Audio Quality" + font { family: "Poppins"; pixelSize: fontMedium * virtualstudio.fontScale * virtualstudio.uiScale } + color: textColour + } + + InfoTooltip { + id: queueBufferTooltip + content: "JackTrip analyzes your Internet connection to find the best balance between audio latency and quality. Add additional latency to further improve quality." + size: 16 * virtualstudio.uiScale + anchors.left: queueBufferLabel.right + anchors.bottom: queueBufferLabel.top + anchors.bottomMargin: -8 * virtualstudio.uiScale + } + + AppIcon { + id: balanceIcon + anchors.left: queueBufferLabel.left + anchors.top: queueBufferLabel.bottom + width: 32 * virtualstudio.uiScale + height: 32 * virtualstudio.uiScale + icon.source: "balance.svg" + } + + CheckBox { + id: useStudioQueueBuffer + checked: virtualstudio.useStudioQueueBuffer + text: qsTr("Use Studio settings") + anchors.top: latencyDivider.bottom + anchors.topMargin: 16 * virtualstudio.uiScale + x: 168 * virtualstudio.uiScale; + onClicked: { virtualstudio.useStudioQueueBuffer = useStudioQueueBuffer.checkState == Qt.Checked; } + indicator: Rectangle { + implicitWidth: 16 * virtualstudio.uiScale + implicitHeight: 16 * virtualstudio.uiScale + x: useStudioQueueBuffer.leftPadding + y: parent.height / 2 - height / 2 + radius: 3 * virtualstudio.uiScale + border.color: useStudioQueueBuffer.down || useStudioQueueBuffer.hovered ? checkboxPressedStroke : checkboxStroke + + Rectangle { + width: 10 * virtualstudio.uiScale + height: 10 * virtualstudio.uiScale + x: 3 * virtualstudio.uiScale + y: 3 * virtualstudio.uiScale + radius: 2 * virtualstudio.uiScale + color: useStudioQueueBuffer.down || useStudioQueueBuffer.hovered ? checkboxPressedStroke : checkboxStroke + visible: useStudioQueueBuffer.checked + } + } + contentItem: Text { + text: useStudioQueueBuffer.text + font.family: "Poppins" + font.pixelSize: 10 * virtualstudio.fontScale * virtualstudio.uiScale + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + leftPadding: useStudioQueueBuffer.indicator.width + useStudioQueueBuffer.spacing + color: textColour + } + } + + Text { + id: currentLatency + anchors.top: latencyDivider.bottom + anchors.topMargin: 16 * virtualstudio.uiScale + anchors.right: parent.right + anchors.rightMargin: 24 * virtualstudio.uiScale + text: "Buffer Latency: " + Math.round(virtualstudio.networkStats.recvLatency) + " ms" + font { family: "Poppins"; pixelSize: fontSmall * virtualstudio.fontScale * virtualstudio.uiScale } + color: textColour + } + + Slider { + id: queueBufferSlider + value: virtualstudio.queueBuffer + onMoved: { + virtualstudio.queueBuffer = value; + } + from: 0 + to: 250 + stepSize: 1 + padding: 0 + visible: useStudioQueueBuffer.checkState != Qt.Checked + + anchors.top: useStudioQueueBuffer.bottom + anchors.topMargin: 16 * virtualstudio.uiScale + x: queueBufferText.x + queueBufferText.width + width: parent.width - x - (16 * virtualstudio.uiScale) - queueBufferText.width; + + background: Rectangle { + x: queueBufferSlider.leftPadding + y: queueBufferSlider.topPadding + queueBufferSlider.availableHeight / 2 - height / 2 + implicitWidth: parent.width + implicitHeight: 6 + width: queueBufferSlider.availableWidth + height: implicitHeight + radius: 4 + color: sliderTrackColour + + Rectangle { + width: queueBufferSlider.visualPosition * parent.width + height: parent.height + color: sliderActiveTrackColour + radius: 4 + } + } + + handle: Rectangle { + x: queueBufferSlider.leftPadding + queueBufferSlider.visualPosition * (queueBufferSlider.availableWidth - width) + y: queueBufferSlider.topPadding + queueBufferSlider.availableHeight / 2 - height / 2 + implicitWidth: 26 * virtualstudio.uiScale + implicitHeight: 26 * virtualstudio.uiScale + radius: 13 * virtualstudio.uiScale + color: queueBufferSlider.pressed ? sliderPressedColour : sliderColour + border.color: buttonStroke + } + } + + Text { + id: queueBufferText + width: (64 * virtualstudio.uiScale) + anchors.left: useStudioQueueBuffer.left + anchors.verticalCenter: queueBufferSlider.verticalCenter + text: getQueueBufferString() + font { family: "Poppins"; pixelSize: fontMedium * virtualstudio.fontScale * virtualstudio.uiScale } + color: textColour + visible: useStudioQueueBuffer.checkState != Qt.Checked + } } Button { diff --git a/src/vs/FeedbackSurvey.qml b/src/vs/FeedbackSurvey.qml index 05731f3..bab87a3 100644 --- a/src/vs/FeedbackSurvey.qml +++ b/src/vs/FeedbackSurvey.qml @@ -417,5 +417,9 @@ Item { userFeedbackSurvey.serverId = serverId; userFeedbackModal.open(); } + + function onCloseFeedbackSurveyModal() { + userFeedbackModal.close(); + } } } diff --git a/src/vs/Settings.qml b/src/vs/Settings.qml index e969637..cd589e2 100644 --- a/src/vs/Settings.qml +++ b/src/vs/Settings.qml @@ -59,13 +59,6 @@ Item { return idx; } - function getQueueBufferString () { - if (audio.queueBuffer == 0) { - return "auto"; - } - return audio.queueBuffer + " ms"; - } - Rectangle { id: audioSettingsView width: 0.8 * parent.width @@ -480,83 +473,12 @@ Item { color: textColour } - Slider { - id: queueBufferSlider - value: audio.queueBuffer - onMoved: { - audio.queueBuffer = value; - } - from: 0 - to: 128 - stepSize: 1 - padding: 0 - x: updateChannelCombo.x + queueBufferText.width - y: bufferCombo.y + (54 * virtualstudio.uiScale) - width: updateChannelCombo.width - queueBufferText.width - - background: Rectangle { - x: queueBufferSlider.leftPadding - y: queueBufferSlider.topPadding + queueBufferSlider.availableHeight / 2 - height / 2 - implicitWidth: parent.width - implicitHeight: 6 - width: queueBufferSlider.availableWidth - height: implicitHeight - radius: 4 - color: sliderTrackColour - - Rectangle { - width: queueBufferSlider.visualPosition * parent.width - height: parent.height - color: sliderActiveTrackColour - radius: 4 - } - } - - handle: Rectangle { - x: queueBufferSlider.leftPadding + queueBufferSlider.visualPosition * (queueBufferSlider.availableWidth - width) - y: queueBufferSlider.topPadding + queueBufferSlider.availableHeight / 2 - height / 2 - implicitWidth: 26 * virtualstudio.uiScale - implicitHeight: 26 * virtualstudio.uiScale - radius: 13 * virtualstudio.uiScale - color: queueBufferSlider.pressed ? sliderPressedColour : sliderColour - border.color: buttonStroke - } - } - - Text { - id: queueBufferText - width: (64 * virtualstudio.uiScale) - x: updateChannelCombo.x; - anchors.verticalCenter: queueBufferSlider.verticalCenter - text: getQueueBufferString() - font { family: "Poppins"; pixelSize: fontMedium * virtualstudio.fontScale * virtualstudio.uiScale } - color: textColour - } - - Text { - id: queueBufferLabel - anchors.verticalCenter: queueBufferSlider.verticalCenter - x: leftMargin * virtualstudio.uiScale - text: "Adjust Latency" - font { family: "Poppins"; pixelSize: fontMedium * virtualstudio.fontScale * virtualstudio.uiScale } - color: textColour - } - - InfoTooltip { - id: tooltip - content: "JackTrip analyzes your Internet connection to find the best balance between audio latency and quality. Add additional latency to further improve quality." - size: 16 - anchors.left: queueBufferLabel.right - anchors.leftMargin: 2 * virtualstudio.uiScale - anchors.verticalCenter: queueBufferSlider.verticalCenter - } - CheckBox { id: feedbackDetection checked: audio.feedbackDetectionEnabled text: qsTr("Automatically mute when feedback is detected") x: updateChannelCombo.x; - y: queueBufferSlider.y + (48 * virtualstudio.uiScale) + y: bufferCombo.y + (48 * virtualstudio.uiScale) onClicked: { audio.feedbackDetectionEnabled = feedbackDetection.checkState == Qt.Checked; } indicator: Rectangle { implicitWidth: 16 * virtualstudio.uiScale diff --git a/src/vs/WebEngine.qml b/src/vs/WebEngine.qml index a45b459..2f15764 100644 --- a/src/vs/WebEngine.qml +++ b/src/vs/WebEngine.qml @@ -62,7 +62,7 @@ Item { settings.javascriptCanPaste: true settings.screenCaptureEnabled: true profile.httpUserAgent: `JackTrip/${virtualstudio.versionString}` - url: `https://${virtualstudio.apiHost}/studios/${studioId}/live?accessToken=${accessToken}` + url: `https://${virtualstudio.apiHost}/studios/${studioId}/live` // useful for debugging // onJavaScriptConsoleMessage: function(level, message, lineNumber, sourceID) { diff --git a/src/vs/balance.svg b/src/vs/balance.svg new file mode 100644 index 0000000..c6ab21c --- /dev/null +++ b/src/vs/balance.svg @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/vs/virtualstudio.cpp b/src/vs/virtualstudio.cpp index 6f27a67..15d2e8a 100644 --- a/src/vs/virtualstudio.cpp +++ b/src/vs/virtualstudio.cpp @@ -62,8 +62,11 @@ // https://bugreports.qt.io/browse/QTBUG-55199 #include +#include "../AudioSocket.h" #include "../JackTrip.h" #include "../Settings.h" +#include "../SocketClient.h" +#include "../SocketServer.h" #include "../jacktrip_globals.h" #include "JTApplication.h" #include "WebSocketTransport.h" @@ -130,6 +133,8 @@ VirtualStudio::VirtualStudio(UserInterface& parent) m_auth.reset(new VsAuth(m_networkAccessManagerPtr, m_api.data())); connect(m_auth.data(), &VsAuth::authSucceeded, this, &VirtualStudio::slotAuthSucceeded); + connect(m_auth.data(), &VsAuth::updatedAccessToken, this, + &VirtualStudio::slotAccessTokenUpdated); connect(m_auth.data(), &VsAuth::refreshTokenFailed, this, [=]() { m_auth->authenticate(QStringLiteral("")); // retry without using refresh token }); @@ -174,6 +179,26 @@ VirtualStudio::VirtualStudio(UserInterface& parent) // Register clipboard Qml type qmlRegisterType("VS", 1, 0, "Clipboard"); + // on window focus, attempt to refresh the access token if the token is more than 1 + // hour old + connect(m_view.data(), &VsQuickView::focusGained, this, [=]() { + QString refreshToken = m_auth->refreshToken(); + if (refreshToken.isEmpty()) { + return; + } + + qint64 maxElapsedTimeInMs = 1000 * 60 * 60; // 1 hour + QDateTime accessTokenTimestamp = m_auth->accessTokenTimestamp(); + // only refresh after auth process completed the first time + if (accessTokenTimestamp.toMSecsSinceEpoch() > 0) { + QDateTime accessTokenDeadline = QDateTime::fromMSecsSinceEpoch( + accessTokenTimestamp.toMSecsSinceEpoch() + maxElapsedTimeInMs); + if (QDateTime::currentDateTime() > accessTokenDeadline) { + m_auth->refreshAccessToken(refreshToken); + } + } + }); + // setup QML view m_view->engine()->rootContext()->setContextProperty(QStringLiteral("virtualstudio"), this); @@ -213,14 +238,6 @@ VirtualStudio::VirtualStudio(UserInterface& parent) connect(m_view.get(), &VsQuickView::windowClose, this, &VirtualStudio::exit, Qt::QueuedConnection); - // prepare handler for deeplinks jacktrip://join/ - m_deepLinkPtr.reset(new VsDeeplink(m_interface.getSettings().getDeeplink())); - if (!m_deepLinkPtr->getDeeplink().isEmpty()) { - bool readyForExit = m_deepLinkPtr->waitForReady(); - if (readyForExit) - std::exit(0); - } - // Log to file QString logPath(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); QDir logDir; @@ -236,10 +253,53 @@ VirtualStudio::VirtualStudio(UserInterface& parent) ts = new QTextStream(&outFile); qInstallMessageHandler(qtMessageHandler); - // Get ready for deep link signals - QObject::connect(m_deepLinkPtr.get(), &VsDeeplink::signalDeeplink, this, + // check if started with a deep link to handle jacktrip://join/ + QString deepLinkStr = m_interface.getSettings().getDeeplink(); + if (!deepLinkStr.isEmpty()) { + // started with a deep link; check if another instance is already running + SocketClient c; + if (c.connect()) { + // existing instance found; send deeplink to it and exit + if (!c.sendHeader("deeplink")) { + c.close(); + std::cerr << "Failed to send deeplink header" << std::endl; + std::exit(1); + } + QLocalSocket& s = c.getSocket(); + QByteArray deepLinkBytes = deepLinkStr.toLocal8Bit(); + qint64 bytesWritten = s.write(deepLinkBytes); + s.flush(); + s.waitForBytesWritten(1000); + if (bytesWritten != deepLinkBytes.size()) { + std::cerr << "Failed to send deeplink" << std::endl; + std::exit(1); + } + std::cout << "sent deeplink: " << deepLinkStr.toStdString() << std::endl; + std::exit(0); + } + } + + // prepare handler for deep link requests + m_deepLinkPtr.reset(new VsDeeplink()); + QObject::connect(m_deepLinkPtr.get(), &VsDeeplink::signalVsDeeplink, this, &VirtualStudio::handleDeeplinkRequest, Qt::QueuedConnection); - m_deepLinkPtr->readyForSignals(); + if (!deepLinkStr.isEmpty()) { + QUrl deepLinkUrl(deepLinkStr); + m_deepLinkPtr->handleUrl(deepLinkUrl); + } + + // prepare handler for local socket connections + m_socketServerPtr.reset(new SocketServer()); + m_socketServerPtr->addHandler("deeplink", [=](QSharedPointer& socket) { + m_deepLinkPtr->handleVsDeeplinkRequest(socket); + }); + m_socketServerPtr->addHandler("audio", [=](QSharedPointer& socket) { + this->handleAudioSocketRequest(socket); + }); + m_socketServerPtr->start(); + + // initialize default QtWebEngineProfile + m_qwebEngineProfile = QWebEngineProfile::defaultProfile(); } void VirtualStudio::show() @@ -308,11 +368,6 @@ int VirtualStudio::webChannelPort() return m_webChannelPort; } -bool VirtualStudio::hasRefreshToken() -{ - return !m_refreshToken.isEmpty(); -} - QString VirtualStudio::versionString() { return QLatin1String(gVersion); @@ -396,6 +451,53 @@ bool VirtualStudio::networkOutage() return m_devicePtr.isNull() ? false : m_devicePtr->getNetworkOutage(); } +int VirtualStudio::getQueueBuffer() const +{ + return m_queueBuffer; +} + +void VirtualStudio::setQueueBuffer(int queueBuffer) +{ + if (m_queueBuffer == queueBuffer) + return; + + m_queueBuffer = queueBuffer; + emit queueBufferChanged(queueBuffer); + if (!m_useStudioQueueBuffer && !m_devicePtr.isNull()) + m_devicePtr->setQueueBuffer(queueBuffer); + + QSettings settings; + settings.beginGroup(QStringLiteral("VirtualStudio")); + settings.setValue(QStringLiteral("QueueBuffer"), m_queueBuffer); + settings.endGroup(); +} + +bool VirtualStudio::useStudioQueueBuffer() +{ + return m_useStudioQueueBuffer; +} + +void VirtualStudio::setUseStudioQueueBuffer(bool b) +{ + if (m_useStudioQueueBuffer == b) + return; + + m_useStudioQueueBuffer = b; + emit useStudioQueueBufferChanged(b); + if (!m_devicePtr.isNull()) { + if (!m_useStudioQueueBuffer) { + m_devicePtr->setQueueBuffer(m_queueBuffer); + } else if (m_currentStudio.id() != "") { + m_devicePtr->setQueueBuffer(m_currentStudio.queueBuffer()); + } + } + + QSettings settings; + settings.beginGroup(QStringLiteral("VirtualStudio")); + settings.setValue(QStringLiteral("UseStudioQueueBuffer"), m_useStudioQueueBuffer); + settings.endGroup(); +} + QJsonObject VirtualStudio::regions() { return m_regions; @@ -495,6 +597,9 @@ void VirtualStudio::setWindowState(QString state) // just to reduce risk of running into a deadlock emit scheduleStudioRefresh(-1, false); } + if (m_windowState != "browse") { + emit closeFeedbackSurveyModal(); + } emit windowStateUpdated(); } @@ -537,7 +642,19 @@ void VirtualStudio::setRefreshInProgress(bool b) void VirtualStudio::collectFeedbackSurvey(QString serverId, int rating, QString message) { QJsonObject feedback; + feedback.insert(QStringLiteral("appVersion"), versionString()); +#if defined(Q_OS_WIN) + feedback.insert(QStringLiteral("platform"), "windows"); +#endif +#if defined(Q_OS_MACOS) + feedback.insert(QStringLiteral("platform"), "macos"); +#endif +#if defined(Q_OS_LINUX) + feedback.insert(QStringLiteral("platform"), "linux"); +#endif + + feedback.insert(QStringLiteral("osVersion"), QSysInfo::prettyProductName()); QString sysInfo = QString("[platform=%1").arg(QSysInfo::prettyProductName()); #ifdef RT_AUDIO QString inputDevice = @@ -560,6 +677,19 @@ void VirtualStudio::collectFeedbackSurvey(QString serverId, int rating, QString feedback.insert(QStringLiteral("message"), message + " " + sysInfo); } + QString deviceIssues = ""; + QString deviceError = m_audioConfigPtr->getDevicesErrorMsg(); + QString deviceWarning = m_audioConfigPtr->getDevicesWarningMsg(); + if (!deviceError.isEmpty()) { + deviceIssues.append(deviceError); + } else if (!deviceWarning.isEmpty()) { + deviceIssues.append(deviceWarning); + } + if (!deviceIssues.isEmpty()) { + feedback.insert(QStringLiteral("deviceIssues"), deviceIssues); + message.append(" (deviceIssues=" + deviceIssues + ")"); + } + QJsonDocument data = QJsonDocument(feedback); m_api->submitServerFeedback(serverId, data.toJson()); return; @@ -845,7 +975,6 @@ void VirtualStudio::logout() m_refreshToken.clear(); m_userMetadata = QJsonObject(); m_userId.clear(); - emit hasRefreshTokenChanged(); // reset window state setWindowState(QStringLiteral("login")); @@ -864,6 +993,9 @@ void VirtualStudio::loadSettings() m_testMode = settings.value(QStringLiteral("TestMode"), false).toBool(); m_showInactive = settings.value(QStringLiteral("ShowInactive"), true).toBool(); m_showSelfHosted = settings.value(QStringLiteral("ShowSelfHosted"), true).toBool(); + m_useStudioQueueBuffer = + settings.value(QStringLiteral("UseStudioQueueBuffer"), true).toBool(); + m_queueBuffer = settings.value(QStringLiteral("QueueBuffer"), 0).toInt(); // use setters to emit signals for these if they change; otherwise, the // user interface will not revert back after cancelling settings changes @@ -897,10 +1029,10 @@ void VirtualStudio::connectToStudio() m_onConnectedScreen = true; - m_studioSocketPtr.reset(new VsWebSocket( - QUrl(QStringLiteral("wss://%1/api/servers/%2?auth_code=%3") - .arg(m_api->getApiHost(), m_currentStudio.id(), m_auth->accessToken())), - m_auth->accessToken(), QString(), QString())); + m_studioSocketPtr.reset( + new VsWebSocket(QUrl(QStringLiteral("wss://%1/api/servers/%2") + .arg(m_api->getApiHost(), m_currentStudio.id())), + m_auth->accessToken(), QString(), QString())); connect(m_studioSocketPtr.get(), &VsWebSocket::textMessageReceived, this, &VirtualStudio::handleWebsocketMessage); connect(m_studioSocketPtr.get(), &VsWebSocket::disconnected, this, @@ -970,18 +1102,16 @@ void VirtualStudio::completeConnection() } #endif - // adjust queueBuffer config setting to map to auto headroom - int queue_buffer = m_audioConfigPtr->getQueueBuffer(); - if (queue_buffer <= 0) { - queue_buffer = -500; - } else { - queue_buffer *= -1; - } + // check if we should use studio or local queueBuffer setting + int queueBuffer = m_queueBuffer; + if (m_useStudioQueueBuffer) + queueBuffer = m_currentStudio.queueBuffer(); + m_devicePtr->setQueueBuffer(queueBuffer); // create a new JackTrip instance JackTrip* jackTrip = m_devicePtr->initJackTrip( useRtAudio, input, output, baseInputChannel, numInputChannels, - baseOutputChannel, numOutputChannels, inputMixMode, buffer_size, queue_buffer, + baseOutputChannel, numOutputChannels, inputMixMode, buffer_size, &m_currentStudio); if (jackTrip == 0) { processError("Could not bind port"); @@ -1091,6 +1221,9 @@ void VirtualStudio::disconnect() // reset network statistics m_networkStats = QJsonObject(); + // force audio sockets to reconnect, since audio has stopped + m_audioConfigPtr->clearAudioSockets(); + if (!m_currentStudio.id().isEmpty()) { emit openFeedbackSurveyModal(m_currentStudio.id()); m_currentStudio.setId(""); @@ -1182,6 +1315,13 @@ void VirtualStudio::handleDeeplinkRequest(const QUrl& link) // otherwise, assume we are on setup screens and can let the normal flow handle it } +void VirtualStudio::handleAudioSocketRequest(QSharedPointer& socket) +{ + QSharedPointer audioSocketPtr(new AudioSocket(socket)); + m_audioConfigPtr->registerAudioSocket(audioSocketPtr); + triggerReconnect(true); +} + void VirtualStudio::exit() { // if multiple close events are received, emit the signalExit to force-quit the app @@ -1218,18 +1358,10 @@ void VirtualStudio::slotAuthSucceeded() } m_api->setApiHost(m_apiHost); - // Get refresh token and userId - m_refreshToken = m_auth->refreshToken(); - m_userId = m_auth->userId(); - emit hasRefreshTokenChanged(); - - QSettings settings; - settings.beginGroup(QStringLiteral("VirtualStudio")); - settings.setValue(QStringLiteral("RefreshToken"), m_refreshToken); - settings.setValue(QStringLiteral("UserId"), m_userId); - settings.endGroup(); - // initialize new VsDevice and wire up signals/slots before registering app + if (!m_devicePtr.isNull()) { + m_devicePtr->disconnect(); + } m_devicePtr.reset(new VsDevice(m_auth, m_api, m_audioConfigPtr)); connect(m_devicePtr.get(), &VsDevice::updateNetworkStats, this, &VirtualStudio::updatedStats); @@ -1256,6 +1388,38 @@ void VirtualStudio::slotAuthSucceeded() getUserMetadata(); // calls refreshStudios(-1, false) } +void VirtualStudio::slotAccessTokenUpdated(QString accessToken) +{ + // set cookie + QWebEngineCookieStore* cookieStore = m_qwebEngineProfile->cookieStore(); + QNetworkCookie authCookie = + QNetworkCookie(QByteArray("auth_code"), accessToken.toUtf8()); + + QUrl url1 = QUrl(QStringLiteral("https://www.jacktrip.com")); + QUrl url2 = QUrl(QStringLiteral("https://app.jacktrip.com")); + QUrl url3 = QUrl(QStringLiteral("http://localhost:3000")); + if (testMode()) { + url1 = QUrl(QStringLiteral("https://next-test.jacktrip.com")); + url2 = QUrl(QStringLiteral("https://test.jacktrip.com")); + } + + cookieStore->setCookie(authCookie, url1); + cookieStore->setCookie(authCookie, url2); + if (testMode()) { + cookieStore->setCookie(authCookie, url3); + } + + // Get refresh token and userId + m_refreshToken = m_auth->refreshToken(); + m_userId = m_auth->userId(); + + QSettings settings; + settings.beginGroup(QStringLiteral("VirtualStudio")); + settings.setValue(QStringLiteral("RefreshToken"), m_refreshToken); + settings.setValue(QStringLiteral("UserId"), m_userId); + settings.endGroup(); +} + void VirtualStudio::connectionFinished() { if (!m_devicePtr.isNull() @@ -1341,6 +1505,7 @@ void VirtualStudio::handleWebsocketMessage(const QString& msg) QString serverStatus = serverState[QStringLiteral("status")].toString(); bool serverEnabled = serverState[QStringLiteral("enabled")].toBool(); QString serverCloudId = serverState[QStringLiteral("cloudId")].toString(); + int queueBuffer = serverState[QStringLiteral("queueBuffer")].toInt(); // server notifications are also transmitted along this websocket, so ignore data if // it contains "message" @@ -1354,6 +1519,7 @@ void VirtualStudio::handleWebsocketMessage(const QString& msg) m_currentStudio.setStatus(serverStatus); m_currentStudio.setEnabled(serverEnabled); m_currentStudio.setCloudId(serverCloudId); + m_currentStudio.setQueueBuffer(queueBuffer); if (!m_jackTripRunning) { if (serverStatus == QLatin1String("Ready") && m_onConnectedScreen) { m_currentStudio.setHost(serverState[QStringLiteral("serverHost")].toString()); @@ -1362,6 +1528,8 @@ void VirtualStudio::handleWebsocketMessage(const QString& msg) serverState[QStringLiteral("sessionId")].toString()); completeConnection(); } + } else if (m_useStudioQueueBuffer && !m_devicePtr.isNull()) { + m_devicePtr->setQueueBuffer(m_currentStudio.queueBuffer()); } emit currentStudioChanged(); @@ -1689,9 +1857,15 @@ VirtualStudio::~VirtualStudio() // close the window m_view.reset(); // stop the audio worker thread before destructing other things - m_audioConfigPtr.reset(); + if (!m_audioConfigPtr.isNull()) { + m_audioConfigPtr->disconnect(); + m_audioConfigPtr.reset(); + } // stop device and corresponding threads - m_devicePtr.reset(); + if (!m_devicePtr.isNull()) { + m_devicePtr->disconnect(); + m_devicePtr.reset(); + } } QApplication* VirtualStudio::createApplication(int& argc, char* argv[]) diff --git a/src/vs/virtualstudio.h b/src/vs/virtualstudio.h index 8861af5..35987ff 100644 --- a/src/vs/virtualstudio.h +++ b/src/vs/virtualstudio.h @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,8 @@ #include #include #include +#include +#include #include #include "../Settings.h" @@ -59,6 +62,8 @@ #include "vsServerInfo.h" class JackTrip; +class QLocalSocket; +class SocketServer; class VsAudio; class VsApi; class VsAuth; @@ -72,7 +77,6 @@ class VirtualStudio : public QObject { Q_OBJECT Q_PROPERTY(int webChannelPort READ webChannelPort NOTIFY webChannelPortChanged) - Q_PROPERTY(bool hasRefreshToken READ hasRefreshToken NOTIFY hasRefreshTokenChanged) Q_PROPERTY(QString versionString READ versionString CONSTANT) Q_PROPERTY(QString buildString READ buildString CONSTANT) Q_PROPERTY(QString copyrightString READ copyrightString CONSTANT) @@ -94,6 +98,10 @@ class VirtualStudio : public QObject Q_PROPERTY(QString connectionState READ connectionState NOTIFY connectionStateChanged) Q_PROPERTY(QJsonObject networkStats READ networkStats NOTIFY networkStatsChanged) Q_PROPERTY(bool networkOutage READ networkOutage NOTIFY updatedNetworkOutage) + Q_PROPERTY(int queueBuffer READ getQueueBuffer WRITE setQueueBuffer NOTIFY + queueBufferChanged) + Q_PROPERTY(bool useStudioQueueBuffer READ useStudioQueueBuffer WRITE + setUseStudioQueueBuffer NOTIFY useStudioQueueBufferChanged) Q_PROPERTY(QString updateChannel READ updateChannel WRITE setUpdateChannel NOTIFY updateChannelChanged) @@ -130,7 +138,6 @@ class VirtualStudio : public QObject void raiseToTop(); int webChannelPort(); - bool hasRefreshToken(); QString versionString(); QString buildString(); QString copyrightString(); @@ -168,6 +175,10 @@ class VirtualStudio : public QObject bool psiBuild(); QString failedMessage(); bool networkOutage(); + int getQueueBuffer() const; + void setQueueBuffer(int queueBuffer); + bool useStudioQueueBuffer(); + void setUseStudioQueueBuffer(bool b); bool backendAvailable(); QString windowState(); QString apiHost(); @@ -198,6 +209,7 @@ class VirtualStudio : public QObject void showAbout(); void openLink(const QString& url); void handleDeeplinkRequest(const QUrl& url); + void handleAudioSocketRequest(QSharedPointer& socket); void udpWaitingTooLong(); void setWindowState(QString state); void joinStudio(); @@ -210,7 +222,6 @@ class VirtualStudio : public QObject void disconnected(); void refreshFinished(int index); void webChannelPortChanged(int webChannelPort); - void hasRefreshTokenChanged(); void logoSectionChanged(); void connectedErrorMsgChanged(); void serverModelChanged(); @@ -233,6 +244,8 @@ class VirtualStudio : public QObject void failedMessageChanged(); void studioToJoinChanged(); void updatedNetworkOutage(bool outage); + void queueBufferChanged(int queueBuffer); + void useStudioQueueBufferChanged(bool b); void windowStateUpdated(); void isExitingChanged(); void scheduleStudioRefresh(int index, bool signalRefresh); @@ -240,10 +253,12 @@ class VirtualStudio : public QObject void apiHostChanged(); void feedbackDetected(); void openFeedbackSurveyModal(QString serverId); + void closeFeedbackSurveyModal(); void openAboutWindow(); private slots: void slotAuthSucceeded(); + void slotAccessTokenUpdated(QString accessToken); void receivedConnectionFromPeer(); void handleWebsocketMessage(const QString& msg); void restartStudioSocket(); @@ -274,6 +289,8 @@ class VirtualStudio : public QObject UserInterface& m_interface; VsServerInfo m_currentStudio; QNetworkAccessManager* m_networkAccessManagerPtr; + QWebEngineProfile* m_qwebEngineProfile; + QSharedPointer m_socketServerPtr; QScopedPointer m_view; QSharedPointer m_deepLinkPtr; QSharedPointer m_auth; @@ -314,6 +331,8 @@ class VirtualStudio : public QObject bool m_collapseDeviceControls = false; bool m_testMode = false; bool m_authenticated = false; + bool m_useStudioQueueBuffer = true; + int m_queueBuffer = 0; float m_fontScale = 1; float m_uiScale = 1; uint32_t m_webChannelPort = 1; diff --git a/src/vs/vs.qrc b/src/vs/vs.qrc index 0b847fe..945ce72 100644 --- a/src/vs/vs.qrc +++ b/src/vs/vs.qrc @@ -50,6 +50,7 @@ language.svg micoff.svg help.svg + balance.svg quiet.svg loud.svg refresh.svg diff --git a/src/vs/vsApi.cpp b/src/vs/vsApi.cpp index 513390b..74fdaff 100644 --- a/src/vs/vsApi.cpp +++ b/src/vs/vsApi.cpp @@ -45,7 +45,17 @@ VsApi::VsApi(QNetworkAccessManager* networkAccessManager) QNetworkReply* VsApi::getAuth0UserInfo() { - return get(QUrl("https://auth.jacktrip.org/userinfo")); + // this function operates a little differently because it is made to + // Auth0 directly rather than our own API server, which requires a specific + // an Authorization header rather than a cookie + QUrl url = QUrl("https://auth.jacktrip.org/userinfo"); + QNetworkRequest request = QNetworkRequest(url); + request.setRawHeader(QByteArray("User-Agent"), + QString("JackTrip/%1 (Qt)").arg(gVersion).toUtf8()); + request.setRawHeader(QByteArray("Authorization"), + QString("Bearer %1").arg(m_accessToken).toUtf8()); + QNetworkReply* reply = m_networkAccessManager->get(request); + return reply; } QNetworkReply* VsApi::getUser(const QString& userId) @@ -115,9 +125,12 @@ QNetworkReply* VsApi::get(const QUrl& url) QNetworkRequest request = QNetworkRequest(url); request.setRawHeader(QByteArray("User-Agent"), QString("JackTrip/%1 (Qt)").arg(gVersion).toUtf8()); - request.setRawHeader(QByteArray("Authorization"), - QString("Bearer %1").arg(m_accessToken).toUtf8()); + QList cookies; + QNetworkCookie authCookie = + QNetworkCookie(QByteArray("auth_code"), m_accessToken.toUtf8()); + cookies.append(authCookie); + request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); QNetworkReply* reply = m_networkAccessManager->get(request); return reply; } @@ -127,11 +140,14 @@ QNetworkReply* VsApi::post(const QUrl& url, const QByteArray& data) QNetworkRequest request = QNetworkRequest(url); request.setRawHeader(QByteArray("User-Agent"), QString("JackTrip/%1 (Qt)").arg(gVersion).toUtf8()); - request.setRawHeader(QByteArray("Authorization"), - QString("Bearer %1").arg(m_accessToken).toUtf8()); request.setRawHeader(QByteArray("Content-Type"), QString("application/json").toUtf8()); + QList cookies; + QNetworkCookie authCookie = + QNetworkCookie(QByteArray("auth_code"), m_accessToken.toUtf8()); + cookies.append(authCookie); + request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); QNetworkReply* reply = m_networkAccessManager->post(request, data); return reply; } @@ -141,10 +157,14 @@ QNetworkReply* VsApi::put(const QUrl& url, const QByteArray& data) QNetworkRequest request = QNetworkRequest(url); request.setRawHeader(QByteArray("User-Agent"), QString("JackTrip/%1 (Qt)").arg(gVersion).toUtf8()); - request.setRawHeader(QByteArray("Authorization"), - QString("Bearer %1").arg(m_accessToken).toUtf8()); request.setRawHeader(QByteArray("Content-Type"), QString("application/json").toUtf8()); + + QList cookies; + QNetworkCookie authCookie = + QNetworkCookie(QByteArray("auth_code"), m_accessToken.toUtf8()); + cookies.append(authCookie); + request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); QNetworkReply* reply = m_networkAccessManager->put(request, data); return reply; } @@ -154,9 +174,12 @@ QNetworkReply* VsApi::deleteResource(const QUrl& url) QNetworkRequest request = QNetworkRequest(url); request.setRawHeader(QByteArray("User-Agent"), QString("JackTrip/%1 (Qt)").arg(gVersion).toUtf8()); - request.setRawHeader(QByteArray("Authorization"), - QString("Bearer %1").arg(m_accessToken).toUtf8()); + QList cookies; + QNetworkCookie authCookie = + QNetworkCookie(QByteArray("auth_code"), m_accessToken.toUtf8()); + cookies.append(authCookie); + request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); QNetworkReply* reply = m_networkAccessManager->deleteResource(request); return reply; } \ No newline at end of file diff --git a/src/vs/vsApi.h b/src/vs/vsApi.h index 9b1d713..d66cab8 100644 --- a/src/vs/vsApi.h +++ b/src/vs/vsApi.h @@ -39,8 +39,10 @@ #include #include +#include #include #include +#include #include #include #include diff --git a/src/vs/vsAudio.cpp b/src/vs/vsAudio.cpp index 6964c77..d244238 100644 --- a/src/vs/vsAudio.cpp +++ b/src/vs/vsAudio.cpp @@ -60,6 +60,7 @@ #include "../Analyzer.h" #endif +#include "../AudioSocket.h" #include "../JackTrip.h" #include "../Meter.h" #include "../Monitor.h" @@ -96,11 +97,6 @@ VsAudio::VsAudio(QObject* parent) , m_inputMixModeComboModel(QJsonArray::fromStringList(QStringList(QLatin1String("")))) , m_audioWorkerPtr(new VsAudioWorker(this)) , m_workerThreadPtr(nullptr) - , m_inputMeterPluginPtr(nullptr) - , m_outputMeterPluginPtr(nullptr) - , m_inputVolumePluginPtr(nullptr) - , m_outputVolumePluginPtr(nullptr) - , m_monitorPluginPtr(nullptr) , mHasErrors(false) { loadSettings(); @@ -176,6 +172,7 @@ VsAudio::VsAudio(QObject* parent) #else m_permissionsPtr.reset(new VsPermissions()); #endif + qDebug() << "Microphone permissions: " << m_permissionsPtr->micPermission(); } VsAudio::~VsAudio() @@ -279,16 +276,6 @@ void VsAudio::setBufferSize(int bufSize) emit bufferSizeChanged(); } -void VsAudio::setQueueBuffer(int queueBuffer) -{ - if (m_queueBuffer == queueBuffer) - return; - if (queueBuffer < 0) - queueBuffer = 0; - m_queueBuffer = queueBuffer; - emit queueBufferChanged(); -} - void VsAudio::setNumInputChannels(int numChannels) { if (numChannels == m_numInputChannels) @@ -442,6 +429,7 @@ void VsAudio::stopAudio(bool block) if (!getAudioReady()) return; emit signalStopAudio(); + clearAudioSockets(); // force audio sockets to reconnect if (!block) return; WaitForSignal(this, &VsAudio::signalAudioIsNotReady); @@ -542,7 +530,6 @@ void VsAudio::loadSettings() } setBufferSize(settings.value(QStringLiteral("BufferSize"), 128).toInt()); - setQueueBuffer(settings.value(QStringLiteral("QueueBuffer"), 0).toInt()); setFeedbackDetectionEnabled( settings.value(QStringLiteral("FeedbackDetectionEnabled"), true).toBool()); settings.endGroup(); @@ -565,7 +552,6 @@ void VsAudio::saveSettings() settings.setValue(QStringLiteral("BaseOutputChannel"), m_baseOutputChannel); settings.setValue(QStringLiteral("NumOutputChannels"), m_numOutputChannels); settings.setValue(QStringLiteral("BufferSize"), m_audioBufferSize); - settings.setValue(QStringLiteral("QueueBuffer"), m_queueBuffer); settings.setValue(QStringLiteral("FeedbackDetectionEnabled"), m_feedbackDetectionEnabled); settings.endGroup(); @@ -666,74 +652,106 @@ void VsAudio::appendProcessPlugins(AudioInterface& audioInterface, bool forJackT setInputMuted(false); // Create plugins - m_inputMeterPluginPtr = new Meter(numInputChannels); - m_outputMeterPluginPtr = new Meter(numOutputChannels); - m_inputVolumePluginPtr = new Volume(numInputChannels); - m_outputVolumePluginPtr = new Volume(numOutputChannels); + Meter* inputMeterPluginPtr = new Meter(numInputChannels); + Meter* outputMeterPluginPtr = new Meter(numOutputChannels); + Volume* inputVolumePluginPtr = new Volume(numInputChannels); + Volume* outputVolumePluginPtr = new Volume(numOutputChannels); + QSharedPointer inputVolumePluginSharedPtr(inputVolumePluginPtr); + QSharedPointer outputVolumePluginSharedPtr(outputVolumePluginPtr); + QSharedPointer inputMeterPluginSharedPtr(inputMeterPluginPtr); + QSharedPointer outputMeterPluginSharedPtr(outputMeterPluginPtr); // initialize input and output volumes - m_outputVolumePluginPtr->volumeUpdated(m_outMultiplier); - m_inputVolumePluginPtr->volumeUpdated(m_inMultiplier); - m_inputVolumePluginPtr->muteUpdated(m_inMuted); + outputVolumePluginPtr->volumeUpdated(m_outMultiplier); + inputVolumePluginPtr->volumeUpdated(m_inMultiplier); + inputVolumePluginPtr->muteUpdated(m_inMuted); // Connect plugins for communication with UI - connect(m_inputMeterPluginPtr, &Meter::onComputedVolumeMeasurements, this, + connect(inputMeterPluginPtr, &Meter::onComputedVolumeMeasurements, this, &VsAudio::updatedInputVuMeasurements); - connect(m_outputMeterPluginPtr, &Meter::onComputedVolumeMeasurements, this, + connect(outputMeterPluginPtr, &Meter::onComputedVolumeMeasurements, this, &VsAudio::updatedOutputVuMeasurements); - connect(this, &VsAudio::updatedInputVolume, m_inputVolumePluginPtr, + connect(this, &VsAudio::updatedInputVolume, inputVolumePluginPtr, &Volume::volumeUpdated); - connect(this, &VsAudio::updatedOutputVolume, m_outputVolumePluginPtr, + connect(this, &VsAudio::updatedOutputVolume, outputVolumePluginPtr, &Volume::volumeUpdated); - connect(this, &VsAudio::updatedInputMuted, m_inputVolumePluginPtr, + connect(this, &VsAudio::updatedInputMuted, inputVolumePluginPtr, &Volume::muteUpdated); // Note that plugin ownership is passed to the JackTrip class // In particular, the AudioInterface that it uses to connect - audioInterface.appendProcessPluginToNetwork(m_inputVolumePluginPtr); - audioInterface.appendProcessPluginToNetwork(m_inputMeterPluginPtr); + audioInterface.appendProcessPluginToNetwork(inputVolumePluginSharedPtr); + audioInterface.appendProcessPluginToNetwork(inputMeterPluginSharedPtr); if (forJackTrip) { // plugins for stream going to audio interface - audioInterface.appendProcessPluginFromNetwork(m_outputVolumePluginPtr); + audioInterface.appendProcessPluginFromNetwork(outputVolumePluginSharedPtr); // Setup monitor // Note: Constructor determines how many internal monitor buffers to allocate - m_monitorPluginPtr = new Monitor(std::max(numInputChannels, numOutputChannels)); - m_monitorPluginPtr->volumeUpdated(m_monMultiplier); - audioInterface.appendProcessPluginToMonitor(m_monitorPluginPtr); - connect(this, &VsAudio::updatedMonitorVolume, m_monitorPluginPtr, + Monitor* monitorPluginPtr = + new Monitor(std::max(numInputChannels, numOutputChannels)); + monitorPluginPtr->volumeUpdated(m_monMultiplier); + connect(this, &VsAudio::updatedMonitorVolume, monitorPluginPtr, &Monitor::volumeUpdated); + QSharedPointer monitorPluginSharedPtr(monitorPluginPtr); + audioInterface.appendProcessPluginToMonitor(monitorPluginSharedPtr); #ifndef NO_FEEDBACK // Setup output analyzer if (m_feedbackDetectionEnabled) { - m_outputAnalyzerPluginPtr = new Analyzer(numOutputChannels); - m_outputAnalyzerPluginPtr->setIsMonitoringAnalyzer(true); - audioInterface.appendProcessPluginToMonitor(m_outputAnalyzerPluginPtr); - connect(m_outputAnalyzerPluginPtr, &Analyzer::signalFeedbackDetected, this, + Analyzer* outputAnalyzerPluginPtr = new Analyzer(numOutputChannels); + outputAnalyzerPluginPtr->setIsMonitoringAnalyzer(true); + connect(outputAnalyzerPluginPtr, &Analyzer::signalFeedbackDetected, this, &VsAudio::detectedFeedbackLoop); + QSharedPointer outputAnalyzerPluginSharedPtr( + outputAnalyzerPluginPtr); + audioInterface.appendProcessPluginToMonitor(outputAnalyzerPluginSharedPtr); } #endif // Setup output meter // Note: Add this to monitor process to include self-volume - m_outputMeterPluginPtr->setIsMonitoringMeter(true); - audioInterface.appendProcessPluginToMonitor(m_outputMeterPluginPtr); + outputMeterPluginPtr->setIsMonitoringMeter(true); + audioInterface.appendProcessPluginToMonitor(outputMeterPluginSharedPtr); } else { // tone plugin is used to test audio output Tone* outputTonePluginPtr = new Tone(getNumOutputChannels()); connect(this, &VsAudio::signalPlayOutputAudio, outputTonePluginPtr, &Tone::triggerPlayback); - audioInterface.appendProcessPluginFromNetwork(outputTonePluginPtr); + QSharedPointer outputTonePluginSharedPtr(outputTonePluginPtr); + audioInterface.appendProcessPluginFromNetwork(outputTonePluginSharedPtr); // plugins for stream going to audio interface - audioInterface.appendProcessPluginFromNetwork(m_outputVolumePluginPtr); - audioInterface.appendProcessPluginFromNetwork(m_outputMeterPluginPtr); + audioInterface.appendProcessPluginFromNetwork(outputVolumePluginSharedPtr); + audioInterface.appendProcessPluginFromNetwork(outputMeterPluginSharedPtr); + } + + // clear out any audio sockets that have disconnected + QMutexLocker locker(&m_audioSocketMutex); + for (auto i = m_audioSockets.begin(); i != m_audioSockets.end();) { + if ((*i)->isConnected()) { + audioInterface.appendAudioSocket(*i); + ++i; + } else { + i = m_audioSockets.erase(i); + } } } +void VsAudio::registerAudioSocket(QSharedPointer& s) +{ + QMutexLocker locker(&m_audioSocketMutex); + m_audioSockets.push_back(s); +} + +void VsAudio::clearAudioSockets() +{ + QMutexLocker locker(&m_audioSocketMutex); + m_audioSockets.clear(); +} + void VsAudio::setDeviceModels(QJsonArray inputComboModel, QJsonArray outputComboModel) { m_inputComboModel = inputComboModel; diff --git a/src/vs/vsAudio.h b/src/vs/vsAudio.h index c75b9fc..3521d51 100644 --- a/src/vs/vsAudio.h +++ b/src/vs/vsAudio.h @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -54,6 +55,7 @@ #endif class Analyzer; +class AudioSocket; class JackTrip; class Meter; class Monitor; @@ -81,8 +83,6 @@ class VsAudio : public QObject int sampleRate READ getSampleRate WRITE setSampleRate NOTIFY sampleRateChanged) Q_PROPERTY( int bufferSize READ getBufferSize WRITE setBufferSize NOTIFY bufferSizeChanged) - Q_PROPERTY(int queueBuffer READ getQueueBuffer WRITE setQueueBuffer NOTIFY - queueBufferChanged) Q_PROPERTY(int numInputChannels READ getNumInputChannels WRITE setNumInputChannels NOTIFY numInputChannelsChanged) Q_PROPERTY(int numOutputChannels READ getNumOutputChannels WRITE setNumOutputChannels @@ -168,7 +168,6 @@ class VsAudio : public QObject } int getSampleRate() const { return m_audioSampleRate; } int getBufferSize() const { return m_audioBufferSize; } - int getQueueBuffer() const { return m_queueBuffer; } int getNumInputChannels() const { return getUseRtAudio() ? m_numInputChannels : 2; } int getNumOutputChannels() const { return getUseRtAudio() ? m_numOutputChannels : 2; } int getBaseInputChannel() const { return getUseRtAudio() ? m_baseInputChannel : 0; } @@ -208,6 +207,11 @@ class VsAudio : public QObject const QString& getDevicesWarningHelpUrl() const { return m_devicesWarningHelpUrl; } const QString& getDevicesErrorHelpUrl() const { return m_devicesErrorHelpUrl; } bool getHighLatencyFlag() const { return m_highLatencyFlag; } + + // called by local socket server to process audio requests + void registerAudioSocket(QSharedPointer& s); + void clearAudioSockets(); + public slots: // setters for state shared with QML @@ -215,7 +219,6 @@ class VsAudio : public QObject void setAudioBackend(const QString& backend); void setSampleRate(int sampleRate); void setBufferSize(int bufSize); - void setQueueBuffer(int queueBuffer); void setNumInputChannels(int numChannels); void setNumOutputChannels(int numChannels); void setBaseInputChannel(int baseChannel); @@ -252,7 +255,6 @@ class VsAudio : public QObject void audioBackendChanged(bool useRtAudio); void sampleRateChanged(); void bufferSizeChanged(); - void queueBufferChanged(); void numInputChannelsChanged(int numChannels); void numOutputChannelsChanged(int numChannels); void baseInputChannelChanged(int baseChannel); @@ -326,7 +328,6 @@ class VsAudio : public QObject int m_audioSampleRate = gDefaultSampleRate; int m_audioBufferSize = gDefaultBufferSizeInSamples; ///< Audio buffer size to process on each callback - int m_queueBuffer = 0; int m_numInputChannels = gDefaultNumInChannels; int m_numOutputChannels = gDefaultNumOutChannels; int m_baseInputChannel = 0; @@ -357,20 +358,13 @@ class VsAudio : public QObject // other state not shared with QML QSharedPointer m_permissionsPtr; QScopedPointer m_audioWorkerPtr; + QVector> m_audioSockets; + QMutex m_audioSocketMutex; QThread* m_workerThreadPtr; QTimer m_inputClipTimer; QTimer m_outputClipTimer; - Meter* m_inputMeterPluginPtr; - Meter* m_outputMeterPluginPtr; - Volume* m_inputVolumePluginPtr; - Volume* m_outputVolumePluginPtr; - Monitor* m_monitorPluginPtr; bool mHasErrors; ///< true if one or more error callbacks have been triggered -#ifndef NO_FEEDBACK - Analyzer* m_outputAnalyzerPluginPtr; -#endif - QStringList m_audioBackendComboModel = {"JACK", "RtAudio"}; QStringList m_bufferSizeComboModel = {"16", "32", "64", "128", "256", "512", "1024"}; diff --git a/src/vs/vsAuth.cpp b/src/vs/vsAuth.cpp index 25d8427..0b558a5 100644 --- a/src/vs/vsAuth.cpp +++ b/src/vs/vsAuth.cpp @@ -41,6 +41,12 @@ VsAuth::VsAuth(QNetworkAccessManager* networkAccessManager, VsApi* api) : m_clientId(AUTH_CLIENT_ID), m_authorizationServerHost(AUTH_SERVER_HOST) { + qint64 refreshIntervalInMs = + 1000 * 60 * 60 * 3; // automatic access token refresh every 3 hours + m_refreshTimer.reset(new QTimer()); + m_refreshTimer->setInterval(refreshIntervalInMs); + m_refreshTimer->setSingleShot(false); + m_networkAccessManager = networkAccessManager; m_api = api; m_deviceCodeFlow.reset(new VsDeviceCodeFlow(networkAccessManager)); @@ -53,6 +59,7 @@ VsAuth::VsAuth(QNetworkAccessManager* networkAccessManager, VsApi* api) &VsAuth::codeFlowCompleted); connect(m_deviceCodeFlow.data(), &VsDeviceCodeFlow::deviceCodeFlowTimedOut, this, &VsAuth::codeExpired); + connect(m_refreshTimer.data(), &QTimer::timeout, this, &VsAuth::refreshTimerTimedOut); m_verificationUrl = QStringLiteral("https://auth.jacktrip.org/activate"); } @@ -190,6 +197,13 @@ void VsAuth::codeExpired() emit deviceCodeExpired(); } +void VsAuth::refreshTimerTimedOut() +{ + if (m_refreshToken != "") { + refreshAccessToken(m_refreshToken); + } +} + void VsAuth::handleRefreshSucceeded(QString accessToken) { qDebug() << "Successfully refreshed access token"; @@ -198,11 +212,21 @@ void VsAuth::handleRefreshSucceeded(QString accessToken) m_authenticationStage = QStringLiteral("success"); m_errorMessage = QStringLiteral(""); m_attemptingRefreshToken = false; + m_accessTokenTimestamp = QDateTime::currentDateTime(); + + m_refreshTimer->start(); emit updatedAuthenticationStage(m_authenticationStage); emit updatedErrorMessage(m_errorMessage); emit updatedVerificationCode(m_verificationCode); emit updatedAttemptingRefreshToken(m_attemptingRefreshToken); + emit updatedAccessToken(m_accessToken); + emit updatedAccessTokenTimestamp(m_accessTokenTimestamp); +} + +void VsAuth::handleRefreshFailed() +{ + m_refreshTimer->stop(); } void VsAuth::handleAuthSucceeded(QString userId, QString accessToken) @@ -225,6 +249,9 @@ void VsAuth::handleAuthSucceeded(QString userId, QString accessToken) m_errorMessage = QStringLiteral(""); m_attemptingRefreshToken = false; m_isAuthenticated = true; + m_accessTokenTimestamp = QDateTime::currentDateTime(); + + m_refreshTimer->start(); emit updatedUserId(m_userId); emit updatedAuthenticationStage(m_authenticationStage); @@ -233,6 +260,8 @@ void VsAuth::handleAuthSucceeded(QString userId, QString accessToken) emit updatedIsAuthenticated(m_isAuthenticated); emit updatedAttemptingRefreshToken(m_attemptingRefreshToken); emit updatedAuthenticationMethod(m_authenticationMethod); + emit updatedAccessToken(m_accessToken); + emit updatedAccessTokenTimestamp(m_accessTokenTimestamp); // notify UI and virtual studio class of success emit authSucceeded(); @@ -253,6 +282,7 @@ void VsAuth::handleAuthFailed(QString errorMessage) m_authenticationMethod = QStringLiteral(""); m_attemptingRefreshToken = false; m_isAuthenticated = false; + m_accessTokenTimestamp = QDateTime::fromMSecsSinceEpoch(0); emit updatedUserId(m_userId); emit updatedAuthenticationStage(m_authenticationStage); @@ -261,6 +291,8 @@ void VsAuth::handleAuthFailed(QString errorMessage) emit updatedIsAuthenticated(m_isAuthenticated); emit updatedAttemptingRefreshToken(m_attemptingRefreshToken); emit updatedAuthenticationMethod(m_authenticationMethod); + emit updatedAccessToken(m_accessToken); + emit updatedAccessTokenTimestamp(m_accessTokenTimestamp); // notify UI and virtual studio class of failure emit authFailed(); @@ -271,18 +303,21 @@ void VsAuth::cancelAuthenticationFlow() qDebug() << "Canceling authentication flow"; m_deviceCodeFlow->cancelCodeFlow(); - m_userId = QStringLiteral(""); - m_verificationCode = QStringLiteral(""); - m_accessToken = QStringLiteral(""); - m_authenticationStage = QStringLiteral("unauthenticated"); - m_errorMessage = QStringLiteral("cancelled"); - m_isAuthenticated = false; + m_userId = QStringLiteral(""); + m_verificationCode = QStringLiteral(""); + m_accessToken = QStringLiteral(""); + m_accessTokenTimestamp = QDateTime::fromMSecsSinceEpoch(0); + m_authenticationStage = QStringLiteral("unauthenticated"); + m_errorMessage = QStringLiteral("cancelled"); + m_isAuthenticated = false; emit updatedUserId(m_userId); emit updatedAuthenticationStage(m_authenticationStage); emit updatedErrorMessage(m_errorMessage); emit updatedVerificationCode(m_verificationCode); emit updatedIsAuthenticated(m_isAuthenticated); + emit updatedAccessToken(m_accessToken); + emit updatedAccessTokenTimestamp(m_accessTokenTimestamp); } void VsAuth::logout() @@ -292,13 +327,18 @@ void VsAuth::logout() } qDebug() << "Logging out"; + // stop timer to refresh token + m_refreshTimer->stop(); + // reset auth state - m_userId = QStringLiteral(""); - m_verificationCode = QStringLiteral(""); - m_accessToken = QStringLiteral(""); - m_authenticationStage = QStringLiteral("unauthenticated"); - m_errorMessage = QStringLiteral(""); - m_isAuthenticated = false; + m_userId = QStringLiteral(""); + m_verificationCode = QStringLiteral(""); + m_accessToken = QStringLiteral(""); + m_refreshToken = QStringLiteral(""); + m_authenticationStage = QStringLiteral("unauthenticated"); + m_errorMessage = QStringLiteral(""); + m_isAuthenticated = false; + m_accessTokenTimestamp = QDateTime::fromMSecsSinceEpoch(0); emit updatedUserId(m_userId); emit updatedAuthenticationStage(m_authenticationStage); diff --git a/src/vs/vsAuth.h b/src/vs/vsAuth.h index e79116a..e075478 100644 --- a/src/vs/vsAuth.h +++ b/src/vs/vsAuth.h @@ -37,10 +37,12 @@ #ifndef VSAUTH_H #define VSAUTH_H +#include #include #include #include #include +#include #include #include "vsApi.h" @@ -86,6 +88,7 @@ class VsAuth : public QObject QString refreshToken() { return m_refreshToken; }; QString authenticationMethod() { return m_authenticationMethod; } bool attemptingRefreshToken() { return m_attemptingRefreshToken; } + QDateTime accessTokenTimestamp() { return m_accessTokenTimestamp; } signals: void updatedAuthenticationStage(QString authenticationStage); @@ -96,6 +99,8 @@ class VsAuth : public QObject void updatedUserId(QString userId); void updatedAuthenticationMethod(QString grant); void updatedAttemptingRefreshToken(bool attemptingRefreshToken); + void updatedAccessToken(QString accessToken); + void updatedAccessTokenTimestamp(QDateTime accessTokenTimestamp); void authSucceeded(); void authFailed(); void refreshTokenFailed(); @@ -104,11 +109,13 @@ class VsAuth : public QObject private slots: void handleRefreshSucceeded(QString accessToken); + void handleRefreshFailed(); void handleAuthSucceeded(QString userId, QString accessToken); void handleAuthFailed(QString errorMessage); void initializedCodeFlow(QString code, QString verificationUrl); void codeFlowCompleted(QString accessToken, QString refreshToken); void codeExpired(); + void refreshTimerTimedOut(); private: void fetchUserInfo(QString accessToken); @@ -127,10 +134,12 @@ class VsAuth : public QObject QString m_userId; QString m_accessToken; QString m_refreshToken; + QDateTime m_accessTokenTimestamp = QDateTime::fromMSecsSinceEpoch(0); QNetworkAccessManager* m_networkAccessManager; VsApi* m_api; QScopedPointer m_deviceCodeFlow; + QScopedPointer m_refreshTimer; }; #endif \ No newline at end of file diff --git a/src/vs/vsDeeplink.cpp b/src/vs/vsDeeplink.cpp index a602aba..f1448a4 100644 --- a/src/vs/vsDeeplink.cpp +++ b/src/vs/vsDeeplink.cpp @@ -29,9 +29,9 @@ //***************************************************************** /** - * \file vsDeeplink.cpp - * \author Aaron Wyatt, based on code by Matt Horton - * \date February 2023 + * \file VsDeeplink.cpp + * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton + * \date December 2024 */ #include "vsDeeplink.h" @@ -41,14 +41,14 @@ #include #include #include +#include #include #include #include -VsDeeplink::VsDeeplink(const QString& deeplink) : m_deeplink(deeplink) +VsDeeplink::VsDeeplink() { setUrlScheme(); - checkForInstance(); QDesktopServices::setUrlHandler(QStringLiteral("jacktrip"), this, "handleUrl"); } @@ -57,140 +57,30 @@ VsDeeplink::~VsDeeplink() QDesktopServices::unsetUrlHandler(QStringLiteral("jacktrip")); } -bool VsDeeplink::waitForReady() -{ - while (!m_isReady) { - QTimer timer; - timer.setTimerType(Qt::CoarseTimer); - timer.setSingleShot(true); - - QEventLoop loop; - QObject::connect(this, &VsDeeplink::signalIsReady, &loop, &QEventLoop::quit); - QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); - timer.start(100); // wait for 100ms - loop.exec(); - } - return m_readyToExit; -} - -void VsDeeplink::readyForSignals() -{ - m_readyForSignals = true; - if (!m_deeplink.isEmpty()) { - emit signalDeeplink(m_deeplink); - m_deeplink.clear(); - } -} - void VsDeeplink::handleUrl(const QUrl& url) { - if (m_readyForSignals) { - emit signalDeeplink(url); - } else { - m_deeplink = url; - } -} - -void VsDeeplink::checkForInstance() -{ - // Create socket - m_instanceCheckSocket.reset(new QLocalSocket(this)); - QObject::connect(m_instanceCheckSocket.data(), &QLocalSocket::connected, this, - &VsDeeplink::connectionReceived, Qt::QueuedConnection); - // Create instanceServer to prevent new instances from being created - void (QLocalSocket::*errorFunc)(QLocalSocket::LocalSocketError); -#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0)) - errorFunc = &QLocalSocket::error; -#else - errorFunc = &QLocalSocket::errorOccurred; -#endif - QObject::connect(m_instanceCheckSocket.data(), errorFunc, this, - &VsDeeplink::connectionFailed); - // Check for existing instance - m_instanceCheckSocket->connectToServer("jacktripExists"); + emit signalVsDeeplink(url); } -void VsDeeplink::connectionReceived() +void VsDeeplink::handleVsDeeplinkRequest(QSharedPointer& socket) { - // another jacktrip instance is running - if (!m_deeplink.isEmpty()) { - // pass deeplink to existing instance before quitting - QString deeplinkStr = m_deeplink.toString(); - QByteArray baDeeplink = deeplinkStr.toLocal8Bit(); - qint64 writeBytes = m_instanceCheckSocket->write(baDeeplink); - if (writeBytes < 0) { - qDebug() << "sending deeplink failed"; - } else { - qDebug() << "Sent deeplink request to remote instance"; - } - - // make sure it isn't processed again - m_deeplink.clear(); - - // End process if another instance exists - m_readyToExit = true; + if (!socket->waitForReadyRead() && socket->bytesAvailable() <= 0) { + qDebug() << "VsDeeplink socket: not ready and no bytes available: " + << socket->errorString(); + socket->close(); + return; } - m_instanceCheckSocket->waitForBytesWritten(); - m_instanceCheckSocket->disconnectFromServer(); // remove next - - // let main thread know we are finished - m_isReady = true; - emit signalIsReady(); -} - -void VsDeeplink::connectionFailed(QLocalSocket::LocalSocketError socketError) -{ - switch (socketError) { - case QLocalSocket::ServerNotFoundError: - case QLocalSocket::SocketTimeoutError: - case QLocalSocket::ConnectionRefusedError: - // no other jacktrip instance is running, so we will take over handling deep links - qDebug() << "Listening for deep link requests"; - m_instanceServer.reset(new QLocalServer(this)); - m_instanceServer->setSocketOptions(QLocalServer::WorldAccessOption); - m_instanceServer->listen("jacktripExists"); - QObject::connect(m_instanceServer.data(), &QLocalServer::newConnection, this, - &VsDeeplink::handleDeeplinkRequest, Qt::QueuedConnection); - break; - case QLocalSocket::PeerClosedError: - break; - default: - qDebug() << m_instanceCheckSocket->errorString(); + if (socket->bytesAvailable() < (int)sizeof(quint16)) { + qDebug() << "VsDeeplink socket: ready but no bytes available"; + socket->close(); + return; } - // let main thread know we are finished - m_isReady = true; - emit signalIsReady(); -} - -void VsDeeplink::handleDeeplinkRequest() -{ - while (m_instanceServer->hasPendingConnections()) { - // Receive URL from 2nd instance - QLocalSocket* connectedSocket = m_instanceServer->nextPendingConnection(); - - if (connectedSocket == nullptr || !connectedSocket->waitForConnected()) { - qDebug() << "Deeplink socket: never received connection"; - return; - } - - if (!connectedSocket->waitForReadyRead() - && connectedSocket->bytesAvailable() <= 0) { - qDebug() << "Deeplink socket: not ready and no bytes available: " - << connectedSocket->errorString(); - return; - } - - if (connectedSocket->bytesAvailable() < (int)sizeof(quint16)) { - qDebug() << "Deeplink socket: ready but no bytes available"; - break; - } - - QByteArray in(connectedSocket->readAll()); - QString urlString(in); - handleUrl(urlString); - } + QByteArray in(socket->readAll()); + socket->close(); + QString urlString(in); + handleUrl(urlString); } void VsDeeplink::setUrlScheme() diff --git a/src/vs/vsDeeplink.h b/src/vs/vsDeeplink.h index 464073b..faa0192 100644 --- a/src/vs/vsDeeplink.h +++ b/src/vs/vsDeeplink.h @@ -29,84 +29,47 @@ //***************************************************************** /** - * \file vsDeeplink.h + * \file VsDeeplink.h * \author Mike Dickey, based on code by Aaron Wyatt and Matt Horton - * \date August 2023 + * \date December 2024 */ #ifndef __VSDEEPLINK_H__ #define __VSDEEPLINK_H__ -#include -#include -#include +#include +#include #include #include +class QLocalSocket; + class VsDeeplink : public QObject { Q_OBJECT public: // construct with an instance of the application, to parse command line args - VsDeeplink(const QString& deeplink); + VsDeeplink(); // virtual destructor since it inherits from QObject // this is used to unregister url handler virtual ~VsDeeplink(); - // blocks main thread until local socket server is ready - // returns true if a deeplink was handled and we should exit now - bool waitForReady(); - - // used to let us know VirtualStudio is ready to process deeplink signals - void readyForSignals(); - - // returns deeplink extracted from command line, if any - const QUrl& getDeeplink() const { return m_deeplink; } - - signals: - - // signalIsReady is emitted when the local socket server is ready - void signalIsReady(); - - // signalDeeplink is emitted when we want the local instance to process a deeplink - void signalDeeplink(const QUrl& url); - - private slots: - - // handleUrl is called to trigger processing of a deeplink + public slots: + // handleUrl is called to trigger processing of a VsDeeplink void handleUrl(const QUrl& url); - // checks to see if another instance of jacktrip is available to process requests. - // if there is, this will send any command line deeplinks to it and exit. - // if there isn't, this will start listening for requests. - void checkForInstance(); - - // called if a connection was established with another instance of VS - void connectionReceived(); + // called by local socket server to process VsDeeplink requests + void handleVsDeeplinkRequest(QSharedPointer& socket); - // called if unable to connect to another instance of VS - void connectionFailed(QLocalSocket::LocalSocketError socketError); - - // called by local socket server to process deeplink requests - void handleDeeplinkRequest(); + signals: + // signalVsDeeplink is emitted when we want the local instance to process a VsDeeplink + void signalVsDeeplink(const QUrl& url); private: // sets url scheme for windows machines; does nothing on other platforms static void setUrlScheme(); - - // used to check if there is a virtual studio instance already running - QScopedPointer m_instanceCheckSocket; - - // used to listen for deeplink requests via local socket connections - QScopedPointer m_instanceServer; - - // used to synchronize with main thread at startup - bool m_isReady = false; - bool m_readyForSignals = false; - bool m_readyToExit = false; - QUrl m_deeplink; }; #endif // __VSDEEPLINK_H__ diff --git a/src/vs/vsDevice.cpp b/src/vs/vsDevice.cpp index 4f036df..8e49fd6 100644 --- a/src/vs/vsDevice.cpp +++ b/src/vs/vsDevice.cpp @@ -189,6 +189,8 @@ void VsDevice::sendHeartbeat() json.insert(QLatin1String("high_latency"), m_audioConfigPtr->getHighLatencyFlag()); json.insert(QLatin1String("network_outage"), m_networkOutage); + json.insert(QLatin1String("recv_latency"), + m_jackTrip.isNull() ? -1 : m_jackTrip->getLatency()); // For the internal application UI, ms will suffice. No conversion needed QJsonObject pingStats = {}; @@ -201,6 +203,8 @@ void VsDevice::sendHeartbeat() ((int)(10 * stats.stdDevRtt)) / 10.0); pingStats.insert(QLatin1String("highLatency"), m_audioConfigPtr->getHighLatencyFlag()); + pingStats.insert(QLatin1String("recvLatency"), + m_jackTrip.isNull() ? -1 : m_jackTrip->getLatency()); emit updateNetworkStats(pingStats); } @@ -277,8 +281,7 @@ JackTrip* VsDevice::initJackTrip( [[maybe_unused]] std::string output, [[maybe_unused]] int baseInputChannel, [[maybe_unused]] int numChannelsIn, [[maybe_unused]] int baseOutputChannel, [[maybe_unused]] int numChannelsOut, [[maybe_unused]] int inputMixMode, - [[maybe_unused]] int bufferSize, [[maybe_unused]] int queueBuffer, - VsServerInfo* studioInfo) + [[maybe_unused]] int bufferSize, VsServerInfo* studioInfo) { m_jackTrip.reset( new JackTrip(JackTrip::CLIENTTOPINGSERVER, JackTrip::UDP, baseInputChannel, @@ -305,7 +308,16 @@ JackTrip* VsDevice::initJackTrip( m_jackTrip->setBindPorts(bindPort); m_jackTrip->setRemoteClientName(m_appID); m_jackTrip->setBufferStrategy(3); // PLC + + // adjust queueBuffer config setting to map to auto headroom + int queueBuffer = m_queueBuffer; + if (queueBuffer <= 0) { + queueBuffer = -500; + } else { + queueBuffer *= -1; + } m_jackTrip->setBufferQueueLength(queueBuffer); + m_jackTrip->setUseRtUdpPriority( true); // rt udp priority reduces glitches on desktops m_jackTrip->setPeerAddress(studioInfo->host()); @@ -412,6 +424,24 @@ void VsDevice::syncDeviceSettings() m_sendVolumeTimer.start(100); } +// setQueueBuffer updates balance between latency and quality for audio received +void VsDevice::setQueueBuffer(int queueBuffer) +{ + if (m_queueBuffer == queueBuffer) + return; + if (queueBuffer < 0) + queueBuffer = 0; + m_queueBuffer = queueBuffer; + if (!m_jackTrip.isNull()) { + if (queueBuffer <= 0) { + queueBuffer = -500; + } else { + queueBuffer *= -1; + } + m_jackTrip->setBufferQueueLength(queueBuffer); + } +} + // handleJackTripError is a slot intended to be triggered on jacktrip process signals void VsDevice::handleJackTripError() { diff --git a/src/vs/vsDevice.h b/src/vs/vsDevice.h index 2ddb7f9..64878ba 100644 --- a/src/vs/vsDevice.h +++ b/src/vs/vsDevice.h @@ -72,7 +72,7 @@ class VsDevice : public QObject JackTrip* initJackTrip(bool useRtAudio, std::string input, std::string output, int baseInputChannel, int numChannelsIn, int baseOutputChannel, int numChannelsOut, int inputMixMode, int bufferSize, - int queueBuffer, VsServerInfo* studioInfo); + VsServerInfo* studioInfo); void startJackTrip(const VsServerInfo& studioInfo); void stopJackTrip(bool isReconnecting = false); void reconcileAgentConfig(QJsonDocument newState); @@ -84,6 +84,7 @@ class VsDevice : public QObject public slots: void syncDeviceSettings(); + void setQueueBuffer(int queueBuffer); private slots: void handleJackTripError(); @@ -114,6 +115,7 @@ class VsDevice : public QObject QScopedPointer m_jackTrip; QRandomGenerator m_randomizer; QTimer m_sendVolumeTimer; + int m_queueBuffer = 0; bool m_networkOutage = false; bool m_stopping = false; }; diff --git a/src/vs/vsMacPermissions.mm b/src/vs/vsMacPermissions.mm index cca1300..46e3f36 100644 --- a/src/vs/vsMacPermissions.mm +++ b/src/vs/vsMacPermissions.mm @@ -85,11 +85,13 @@ void VsMacPermissions::getMicPermission() { // The user has previously denied access. setMicPermission(QStringLiteral("denied")); + break; } case AVAuthorizationStatusRestricted: { // The user can't grant access due to restrictions. setMicPermission(QStringLiteral("denied")); + break; } } } else { diff --git a/src/vs/vsPinger.cpp b/src/vs/vsPinger.cpp index 1034af0..beae7fb 100644 --- a/src/vs/vsPinger.cpp +++ b/src/vs/vsPinger.cpp @@ -79,13 +79,10 @@ void VsPinger::start() mTimer.setInterval(mPingInterval); - QString authVal = "Bearer "; - authVal.append(mToken); - QNetworkRequest req = QNetworkRequest(QUrl(mURL)); req.setRawHeader(QByteArray("Upgrade"), QByteArray("websocket")); req.setRawHeader(QByteArray("Connection"), QByteArray("upgrade")); - req.setRawHeader(QByteArray("Authorization"), authVal.toUtf8()); + mSocket.open(req); mStarted = true; diff --git a/src/vs/vsPinger.h b/src/vs/vsPinger.h index 3319d14..a093a53 100644 --- a/src/vs/vsPinger.h +++ b/src/vs/vsPinger.h @@ -39,6 +39,8 @@ #include #include +#include +#include #include #include #include diff --git a/src/vs/vsQuickView.cpp b/src/vs/vsQuickView.cpp index 6143cbd..1c7dbc4 100644 --- a/src/vs/vsQuickView.cpp +++ b/src/vs/vsQuickView.cpp @@ -54,7 +54,11 @@ VsQuickView::VsQuickView(QWindow* parent) : QQuickView(parent) bool VsQuickView::event(QEvent* event) { - if (event->type() == QEvent::Close || event->type() == QEvent::Quit) { + if (event->type() == QEvent::FocusIn) { + emit focusGained(); + } else if (event->type() == QEvent::FocusOut) { + emit focusLost(); + } else if (event->type() == QEvent::Close || event->type() == QEvent::Quit) { emit windowClose(); event->ignore(); } diff --git a/src/vs/vsQuickView.h b/src/vs/vsQuickView.h index db7810d..eef2d0f 100644 --- a/src/vs/vsQuickView.h +++ b/src/vs/vsQuickView.h @@ -55,6 +55,8 @@ class VsQuickView : public QQuickView signals: void windowClose(); + void focusGained(); + void focusLost(); private slots: void closeWindow(); diff --git a/src/vs/vsWebSocket.cpp b/src/vs/vsWebSocket.cpp index 62946a0..39cd625 100644 --- a/src/vs/vsWebSocket.cpp +++ b/src/vs/vsWebSocket.cpp @@ -85,15 +85,17 @@ void VsWebSocket::openSocket() } QNetworkRequest req = QNetworkRequest(QUrl(m_url)); - QString authVal = "Bearer "; - authVal.append(m_token); req.setRawHeader(QByteArray("Upgrade"), QByteArray("websocket")); req.setRawHeader(QByteArray("Connection"), QByteArray("Upgrade")); - req.setRawHeader(QByteArray("Authorization"), authVal.toUtf8()); req.setRawHeader(QByteArray("Origin"), QByteArray("http://jacktrip.local")); req.setRawHeader(QByteArray("APIPrefix"), m_apiPrefix.toUtf8()); req.setRawHeader(QByteArray("APISecret"), m_apiSecret.toUtf8()); + QList cookies; + QNetworkCookie authCookie = QNetworkCookie(QByteArray("auth_code"), m_token.toUtf8()); + cookies.append(authCookie); + req.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); + if (!m_webSocket.isNull()) { m_webSocket->open(req); qDebug() << "Opened websocket:" << QUrl(m_url).toString(QUrl::RemoveQuery); @@ -114,7 +116,7 @@ void VsWebSocket::onError(QAbstractSocket::SocketError error) // RemoteHostClosedError may be expected due to finite connection durations // ConnectionRefusedError may be expected if the server-side endpoint is closed if (error != QAbstractSocket::RemoteHostClosedError) { - qDebug() << "Websocket error: " << error; + qDebug() << "Websocket error: " << m_url << " " << error; } if (!m_webSocket.isNull()) { m_webSocket->abort(); diff --git a/src/vs/vsWebSocket.h b/src/vs/vsWebSocket.h index 34da9b4..b5e4c47 100644 --- a/src/vs/vsWebSocket.h +++ b/src/vs/vsWebSocket.h @@ -38,6 +38,7 @@ #define VSWEBSOCKET_H #include +#include #include #include #include diff --git a/src/vst3/JackTripVST.h b/src/vst3/JackTripVST.h new file mode 100644 index 0000000..b7ad310 --- /dev/null +++ b/src/vst3/JackTripVST.h @@ -0,0 +1,59 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#pragma once + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/vst/vsttypes.h" + +#define JackTripVSTVST3Category "Fx" +#define stringOriginalFilename "JackTrip.vst3" +#define stringFileDescription "JackTrip VST3" +#define stringCompanyName "JackTrip Labs\0" +#define stringLegalCopyright "Copyright (c) 2024-2025 JackTrip Labs, Inc." +#define stringLegalTrademarks "VST is a trademark of Steinberg Media Technologies GmbH" + +//------------------------------------------------------------------------ +enum JackTripVSTParams : Steinberg::Vst::ParamID { + kParamGainSendId = 100, + kParamMixOutputId = 101, + kParamGainOutputId = 102, + kParamConnectedId = 200, + kBypassId = 1000 +}; + +//------------------------------------------------------------------------ +static const Steinberg::FUID kJackTripVSTProcessorUID(0x176F9AF4, 0xA56041A1, 0x890DD021, + 0x765ABCF0); +static const Steinberg::FUID kJackTripVSTControllerUID(0x075C3106, 0xBC524686, 0xB63544CC, + 0xF88423FF); diff --git a/src/vst3/JackTripVSTController.cpp b/src/vst3/JackTripVSTController.cpp new file mode 100644 index 0000000..75ce3cd --- /dev/null +++ b/src/vst3/JackTripVSTController.cpp @@ -0,0 +1,235 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#include "JackTripVSTController.h" + +#include "JackTripVST.h" +#include "JackTripVSTDataBlock.h" +#include "base/source/fstreamer.h" +#include "pluginterfaces/base/ibstream.h" +#include "vstgui/plugin-bindings/vst3editor.h" + +using namespace Steinberg; + +// the number of parameters used by the plugin +constexpr int32 JackTripVSTNumParameters = 5; + +//------------------------------------------------------------------------ +// JackTripVSTController Implementation +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::initialize(FUnknown* context) +{ + // Here the Plug-in will be instantiated + + //---do not forget to call parent ------ + tresult result = EditControllerEx1::initialize(context); + if (result != kResultOk) { + return result; + } + + // Here you could register some parameters + if (result == kResultTrue) { + //---Create Parameters------------ + parameters.addParameter(STR16("Send Gain"), STR16("dB"), 199, 1., + Vst::ParameterInfo::kCanAutomate, + JackTripVSTParams::kParamGainSendId, 0, STR16("Send")); + + parameters.addParameter(STR16("Output Mix"), STR16("dB"), 199, 0, + Vst::ParameterInfo::kCanAutomate, + JackTripVSTParams::kParamMixOutputId, 0, STR16("Mix")); + + parameters.addParameter(STR16("Output Gain"), STR16("dB"), 199, 1., + Vst::ParameterInfo::kCanAutomate, + JackTripVSTParams::kParamGainOutputId, 0, STR16("Gain")); + + parameters.addParameter( + STR16("Connected"), STR16("On/Off"), 1, 0, Vst::ParameterInfo::kIsReadOnly, + JackTripVSTParams::kParamConnectedId, 0, STR16("Connected")); + + parameters.addParameter( + STR16("Bypass"), nullptr, 1, 0, + Vst::ParameterInfo::kCanAutomate | Vst::ParameterInfo::kIsBypass, + JackTripVSTParams::kBypassId); + } + + return result; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::terminate() +{ + // Here the Plug-in will be de-instantiated, last possibility to remove some memory! + + //---do not forget to call parent ------ + return EditControllerEx1::terminate(); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::setComponentState(IBStream* state) +{ + // Here you get the state of the component (Processor part) + if (!state) + return kResultFalse; + + IBStreamer streamer(state, kLittleEndian); + + float sendGain = 1.f; + if (streamer.readFloat(sendGain) == false) + return kResultFalse; + setParamNormalized(JackTripVSTParams::kParamGainSendId, sendGain); + + float outputMix = 1.f; + if (streamer.readFloat(outputMix) == false) + return kResultFalse; + setParamNormalized(JackTripVSTParams::kParamMixOutputId, outputMix); + + float outputGain = 1.f; + if (streamer.readFloat(outputGain) == false) + return kResultFalse; + setParamNormalized(JackTripVSTParams::kParamGainOutputId, outputGain); + + int8 connectedState = 0; + if (streamer.readInt8(connectedState) == false) + return kResultFalse; + setParamNormalized(JackTripVSTParams::kParamConnectedId, connectedState); + + int32 bypassState; + if (streamer.readInt32(bypassState) == false) + return kResultFalse; + setParamNormalized(kBypassId, bypassState ? 1 : 0); + + return kResultOk; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::setState([[maybe_unused]] IBStream* state) +{ + // Here you get the state of the controller + + return kResultTrue; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::getState([[maybe_unused]] IBStream* state) +{ + // Here you are asked to deliver the state of the controller (if needed) + // Note: the real state of your plug-in is saved in the processor + + return kResultTrue; +} + +//------------------------------------------------------------------------ +int32 PLUGIN_API JackTripVSTController::getParameterCount() +{ + return JackTripVSTNumParameters; +} + +//------------------------------------------------------------------------ +IPlugView* PLUGIN_API JackTripVSTController::createView(FIDString name) +{ + // Here the Host wants to open your editor (if you have one) + if (FIDStringsEqual(name, Vst::ViewType::kEditor)) { + // create your editor here and return a IPlugView ptr of it + auto* view = new VSTGUI::VST3Editor(this, "view", "JackTripEditor.uidesc"); + return view; + } + return nullptr; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::setParamNormalized(Vst::ParamID tag, + Vst::ParamValue value) +{ + // called by host to update your parameters + tresult result = EditControllerEx1::setParamNormalized(tag, value); + return result; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::getParamStringByValue( + Vst::ParamID tag, Vst::ParamValue valueNormalized, Vst::String128 string) +{ + // called by host to get a string for given normalized value of a specific parameter + // (without having to set the value!) + return EditControllerEx1::getParamStringByValue(tag, valueNormalized, string); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::getParamValueByString( + Vst::ParamID tag, Vst::TChar* string, Vst::ParamValue& valueNormalized) +{ + // called by host to get a normalized value from a string representation of a specific + // parameter (without having to set the value!) + return EditControllerEx1::getParamValueByString(tag, string, valueNormalized); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTController::notify(Vst::IMessage* message) +{ + if (mDataExchangeHandler.onMessage(message)) + return kResultTrue; + return EditControllerEx1::notify(message); +} + +//------------------------------------------------------------------------ +void PLUGIN_API JackTripVSTController::queueOpened( + [[maybe_unused]] Vst::DataExchangeUserContextID userContextID, + [[maybe_unused]] uint32 blockSize, [[maybe_unused]] TBool& dispatchOnBackgroundThread) +{ + // qDebug() << "Data Exchange Queue opened.\n"; +} + +//------------------------------------------------------------------------ +void PLUGIN_API JackTripVSTController::queueClosed( + [[maybe_unused]] Vst::DataExchangeUserContextID userContextID) +{ + // qDebug() << "Data Exchange Queue closed.\n"; +} + +//------------------------------------------------------------------------ +void PLUGIN_API JackTripVSTController::onDataExchangeBlocksReceived( + [[maybe_unused]] Vst::DataExchangeUserContextID userContextID, uint32 numBlocks, + Vst::DataExchangeBlock* blocks, [[maybe_unused]] TBool onBackgroundThread) +{ + for (auto index = 0u; index < numBlocks; ++index) { + auto dataBlock = toDataBlock(blocks[index]); + beginEdit(JackTripVSTParams::kParamConnectedId); + Vst::ParamValue connectedState = dataBlock->connectedState ? 1 : 0; + if (setParamNormalized(JackTripVSTParams::kParamConnectedId, connectedState) + == kResultOk) { + performEdit(JackTripVSTParams::kParamConnectedId, + getParamNormalized(JackTripVSTParams::kParamConnectedId)); + } + endEdit(JackTripVSTParams::kParamConnectedId); + } +} diff --git a/src/vst3/JackTripVSTController.h b/src/vst3/JackTripVSTController.h new file mode 100644 index 0000000..9ce544f --- /dev/null +++ b/src/vst3/JackTripVSTController.h @@ -0,0 +1,97 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#pragma once + +#include "public.sdk/source/vst/utility/dataexchange.h" +#include "public.sdk/source/vst/vsteditcontroller.h" + +//------------------------------------------------------------------------ +// JackTripVSTController +//------------------------------------------------------------------------ +class JackTripVSTController + : public Steinberg::Vst::EditControllerEx1 + , public Steinberg::Vst::IDataExchangeReceiver +{ + public: + //------------------------------------------------------------------------ + JackTripVSTController() = default; + ~JackTripVSTController() SMTG_OVERRIDE = default; + + // Create function + static Steinberg::FUnknown* createInstance(void* /*context*/) + { + return (Steinberg::Vst::IEditController*)new JackTripVSTController; + } + + // IPluginBase + Steinberg::tresult PLUGIN_API initialize(Steinberg::FUnknown* context) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API terminate() SMTG_OVERRIDE; + + // EditController + Steinberg::tresult PLUGIN_API setComponentState(Steinberg::IBStream* state) + SMTG_OVERRIDE; + Steinberg::IPlugView* PLUGIN_API createView(Steinberg::FIDString name) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API setState(Steinberg::IBStream* state) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API getState(Steinberg::IBStream* state) SMTG_OVERRIDE; + Steinberg::int32 PLUGIN_API getParameterCount() SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API setParamNormalized( + Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API getParamStringByValue( + Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue valueNormalized, + Steinberg::Vst::String128 string) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API + getParamValueByString(Steinberg::Vst::ParamID tag, Steinberg::Vst::TChar* string, + Steinberg::Vst::ParamValue& valueNormalized) SMTG_OVERRIDE; + + // IDataExchangeReceiver + Steinberg::tresult PLUGIN_API notify(Steinberg::Vst::IMessage* message) override; + void PLUGIN_API queueOpened(Steinberg::Vst::DataExchangeUserContextID userContextID, + Steinberg::uint32 blockSize, + Steinberg::TBool& dispatchOnBackgroundThread) override; + void PLUGIN_API + queueClosed(Steinberg::Vst::DataExchangeUserContextID userContextID) override; + void PLUGIN_API onDataExchangeBlocksReceived( + Steinberg::Vst::DataExchangeUserContextID userContextID, + Steinberg::uint32 numBlocks, Steinberg::Vst::DataExchangeBlock* blocks, + Steinberg::TBool onBackgroundThread) override; + + //---Interface--------- + DEFINE_INTERFACES + DEF_INTERFACE(Steinberg::Vst::IDataExchangeReceiver) + END_DEFINE_INTERFACES(EditController) + DELEGATE_REFCOUNT(EditController) + + private: + Steinberg::Vst::DataExchangeReceiverHandler mDataExchangeHandler{this}; +}; diff --git a/src/vst3/JackTripVSTDataBlock.h b/src/vst3/JackTripVSTDataBlock.h new file mode 100644 index 0000000..a4d32ce --- /dev/null +++ b/src/vst3/JackTripVSTDataBlock.h @@ -0,0 +1,51 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the VST3 SDK Data Exchange tutorial at +// https://steinbergmedia.github.io/vst3_dev_portal/pages/Tutorials/Data+Exchange.html + +#pragma once + +#include + +#include "public.sdk/source/vst/utility/dataexchange.h" + +// this is currently overkill for a bool, but we can use it for other things +// such as volume meters in the future +struct DataBlock { + bool connectedState; +}; + +inline DataBlock* toDataBlock(const Steinberg::Vst::DataExchangeBlock& block) +{ + if (block.blockID != Steinberg::Vst::InvalidDataExchangeBlockID) + return reinterpret_cast(block.data); + return nullptr; +} diff --git a/src/vst3/JackTripVSTEntry.cpp b/src/vst3/JackTripVSTEntry.cpp new file mode 100644 index 0000000..bbff0c4 --- /dev/null +++ b/src/vst3/JackTripVSTEntry.cpp @@ -0,0 +1,87 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#include "../jacktrip_globals.h" +#include "JackTripVST.h" +#include "JackTripVSTController.h" +#include "JackTripVSTProcessor.h" +#include "public.sdk/source/main/pluginfactory.h" + +#define stringPluginName "JackTrip Audio Bridge" + +using namespace Steinberg::Vst; +using namespace Steinberg; + +//------------------------------------------------------------------------ +// VST Plug-in Entry +//------------------------------------------------------------------------ +// Windows: do not forget to include a .def file in your project to export +// GetPluginFactory function! +//------------------------------------------------------------------------ + +BEGIN_FACTORY_DEF("JackTrip Labs", "https://www.jacktrip.com", + "mailto:support@jacktrip.com") + +//---First Plug-in included in this factory------- +// its kVstAudioEffectClass component +DEF_CLASS2(INLINE_UID_FROM_FUID(kJackTripVSTProcessorUID), + PClassInfo::kManyInstances, // cardinality + kVstAudioEffectClass, // the component category (do not changed this) + stringPluginName, // here the Plug-in name (to be changed) + Vst::kDistributable, // means that component and controller could be + // distributed on different computers + JackTripVSTVST3Category, // Subcategory for this Plug-in (to be changed) + gVersion, // Plug-in version (to be changed) + kVstVersionString, // the VST 3 SDK version (do not changed this, use always + // this define) + JackTripVSTProcessor::createInstance) // function pointer called when this + // component should be instantiated + +// its kVstComponentControllerClass component +DEF_CLASS2(INLINE_UID_FROM_FUID(kJackTripVSTControllerUID), + PClassInfo::kManyInstances, // cardinality + kVstComponentControllerClass, // the Controller category (do not changed this) + stringPluginName + "", // controller name (could be the same than component name) + 0, // not used here + "", // not used here + gVersion, // Plug-in version (to be changed) + kVstVersionString, // the VST 3 SDK version (do not changed this, use always + // this define) + JackTripVSTController::createInstance) // function pointer called when this + // component should be instantiated + +//----for others Plug-ins contained in this factory, put like for the first Plug-in +// different DEF_CLASS2--- + +END_FACTORY diff --git a/src/vst3/JackTripVSTProcessor.cpp b/src/vst3/JackTripVSTProcessor.cpp new file mode 100644 index 0000000..5659b28 --- /dev/null +++ b/src/vst3/JackTripVSTProcessor.cpp @@ -0,0 +1,593 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#include "JackTripVSTProcessor.h" + +#include "../AudioSocket.h" +#include "JackTripVST.h" +#include "JackTripVSTDataBlock.h" +#include "base/source/fstreamer.h" +#include "pluginterfaces/vst/ivstparameterchanges.h" + +using namespace std; +using namespace Steinberg; + +// uncomment to generate log file, for debugging purposes +// #define JACKTRIP_VST_LOG + +#ifdef JACKTRIP_VST_LOG +#if defined(_WIN32) +#define JACKTRIP_VST_LOG_PATH "c:/JackTripTemp" +#define JACKTRIP_VST_LOG_FILE "c:/JackTripTemp/vst.log" +#else +#define JACKTRIP_VST_LOG_PATH "/tmp/jacktrip" +#define JACKTRIP_VST_LOG_FILE "/tmp/jacktrip/vst.log" +#endif +#include +#include +#include + +static ofstream kLogFile; + +void qtMessageHandler([[maybe_unused]] QtMsgType type, + [[maybe_unused]] const QMessageLogContext& context, + const QString& msg) +{ + kLogFile << msg.toStdString() << endl; +} +#endif + +// any multiplier less than this is considered to be silent +constexpr double kSilentMul = 0.0000001; + +static QCoreApplication* sQtAppPtr = nullptr; + +static QCoreApplication* getQtAppPtr() +{ + if (sQtAppPtr == nullptr) { + sQtAppPtr = QCoreApplication::instance(); + if (sQtAppPtr == nullptr) { + int argc = 0; + sQtAppPtr = new QCoreApplication(argc, nullptr); + sQtAppPtr->setAttribute(Qt::AA_NativeWindows); + } + } + return sQtAppPtr; +} + +//------------------------------------------------------------------------ +// JackTripVSTProcessor +//------------------------------------------------------------------------ +JackTripVSTProcessor::JackTripVSTProcessor() +{ + //--- set the wanted controller for our processor + setControllerClass(kJackTripVSTControllerUID); + mCurrentExchangeBlock = + Vst::DataExchangeBlock{nullptr, 0, Vst::InvalidDataExchangeBlockID}; +} + +//------------------------------------------------------------------------ +JackTripVSTProcessor::~JackTripVSTProcessor() {} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::initialize(FUnknown* context) +{ + // Here the Plug-in will be instantiated + + //---always initialize the parent------- + tresult result = AudioEffect::initialize(context); + // if everything Ok, continue + if (result != kResultOk) { + return result; + } + + //--- create Audio IO ------ + addAudioInput(STR16("Stereo In"), Vst::SpeakerArr::kStereo); + addAudioOutput(STR16("Stereo Out"), Vst::SpeakerArr::kStereo); + + getQtAppPtr(); + + mInputBuffer = new float*[AudioSocketNumChannels]; + mOutputBuffer = new float*[AudioSocketNumChannels]; + for (int i = 0; i < AudioSocketNumChannels; i++) { + mInputBuffer[i] = new float[AudioSocketMaxSamplesPerBlock]; + mOutputBuffer[i] = new float[AudioSocketMaxSamplesPerBlock]; + } + +#ifdef JACKTRIP_VST_LOG + if (!filesystem::is_directory(JACKTRIP_VST_LOG_PATH)) { + if (!filesystem::create_directory(JACKTRIP_VST_LOG_PATH)) { + qDebug() << "Failed to create VST log directory: " << JACKTRIP_VST_LOG_PATH; + } + } + kLogFile.open(JACKTRIP_VST_LOG_FILE, ios::app); + if (kLogFile.is_open()) { + kLogFile << "JackTrip VST initialized" << endl; + kLogFile.flush(); + cout.rdbuf(kLogFile.rdbuf()); + cerr.rdbuf(kLogFile.rdbuf()); + } else { + qDebug() << "Failed to open VST log file: " << JACKTRIP_VST_LOG_FILE; + } + qInstallMessageHandler(qtMessageHandler); +#endif + + qDebug() << "JackTrip VST initialized"; + + return kResultOk; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::terminate() +{ + mSocketPtr.reset(); + + for (int i = 0; i < AudioSocketNumChannels; i++) { + delete[] mInputBuffer[i]; + delete[] mOutputBuffer[i]; + } + delete[] mInputBuffer; + delete[] mOutputBuffer; + + qDebug() << "JackTrip VST terminated"; + +#ifdef JACKTRIP_VST_LOG + kLogFile.close(); +#endif + + //---do not forget to call parent ------ + return AudioEffect::terminate(); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::connect(Vst::IConnectionPoint* other) +{ + auto result = Vst::AudioEffect::connect(other); + if (result == kResultTrue) { + auto configCallback = [](Vst::DataExchangeHandler::Config& config, + [[maybe_unused]] const Vst::ProcessSetup& setup) { + config.blockSize = sizeof(DataBlock); + config.numBlocks = 2; // max number of pending blocks allowed + config.alignment = 32; + config.userContextID = 0; + return true; + }; + mDataExchangePtr.reset(new Vst::DataExchangeHandler(this, configCallback)); + mDataExchangePtr->onConnect(other, getHostContext()); + } + return result; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::disconnect(Vst::IConnectionPoint* other) +{ + if (!mDataExchangePtr.isNull()) { + mDataExchangePtr->onDisconnect(other); + mDataExchangePtr.reset(); + } + return AudioEffect::disconnect(other); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API +JackTripVSTProcessor::setBusArrangements(Vst::SpeakerArrangement* inputs, int32 numIns, + Vst::SpeakerArrangement* outputs, int32 numOuts) +{ + // based on again example from sdk (support 1->1 or 2->2) + if (numIns == 1 && numOuts == 1) { + // the host wants Mono => Mono (or 1 channel -> 1 channel) + if (Vst::SpeakerArr::getChannelCount(inputs[0]) == 1 + && Vst::SpeakerArr::getChannelCount(outputs[0]) == 1) { + auto* bus = FCast(audioInputs.at(0)); + if (bus) { + // check if we are Mono => Mono, if not we need to recreate the busses + if (bus->getArrangement() != inputs[0]) { + getAudioInput(0)->setArrangement(inputs[0]); + getAudioInput(0)->setName(STR16("Mono In")); + getAudioOutput(0)->setArrangement(outputs[0]); + getAudioOutput(0)->setName(STR16("Mono Out")); + } + return kResultOk; + } + } else { + // the host wants something else than Mono => Mono, + // in this case we are always Stereo => Stereo + auto* bus = FCast(audioInputs.at(0)); + if (bus) { + tresult result = kResultFalse; + // the host wants 2->2 (could be LsRs -> LsRs) + if (Vst::SpeakerArr::getChannelCount(inputs[0]) == 2 + && Vst::SpeakerArr::getChannelCount(outputs[0]) == 2) { + getAudioInput(0)->setArrangement(inputs[0]); + getAudioInput(0)->setName(STR16("Stereo In")); + getAudioOutput(0)->setArrangement(outputs[0]); + getAudioOutput(0)->setName(STR16("Stereo Out")); + result = kResultTrue; + } else if (bus->getArrangement() != Vst::SpeakerArr::kStereo) { + // the host want something different than 1->1 or 2->2 : in this case + // we want stereo + getAudioInput(0)->setArrangement(Vst::SpeakerArr::kStereo); + getAudioInput(0)->setName(STR16("Stereo In")); + getAudioOutput(0)->setArrangement(Vst::SpeakerArr::kStereo); + getAudioOutput(0)->setName(STR16("Stereo Out")); + result = kResultFalse; + } + return result; + } + } + } + return kResultFalse; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::setActive(TBool state) +{ + if (state) { + // sanity check to ensure these were initialized by setupProcessing() + if (mSampleRate == 0 || mBufferSize == 0) { + return kResultFalse; + } + // create a audio new socket + if (mSocketPtr.isNull()) { + // not yet initialized + mSocketPtr.reset(new AudioSocket(true)); + // automatically retry to establish connection + mSocketPtr->setRetryConnection(true); + mSocketPtr->connect(mSampleRate, mBufferSize); + } + // activate data exchange API + if (!mDataExchangePtr.isNull()) { + mDataExchangePtr->onActivate(processSetup); + } + } else { + // disconnect from remote when inactive + mSocketPtr.reset(); + // deactivate data exchange API + if (!mDataExchangePtr.isNull()) { + mDataExchangePtr->onDeactivate(); + } + } + + qDebug() << "JackTrip VST setActive(" << int(state) << ")"; + + //--- called when the Plug-in is enable/disable (On/Off) ----- + return AudioEffect::setActive(state); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::setProcessing(TBool state) +{ + qDebug() << "JackTrip VST setProcessing(" << int(state) << ")"; + return AudioEffect::setProcessing(state); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::process(Vst::ProcessData& data) +{ + // sanity check; should never happen + if (mSocketPtr.isNull()) + return kResultFalse; + + //--- Read inputs parameter changes----------- + if (data.inputParameterChanges) { + int32 numParamsChanged = data.inputParameterChanges->getParameterCount(); + for (int32 index = 0; index < numParamsChanged; index++) { + Vst::IParamValueQueue* paramQueue = + data.inputParameterChanges->getParameterData(index); + if (paramQueue) { + Vst::ParamValue value; + int32 sampleOffset; + int32 numPoints = paramQueue->getPointCount(); + switch (paramQueue->getParameterId()) { + case JackTripVSTParams::kParamGainSendId: + if (paramQueue->getPoint(numPoints - 1, sampleOffset, value) + == kResultTrue) + mSendGain = value; + break; + case JackTripVSTParams::kParamMixOutputId: + if (paramQueue->getPoint(numPoints - 1, sampleOffset, value) + == kResultTrue) + mOutputMix = value; + break; + case JackTripVSTParams::kParamGainOutputId: + if (paramQueue->getPoint(numPoints - 1, sampleOffset, value) + == kResultTrue) + mOutputGain = value; + break; + case JackTripVSTParams::kParamConnectedId: + if (paramQueue->getPoint(numPoints - 1, sampleOffset, value) + == kResultTrue) + mConnected = value > 0; + break; + case JackTripVSTParams::kBypassId: + if (paramQueue->getPoint(numPoints - 1, sampleOffset, value) + == kResultTrue) + mBypass = value > 0; + break; + } + } + } + if (numParamsChanged > 0) + updateVolumeMultipliers(); + } + +#if 0 + if (mLogFile.is_open()) { + mLogFile << "JackTrip VST process: inputs=" << data.numInputs + << ", outputs=" << data.numOutputs + << ", samples=" << data.numSamples + << endl; + } +#endif + + // handle connection state change + if (mConnected != mSocketPtr->isConnected()) { + // try both methods because some hosts only support one or the other. + // first try to use data output parameters, if available. + bool updatedConnectedState = false; + if (data.outputParameterChanges) { + int32 index = 0; + Steinberg::Vst::IParamValueQueue* paramQueue = + data.outputParameterChanges->addParameterData(kParamConnectedId, index); + if (paramQueue) { + int8 connectedState = mSocketPtr->isConnected() ? 1 : 0; + int32 index2 = 0; + if (paramQueue->addPoint(0, connectedState, index2) == kResultOk) { + updatedConnectedState = true; + } + } + } + // if unsuccessful, try to use data exchange API + if (!updatedConnectedState && !mDataExchangePtr.isNull()) { + if (mCurrentExchangeBlock.blockID == Vst::InvalidDataExchangeBlockID) { + acquireNewExchangeBlock(); + } + if (auto block = toDataBlock(mCurrentExchangeBlock)) { + block->connectedState = mSocketPtr->isConnected(); + if (mDataExchangePtr->sendCurrentBlock()) { + updatedConnectedState = true; + } + // we need to acquire a new block before the current one will be sent + acquireNewExchangeBlock(); + } + } + if (updatedConnectedState) { + // we can update our state after successfully deliver the change + mConnected = mSocketPtr->isConnected(); + } + } + + //--- Process Audio--------------------- + //--- ---------------------------------- + if (data.numInputs == 0 || data.numOutputs == 0) { + // nothing to do + return kResultOk; + } + + if (data.numSamples <= 0) { + // nothing to do + return kResultOk; + } + + if (data.numSamples > AudioSocketMaxSamplesPerBlock) { + // just a sanity check; shouldn't happen + data.numSamples = AudioSocketMaxSamplesPerBlock; + } + + if (mBypass) { + // copy input to output + for (int i = 0; i < data.inputs[0].numChannels && i < data.outputs[0].numChannels; + i++) { + memcpy(data.outputs[0].channelBuffers32[i], + data.inputs[0].channelBuffers32[i], + data.numSamples * sizeof(Vst::Sample32)); + } + data.outputs[0].silenceFlags = data.inputs[0].silenceFlags; + return kResultOk; + } + + // clear buffers + for (int i = 0; i < AudioSocketNumChannels; i++) { + memset(mInputBuffer[i], 0, data.numSamples * sizeof(float)); + memset(mOutputBuffer[i], 0, data.numSamples * sizeof(float)); + } + + // copy input to buffer + if (mSendMul >= kSilentMul) { + uint64 isSilentFlag = 1; + int channelsIn = min(data.inputs[0].numChannels, AudioSocketNumChannels); + for (int i = 0; i < channelsIn; i++) { + bool isSilent = isSilentFlag & data.inputs[0].silenceFlags; + isSilentFlag <<= 1; + if (isSilent) + continue; + Vst::Sample32* inBuffer = data.inputs[0].channelBuffers32[i]; + for (int j = 0; j < data.numSamples; j++) { + mInputBuffer[i][j] = inBuffer[j] * mSendMul; + } + } + } + + // send to audio socket + mSocketPtr->compute(data.numSamples, mInputBuffer, mOutputBuffer); + + // copy buffer to output + for (int i = 0; i < data.outputs[0].numChannels; i++) { + bool silent = true; + memset(data.outputs[0].channelBuffers32[i], 0, + data.numSamples * sizeof(Vst::Sample32)); + if (mPassMul >= kSilentMul || mRecvMul >= kSilentMul) { + Vst::Sample32* outBuffer = data.outputs[0].channelBuffers32[i]; + for (int j = 0; j < data.numSamples; j++) { + if (i < AudioSocketNumChannels && mRecvMul >= kSilentMul) { + outBuffer[j] = mOutputBuffer[i][j] * mRecvMul; + } + if (i < data.inputs[0].numChannels && mPassMul >= kSilentMul) { + outBuffer[j] += data.inputs[0].channelBuffers32[i][j] * mPassMul; + } + if (silent && outBuffer[j] != 0) { + silent = false; + } + } + } + if (silent) { + data.outputs[0].silenceFlags |= static_cast(1) << i; + } + } + + return kResultOk; +} + +//------------------------------------------------------------------------ +float JackTripVSTProcessor::gainToVol(double gain) +{ + // handle min and max + if (gain < kSilentMul) + return 0; + if (gain > 0.9999999) + return 1.0; + // simple logarithmic conversion + return exp(log(1000) * gain) / 1000.0; +} + +//------------------------------------------------------------------------ +void JackTripVSTProcessor::updateVolumeMultipliers() +{ + // convert [0-1.0] gain (dB) values into [0-1.0] volume multiplers + float outMul = gainToVol(mOutputGain); + mSendMul = gainToVol(mSendGain); + mRecvMul = mOutputMix * outMul; + mPassMul = (1.0f - mOutputMix) * outMul; + + qDebug() << "JackTrip VST send =" << mSendMul << "(" << mSendGain + << "), out =" << outMul << "(" << mOutputGain << "), mix =" << mOutputMix + << ", recv =" << mRecvMul << ", pass =" << mPassMul; +} + +//------------------------------------------------------------------------ +void JackTripVSTProcessor::acquireNewExchangeBlock() +{ + mCurrentExchangeBlock = mDataExchangePtr->getCurrentOrNewBlock(); + if (auto block = toDataBlock(mCurrentExchangeBlock)) { + block->connectedState = false; // default + } +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::setupProcessing(Vst::ProcessSetup& newSetup) +{ + mSampleRate = newSetup.sampleRate; + mBufferSize = static_cast(newSetup.maxSamplesPerBlock); + + qDebug() << "JackTrip VST setupProcessing: mSampleRate=" << mSampleRate + << ", mbufferSize=" << mBufferSize; + + //--- called before any processing ---- + return AudioEffect::setupProcessing(newSetup); +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::canProcessSampleSize(int32 symbolicSampleSize) +{ + // by default kSample32 is supported + if (symbolicSampleSize == Vst::kSample32) + return kResultTrue; + + // disable the following comment if your processing support kSample64 + /* if (symbolicSampleSize == Vst::kSample64) + return kResultTrue; */ + + return kResultFalse; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::setState(IBStream* state) +{ + if (!state) + return kResultFalse; + + // called when we load a preset or project, the model has to be reloaded + + IBStreamer streamer(state, kLittleEndian); + + float sendGain = 1.f; + if (streamer.readFloat(sendGain) == false) + return kResultFalse; + + float outputMix = 1.f; + if (streamer.readFloat(outputMix) == false) + return kResultFalse; + + float outputGain = 1.f; + if (streamer.readFloat(outputGain) == false) + return kResultFalse; + + int8 connectedState = 0; + if (streamer.readInt8(connectedState) == false) + return kResultFalse; + + int32 bypassState = 0; + if (streamer.readInt32(bypassState) == false) + return kResultFalse; + + mSendGain = sendGain; + mOutputMix = outputMix; + mOutputGain = outputGain; + mConnected = connectedState > 0; + mBypass = bypassState > 0; + + updateVolumeMultipliers(); + + return kResultOk; +} + +//------------------------------------------------------------------------ +tresult PLUGIN_API JackTripVSTProcessor::getState(IBStream* state) +{ + // here we need to save the model (preset or project) + + float sendGain = mSendGain; + float outputMix = mOutputMix; + float outputGain = mOutputGain; + int8 connectedState = mConnected ? 1 : 0; + int32 bypassState = mBypass ? 1 : 0; + + IBStreamer streamer(state, kLittleEndian); + streamer.writeFloat(sendGain); + streamer.writeFloat(outputMix); + streamer.writeFloat(outputGain); + streamer.writeInt8(connectedState); + streamer.writeInt32(bypassState); + + return kResultOk; +} diff --git a/src/vst3/JackTripVSTProcessor.h b/src/vst3/JackTripVSTProcessor.h new file mode 100644 index 0000000..a61bf2c --- /dev/null +++ b/src/vst3/JackTripVSTProcessor.h @@ -0,0 +1,128 @@ +//***************************************************************** +/* + JackTrip: A System for High-Quality Audio Network Performance + over the Internet + + Copyright (c) 2024-2025 JackTrip Labs, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ +//***************************************************************** + +// Based on the Hello World VST 3 example from Steinberg +// https://github.com/steinbergmedia/vst3_example_plugin_hello_world + +#pragma once + +#include +#include +#include + +#include "public.sdk/source/vst/utility/dataexchange.h" +#include "public.sdk/source/vst/vstaudioeffect.h" + +class AudioSocket; + +//------------------------------------------------------------------------ +// JackTripVSTProcessor +//------------------------------------------------------------------------ +class JackTripVSTProcessor : public Steinberg::Vst::AudioEffect +{ + public: + JackTripVSTProcessor(); + ~JackTripVSTProcessor() SMTG_OVERRIDE; + + // Create function + static Steinberg::FUnknown* createInstance(void* /*context*/) + { + return (Steinberg::Vst::IAudioProcessor*)new JackTripVSTProcessor; + } + + //--- --------------------------------------------------------------------- + // AudioEffect overrides: + //--- --------------------------------------------------------------------- + /** Called at first after constructor */ + Steinberg::tresult PLUGIN_API initialize(Steinberg::FUnknown* context) SMTG_OVERRIDE; + + /** Called at the end before destructor */ + Steinberg::tresult PLUGIN_API terminate() SMTG_OVERRIDE; + + /** Called to connect data exchange API */ + Steinberg::tresult PLUGIN_API + connect(Steinberg::Vst::IConnectionPoint* other) override; + + /** Called to disconnect data exchange API */ + Steinberg::tresult PLUGIN_API + disconnect(Steinberg::Vst::IConnectionPoint* other) override; + + /** Called to set bus arrangements */ + Steinberg::tresult PLUGIN_API setBusArrangements( + Steinberg::Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, + Steinberg::Vst::SpeakerArrangement* outputs, + Steinberg::int32 numOuts) SMTG_OVERRIDE; + + /** Switch the Plug-in on/off */ + Steinberg::tresult PLUGIN_API setActive(Steinberg::TBool state) SMTG_OVERRIDE; + + /** Called by audio thread immediately before processing starts, and after it ends */ + Steinberg::tresult PLUGIN_API setProcessing(Steinberg::TBool state) SMTG_OVERRIDE; + + /** Will be called before any process call */ + Steinberg::tresult PLUGIN_API setupProcessing(Steinberg::Vst::ProcessSetup& newSetup) + SMTG_OVERRIDE; + + /** Asks if a given sample size is supported see SymbolicSampleSizes. */ + Steinberg::tresult PLUGIN_API + canProcessSampleSize(Steinberg::int32 symbolicSampleSize) SMTG_OVERRIDE; + + /** Here we go...the process call */ + Steinberg::tresult PLUGIN_API process(Steinberg::Vst::ProcessData& data) + SMTG_OVERRIDE; + + /** For persistence */ + Steinberg::tresult PLUGIN_API setState(Steinberg::IBStream* state) SMTG_OVERRIDE; + Steinberg::tresult PLUGIN_API getState(Steinberg::IBStream* state) SMTG_OVERRIDE; + + //------------------------------------------------------------------------ + protected: + static float gainToVol(double gain); + void updateVolumeMultipliers(); + void acquireNewExchangeBlock(); + + Steinberg::Vst::ParamValue mSendGain = 1.f; + Steinberg::Vst::ParamValue mOutputMix = 0; + Steinberg::Vst::ParamValue mOutputGain = 1.f; + float mSendMul = 1.f; + float mRecvMul = 0; + float mPassMul = 1.f; + bool mConnected = false; + bool mBypass = false; + + private: + QScopedPointer mSocketPtr; + QScopedPointer mDataExchangePtr; + Steinberg::Vst::DataExchangeBlock mCurrentExchangeBlock; + float** mInputBuffer; + float** mOutputBuffer; + Steinberg::Vst::SampleRate mSampleRate = 0; + int mBufferSize = 0; +}; diff --git a/src/vst3/resources/Dual_LED.png b/src/vst3/resources/Dual_LED.png new file mode 100644 index 0000000000000000000000000000000000000000..45458f27684c1000864f5632b164052a24261aba GIT binary patch literal 13198 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 z zs6NX0GHqT%&~vf=mlBty_ls_5hYnjZ^8oAx4Vq{DctGhI%Bi5(Xx1BL`U*$>aGHYm zUi!sHJ29H?F==wx0i)o>qZjocF{#~E|67r~lgIVnd1Utk4g-;yk;IPZ>c|aUqu30m zeF&*~+pk`7d5>KfCU*W}4;78slF=@&4I-doIvh6Jh75_(-lnkrvJTAKTX$nQ9dIv~ z90yX=NQv*V+DG7ZjuR{I*H-G(y9mdZohRUC8y-^&-0+vm6gs*-Wrjb{g2>d^XDh#G zMcahr(uk#|VQCqgOQ+j*f%m)_?W2yV5qj~ND^%22b?w)CEDCiO4FZvV*d$FeD0OAG z&5P=@Si-Y*_<-o*gELF^o+d1!~cR=h_Lu6 zJr>#sUv?xcS7J|43@tgqF(HOJVn~z6`~2bj`pF!>>EAbE!Tle?>|EvX7YQ?QDt3g! zcv+1-7?e|*-OOoE2HVPicT-nT&-x-oB6+m~Q{hr1!t(dWjJ^RRx7|p)ItHzApAj}u z&OiGNwRgfMNa~a{aA9;Oh&Oh>&oI7rq`fjEqjiQ?;pL?Y?YtvSO0{hGfuz0iomdzH z0SgB^Y!bCo@sqXc(Vh)~Hw2zDjP8#G?gc-y1r4Izz$mffzn+^FAx_x%mQNS#T0Ms} zlOY?MvKC$7z?54A4DWkSYV)?lr->2a3bb z%0D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
  • -&MdwR+jirR6b-MrOcc;H%R|G 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 Rw%muOY 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 z�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

    fFp&Lm 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 JDx}S!{{zD~V@m)4 literal 0 HcmV?d00001 diff --git a/src/vst3/resources/background.png b/src/vst3/resources/background.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7effa7deeed810e851a1a1c4aa386b8b5fff4c GIT binary patch literal 124749 zcmWhzc|26_7rrx5gUZZcB4UgsA!|fgr@<()4hGpxi9sY=G<-+RAWMar$d+}GeP0qn z42q00mL!BMWh+bl{QkK2zMp&kx#vCaJ?A;kd8p>sjZSc%<^}-ZgfSLl2>_s^!*wqN ze0VnwM%EraIBx2j>H|P!BG0}nCjf9?^SW}yJkZhzjWjm6qOPo|u6|xcK^XwB)E8Da zt*sUj+B;L5=xY?xvul2q0uZDnI*w%Rl?#6YqWoq^44w5n=jTfB6I*lmkP}D7zW7Ws=zM_Af~0R zAbK|V2)8vd>Ig}XcAkg2nFt2H?EPH-acKPw=J+x|)B^zDPaF?tH1;2upX&R@4M-jb z3gWsxqk%jqpb{XU!U?Ew13&Wa(!qcf062&WpW-Fm1_75npO_s1?hQ-sfPp$0D_OAK zOF&P$kDm&>KMB~Sz2uJrDqH}WzGO-us3IM3d6L6?2Dq#Nq!;H99!H>pfJ-iv#|i}5 z2HKO14AudNDo7^&S$W8?t)uv$6#%SPdBn{jDNVdksE2ZY2$Xw(_ za3f^F)3c9b_$}~M^$0*RyoVw24(`lqUT(N_nXNH?>3(g|ztj71l*e)Z(sau^Kp=oT zvSqMW-BNlQSQP~7e#WKNoXPe)L1G;!K7S_)jG{^NCC&q#GlzR)9fO`H+)PVP_m+e4 z5Mzp+xBg^tJpegxRnHw-r^o)=i+#%3cbroc_T@jGYL%*I0a^~y(AYcax}ra)74|oR zP2!+u2gSv81tbyC0fG{Kx1P}lCCJo$KcF4q$*%_Xn`LO?Ta26 zYJkuCg9ke}8^B{<5LzTBLDGT}x1WoMK2)UxV@FYUBhgSSibRJ2K|B(x1dr+xr((HL z2G4peJ=83tpGn|)o$^Hgh-xNe7$}Hq_iE?y3K>RT(a9F<)B9W`di&vcj^jt+6X=)k z|J>qkf(#h(d^mAS%Kkr5boz(t?*f~M@i-l$9;Np0g2z<5e3TTrJJFRP@G=3*G88^7wD@noZ2N$f9i;h%G0ns?Zs96tmf%Q%%v+! z;#*I_Gdb|3AI>=x?Q?v|5&>eapJ)~zbQJi!c` z*PM5szbud%TgL5dkXMDyx6jAVHTCh}7>r^@{StWe{wVk8ONK4Z=ws1s!fh?JsPTZ> z+qJW|gFkkE#4nv(%2}c>XE9*uQ`|9dml`!l2h?wNk2bTo1g;rusI1 z0e{2?&dwOPSy*}P({yF?=a}r?n@+da`?_GoyzE}l0|b?m>}{~~p))LiatiFL{Ck`h)?ZFOx|SYgo6g|8RJyoSBhMpi#5 z`LqxNd`|o9`e@d@spG6WU#IxPu zxYy1OEHW4Wj@X*`z4#mOaO?Qb_#3LLmnt*R8LUgSmm>o1-ATQC@e*${twFNshks+I zXJBVT{zTj>jIG$1z^k*4)6JUA=Oz*w4wigpGgl+uN8Bp-WAc+ZPCpPe6a^=?indm- z4r`vzf%frEitNfTwR|i-CC=onSFA6s7s5`$u1Q>y zz$f!a@EW#Je^F)Q!j#6`UIqAu*WA8~z8kU07M!O2qD|Q~fAXxf{d)JSbIW99FFm7%pU*B{kMw{zDc9ExM z)kt_*_wxDj>6{9s)=?h575y6U)1}HNAoQ1ctWn?mvl;85kFg(NTxOP1p>zbT?(zyT z?AGqzO=>(XzQE)v!EOFd@xu!@#*_22Qqo2xs#68tg`H|VKi+i9T2!*U->_=oX1(ku zZhG!DuN=phKl-;AER?5~c z+0>c^jhvi3vmD$qd2T#3B5mwd_heY}wR;afNqi0r_G_P-KVAJiHX<)Vb1#!+ICd|x z|Ddkzdf}_Q)se`>zf(tG$1W}1SX$;?5|#JX6MlB0^AY^yjlIF0W|m=kcdKbe!IMsZ zyU^dCcc|0TI`F%B2QoXiW_b&Ae`s`HvYCj#py(?~G$t+*AA7H8>gE8jl`uT~aM(v&L$;({9VQaCgCnx(Gc78<;9{fBeCk7Wo=vszb|Fqk=Gcc5@ zdvWX1PUeq|mE|z_pKtoFEB^h_t@`)#PWJk_4X?M^Z(I(NX5Uj?|IK(0&1(yXD1__i zSZ>DcDqeQ7YxzB6TkhO!=x%h(sn7ZPzRm8{z0tp8s!sKZF^{z)pZ+226MtS_2|hLz zI2{~G`J<$fxtF|O`RnOiVcn2^me_TV>n8hrM`#=S@o$6j4`C+K9cyU{0AbPqKq3Rc z?%^xacK`@d0)QnK0Jua0fK&b%O%_^*1}=XrJ`eyDB>sPaLh^O*0iX#VV~oCaNJjiY zIFslQe(It2nDTsvcWd}s;NChX-`UnLAKxeOnA#V|W}hr7I`8t_I?pcZi5{P9H1$~$ z84d>FsF+))i>Xf@V!-EIg!k2Gb)dY0V#`xjKG_=A^~w~pH9k$x{Wxgz9#GD7_$TNs zCe~gP@lRtsY{-83g|}08Napkk2++fX{M-2R;K8;q!Renl4z;^47c;lv=jsN-|4X9) zP=G?g>+BV6X`-5RwyP6SD2s@HVSgvye7RY^zyIj|-&xke+WPi`(W~z`smKuLAoe=VMtfC{Pjah*1rUH z9kn-XZnu@OJ@v0UF~Si8!=SrfuOjK8)Ax40hcaVpSUQ)7mLCHZ3O}cR-1^tegTZ9! z5@3IR#NOXl(EHx{uVx{Ns=LR^dhy`5w;yTf!NArPOxEO$^+w^@jhg}>gKve}m9kAI z)Bluf{vOhaqKXzC_-W9BO73r89o_!Zx#yJ_s;#j+^mF%qYStx9z$EM7Z{cfKoo4aH zz~K3Ry1Hvw(^vku-4iB-hxARigb(fxjhTf90e>IJ>u2eTB1V_z&Z$ru z7_Y`kDlmq)*3bixY6+uJ{A-(-`P?dlF;3G^t#305TYEvl1$iHYX>wOEQ1EPf?~V@U zY62NWTxPe41rDO`2kG zK@oqKZOgM1%yu@MaAJ|`GbPJ%7+C<#C><+z66+cDQR%0ChB zR>bA)1DbkMUBOC#$bukHL2Tt_+do{XM4Y)O)ovjuT6mcoxnzt~Y z8WA6bm1QtiBQ>|TiXN;lals}cmK{9W+MEVj8I<3`uV;jP#v_09)J+dvMzw`*)nuNR zLFSH?PwPb)-9H$Mh%jsm3p;P3eqK&@_lpFt?WnDpnJ=q;WpR-)?lVYaQ+^MWoCVBN zSi9+Cep-(CjqEz2*;rxp`0n=IR@B$I24pe={B>k&F{}}4Np>zbBeeOY$5!>FkBKQg zZGIgVmOtD!|Fm4Q#~7QXol6h>aSVnNKtre#WKcsZs6uKmLK~$J@_(1 zf5+6F<#GO0ANe}V+akQlk$DE@uneII0sfi_=Kh}*nRzI7o!Fl5{8;~ts941M8`=?& z^;UzU-164Q$X0;b4zKS1`k%R@0K{M9RPZrCK;KO|tVsk%ql-QGopW2*{Ri8Ljt|nj z=ekW9J4`;uRJj5Ps9eScBB6lMfo86@wf)`-z!3@6wfB7XYTjYW{BZdUx-r>w^W{ac z)xF5;;bCDox>--#4q}zjx~0%%nl78ZH!_DpVOzFNreN-h7-0zW%Z0X-hBfVKm5s&S z3kw(w45Wv$B%+?+=%Jbltwc`$&%A^xO6>zBRT$64mIkF)!g_NtzyK5cS~QJyNw4v; zs_keKTh*#IV)H|fkOiI@(5i#8@jd|sEmf<`g*DpXMvg+f6GIP{YN2N7jyP;pZsy|%va?QSn@V;Eh1f~zHVjDceRVzB_HS$73Z zC(h=U#r2jf^P%7~XT=`uAC@FilZcT=Ys|&BF9(3>=J(Sm7qu>JxQ$ z?Qq(bkUUdvzv!I$;))$UEKg=gUBebTn3XW4TR%FUfQKH(qz+W@FFT{TZGa z^?_Goh4J?{cDLplD%Sh^2Rhs4Z{9ccd~W(dT7Iu?K+~Ysc<HXHRbs6oww6X|fy)PryU$X3A}zcayB{8j(H+*Yd36(*(de$_ElbXh;jpt^6mw4w zI4sd6wZGD6jLpNr?Tm8g)^|+z%b8BCmwLQL>WFc@t!wg|o12ok3mQ8s zg0rRE9AGpmek-c1_45uoq%H9L%eQUhS@;h1pEYI0XPckfoau_@Q}7v-q0Leo(oI3Tv>G6jv0z* zr}04(B6N3^nLbn0ck<7dDn8`xOo5b3=C#&#_6`#p&7q++B64SUH2pAy>t|nY<`caI zI040a_Ms8^HDZEBPx9MIbAKIwXKJm!|Bja_XjmTfuCuO80-5X4UGvleF56LCyRjYM zn4lRCUEA3I{W7sf(1EQL7{6yf&sC{X_*rw+Y|NG!(5#zg%dRh+{k=KKp1Meq99CX+ zkC**Du6TbYa*DDS+V+F}c4T#DukMVZq91+zKVIFx?-V1v*4QIkIO~W%{klKzwh|Do zT%cI3>A}4Nn`HNd!b02dk>$$i!q*Xz#eEmconUVItrLD?57uW^BBxgCd7X40y8`Pe zhx@P9>PAlUiq9i=cA#?ht7;1i3(c~e|Mn&ROA~t?X+6q}67~T-{AuX+5apBWWf24@(teo>7%e5PJ)XzRDBW-8aoHFV7 z+Ud0&Go9UAne~bhTO+n+V=Q5?QGtOTNIay=NG#&loZ`Q42lxMc>oi+k$j~XNVmy}t zhiSk>_ml@1vT_66p1M_ER@i3KEnzp>vF#?lI`bL6b_QMSd;A{1FT@2h4}Y#hSNG?) zgb^pwVS`KT`C%NsL`ALy z*#V+ck)`#7WOGie(_j}Q!wYX9!->ZMQn>^^Sozp;LsruDalk8MfptmA(*uWu@vX9* za9M2!A73h@mHf$AxZmVR;h|E;wXz(%=Z(8k@N-NRZR?Qb$xh;>IGyRt9B!ZzE=1qd zS~EWdOkdiAHHBx-bI}{P_?`;D-dBuFE;L90KgaivaAmzRbN;hrOJDqSFY!Ws>+)ts zCjchZl@(X*F(rxVY@xsk8EC;m|3PGg?_qal>a9c z5%=+Uf8Ga8I{I&Dodsula%6Wlj++tD7(1m&7$}+gWjnxqX0~C%*(nM8d^`ha?1N%O0$Zo}^$kg=M2YW2Bw`b9n|2N`?Y@7?%5lsV+$IuK&jBX~Xx3o5c-mFw| z)$_RnAr=BF`CelTaquJH%;yI&c(qCKr!mzes_YRM{Zoh56DkZIWz%^U#kk-67#DMY zt0c>}mHt`tI;M-rj+qPiY`|Z_6tQb!eC8liEQ!e$bo0aRFokZ)ZW<=ja3%F=It5uR@=QJEoL2Yku~lm(*%UqV5)yjTp@F&UsH0oEjXCCk(;3XI|Z zKmkgp)KPtX5O?^fVZ8GBPVJKHs#q#uY`}OzT~1_TnVFd+25VSUI?}o$=fV6L zZJjo2&sFkVk0Y-As_WlFP}TNpH8fti`%l1SXWdo;YcKRHM=scn^t{taTO0J1mV;JB zQ|3jmD;oETTCzHQxSuxPP)sXDi5p5qLpFp`G9|;;fRN_tOw@3(hkta1Dj+L*#i^xtrGm=)LX8e)&iw(FQT9z zh!BLnpp_y>8LLf@_mtMZc%+@li0-BMqi>bzdm0j4XVB;;NlCITm~l-bKT{ft56BK^ z(l?&oU70%rP`UM~Dop|J22DpSa$P(d)K+3>Nyl57Y&~zAYVB{`i7INI^tCzh0jj#69q>#D zssmD%fN07kW4U;EqLdzj#JvoV7B;dL);KBHV^{3Q7}ZV`A1N71qH}YBP^Ew@hy;Ja zmGguKI#1Jflc-df%zebyuzhl zDQf~wfM+%uyf*6_$fya-P^?d5xJggdtxRsP!5RsjDDJB?)|qOgAxAHk_pCG~cC#-Q zlBib{Z|()q=rc9~BLq)ER0Rr-EbZXtCWi{Z;#;tfdOZ-5+=)e!XrKrz-4|JoNN!JPkZixy_B2(Ks8lCkH5V_P(Yc3Bc01QdVsQ#={I7)0+i`E7wY^>IXY0 z4cTq1Zvl%YCgi!mwS!M}nnufIUb;Ol9ld?B!qrGJof_jogyV2CFy)AQURaI!c#5*2 zjdDp0mzDb#qx5(dP{VST9%StGU&9F`aXW9HT$FH&dLiIM-;4BdxLkM&Wn=Iu_lLCr zgH{}@xyuT>ynO_~)hrTbPttsqyE(cGmxU2G3NN5=<897sii%02_E!1wGS)-mb!A(x za@+2WwJFy|Om}N&qj9pRstN|Ru7FGe%%eC=>)fY-CwQKArdE|K45?aMW(qcLU_b#b z9uhP$;%u&FVYs7W8f#bcdOcqf>VBmdVvb6}VsVXiLnhy955y59)0?ucf~sVpqHUIS z(Di->6NS;sa19Kz6)1>~?kN2w=vyrdD68baVMDGI4B0|&*xEr{aa>(a?kPR}>O;R) z*zn!u8{2i_Gc`ysYN@rJRb`pP9Zg}V^miO&_^#4VCaqe)5c-tz1Rbq{n;znpd>uj7 z7_2ouuIT5wJm#wm5+H3}NKMegM`6+{V&nY6An*1F6nz?UE!3Ynl5M=Hb3mh2NE;R4ZRn*CgZ^n1-eXdttxNs_W zLlMwY0f2nb0Z6rGN{AvFn4GMFrcNVt*t5aRKgFy(6Ic@!7S|BSnM`&@t& zg5y)2f@4`N*?A?Q+5k)nlBOx467@SZPAfUt(he9dq>k|}iXHtQv7_L96??5)S*rNjD7BAH!e3WRgn_de5q^MD$ZkZlpQQrOx0w?XIruY zGe+j`I_$58W|CsMx=uuK2Qa;0xSH`BFwsDzJGjh|2^31aT9)ZPxjL_pA>ZUE@} zp{}@3b!U>Rz^I|UKy;G<`9yj=nR7@{k$#=BD!RHX@-W<{Xlbq?Ub81-FY+Bp*~qpw zp3>gY6VrKGovVT&>ZzuOX&NeZ`>MI7Sbr+e;kodJ#!xezDuXI7+iP;hf0}>}dC_ZVeJuIC2i1i{Ijm{i z=Sn7C0G-71uI63Q5VdakFMWLsBHQMLa)HD%I&QR$*eL=+6&Qr(HRCzrFj6++0T_6y z)KNWty`w0E-c1tNIaptxugrw(HcycR6R7^uzYg^orIb5OT;5hMxJHhPSE{_E2{9^U zRq28iS`47`G1ac9iXzCcu@Hd)%c0JmzSq;yHSdEhh-J$90u-!15?&T?ii<0UfwK4O z$d$*Xm;)A^gk(+_B6&X3j__a7+QPvH1%>ymwQWk(rKm3XV|ri=nOQ22mX$%mVFJ=D z0|6M^`VC{Dg2s`9ZJ>7S&B+bRJ*7@vfftopK-KBJs!23jC88&$?`kjk({t;irB}qA zZgxokHnkW^h6PZ&lbJ#XQTE!7xUf(2siB6>U8^aKrKlGg;Xq)e>PG6)5@K><0C%nf z7h|UihfOU1x#wqE_ezvXLY==q-f-lr{d9}~CHpWBjw%duB^~zjD!CU|Oj8;GEw^O{ zah)&bFqFmIRQ+s~gr0a?qf^uS_^_Z>#5dF|z2TxXhvXqd&`?LiaRk~t%E5cGqo?M^ zsOl+KtpRHRtQ7U zAP9*|Ygh}CQ!kpF(kONcb$zGIj|*us)~}C-ye-9zvad5C29#V=G8M{$ONSiEzGXEU zp__VqB}|k2J;3q#JybD6*$AZfM$;_)=J^S3Wz~WE#hl3qlvTrRpa6|=>s7goGr-8h zlbJ*&73V8mrWj4Z3zqDZ0dhyg9~tDIwe~bb0AF|E@+C(-zA}ErQz-IZjdE-SVDIF8 zRV4uP5HG&5fYcOY=1w5tsJJu|2Mf^Wl0aadaG%rn5KmR|cp^b~BkN74K)G%9Qt-51 zJ)g{!JD)EDnWKWB@5f zA*yi(-8ANLijFoa+hyxX3RQ1e0^%j^K}rnk9V@s&?Y&lDgv~WIh!KMM)t}-JJp35N zh!?lxHp~1(6V`Tax+OS%iALIZyb6*8Zbf-Pu6g|Y%?k(gT@jcr&Fg{vvcX449HhQ= zA)zjN7=R}=hEy6=S^;_x7-ErB!Hvauba61{VFn$g0dX<+47xRa7ea5&`(JSj&e~~a zOBR4#a6m)W&d*QQ0#r;x_Uev<2SF0;X}CP;9--Ja>6@I%h4^q7#ny9hu50>@c!URk zHIfTV=gQG%{sbu#A z3Vt*6BtD)=PJz&U$v|A1-SD4SNPma?Eo;uWx^{?>JhA!q z25t3Ce{D48IKz~}Wo$2jhPi&5viBx7oqz0Lqy6jv(s#9sE6N-qD2jiBg3x?3+x`-h z@y5JRA*#N?qLUWIbXvp<(_k* z1YQR$XMz=nL}PGNbE*)RfrZ+H&xdl3ojuJ3ZEc>kAA*wvgcn<7fSDA^1f^i~$Rw@v zfOuz23>F&tQ-J(E@N2YfpY~Pjx+w|;NpILWuVuf+9FU-fZb2BPc!?Hh$eZ*1MUv5& zGGctl^^M*sb%D^mU+NM=cS`PJl(KgALZ{3w#`RG&hV}$EA~Q#RL{1IApcUdlgI=B8 zjDD3ktROWRQ_N6#5`&|O?m)`Gx^jR}Hma53QF|h9oNT+TV~A9uY%+Q%c)X_V2hMqthr}$?=#NhTtG63(8e+C(+ikP9K!mm5WMggv6Eh$-3fD@c5#l``<%oTKkK?_~{*ASNDas>b6?9L}#w8 zTP6dZGp^l|nCP|hcyF~(UZjl_R26Lf7Ctt%)D8-*J-}0Hw$7`9sC2TD3Il)z)J~9r zn)jupZg2v)tFJ~7_a3Kx|BRj|$Yq4(;Qqw(+C-SUg`QhC*vFL1%WFq0)i96QB*JFx z(yFtQ{3ks|q?NDe6Qm^hDOhh|38X7H{?03wFvI%u01pL5si?o<;0_kQ3b?`MDWmwa zsEmb14*5(fB``B78HOqW44<`atz;ZwaC1Uzr24_b+x`+5%tu34o21rYc?#Imtvzk8 z6|jD;#B#St?6vfi(IXunWAUu(4C1&>@m~o;e2KPArtTcrS8fJ73XMo~$VFl7o`-&Q zyT_=Dcr9uhC^maogo?mGh33Lt3(g`h_rZo~KTaW02R}}=!AhBR12J0RO$F1=rj)}< z!Ear$wepDs$@qB@dj`Z(lCmfM?%l0 zqeCf6!N~J@sFkNvjEB5o=qE_JNmZ?Myr^11sNho!!j*B=sA1rHU!MrxuaghQ^!I_&|7?jRmC(ELS1uK)dDfGHFQ(lkatH6&kTMQZn1D`Jqoz$@Nn6DWB z5q;bU%wg>nC&eVsWjQF_C7^PeZN*i#U*VLrQD+^DMz=9+<+x@V7g+Q-*gTeqsn$7MNXk!^)WY< z#2@xCX{#_-^|X6P6)Kz7Il0|t+ffrG*=5IN;?r-N-#7g51wgBmlyBR0Ol(Qy1D(ox zU!RHd-4F=|^xOdaa7r{d?@q!LN7Uqk;92ol?tsJ5X4M+DG=6NBroM9D6@eJ!kbZYp zFFICvkQMF$<%h@iwK*eKB43}v+FVy99L;7jxT7#W4{HsRC6~d|S1C^tn$2-)O{i zd0Jt_w8L`v^fOIRTK|GZ9VMd^b)+IBMH8o&WFacB=&R!c|9Cj9y<2>RRnUv-kd@7S zECe(5OnIu0;Y`AlTU=7tA;GdWMYFeMT|_OPc>X7a!hmJE+zN`^a%Fqh znW)^}&01f1vmlULaShm!QHlHM5oY6CcEkmfvEZdMw8260{N^>2fa!lv=JmKS?f0W; zOPUFz3o$!>uT$b&{DiaRkKOlXkKg8gLNV~%@>{q2ZhI=8jKzw^VD#*MwvCh&J^F>@ z29_$-&)fd}&lnl@9xg=sB8qt?6qtz@m_gnDoXAAENlSBlwIMMk!b&)#tC$5QzcZio z-eL$TFG!}A1y|c0KNLGsSYh6eg>nL>)kh7PX)lW}NHW*`uVoWo7k$_A!@VWCyOzc} zrXM${X9WorLzQI*e%zZHymPVM)rzi?qbAkMfhlNJgE2VjE1!9D*7_NF?{2TKTm1lR zE~)0*SHejV)VM=k26$~^uCa^B>C50|K;9{35oym(@Yk`BD4|P{V z^f=aOvl#+v5v8hp$*y(x7+!%)Jf0AlV8Mw?7V0dE&2-Kj`OiQr!tc`jx)+`+3269| z%gnoMNNy`VYY zaOR7KsN~%Ci!jPlKuadS->viO!=!w4u$n7db67Ls&JLgT+R(Wc6qP9AYMMu7ns_|? z<@E>q&MuMSFYyapQfpWGJpXt$_i4}hj_NoF-})y-;LrB90uSPxGXyAVHR!%zn;dq*O6O`y0ERw+rYH)5y; zVYWoZ%-d3IOKo>4`_6}{Ns%O)lq%G9%FjY*71vHKQ$u?qasvX3+!)MX*o~$a8{gr{ zoQ*3+4W`XUj0K(vTPi;dKc6yC=;xf|qG_-*yL-PGcEyG(&OmE=wRMMuQ<`*R2TK|j zUCly>=9f{wvxBn`?LpJ0;=Zje2ok33n-f)e(o$)ZvDS3_TBfd4>LOueV65-!$V6w# zt?`yb_SUbvucxP5!;hKMl?T1%E5j}&gO$=vER#5kaxqv4g+Ix(1v~R1j1>xaY9{t^w?ZHVBg`#?8u66HJGCq}tm=ab?W$;C*M1+PWz3-TGo6Mq! z2n8nW9o$W%KYpu-m&)*0W>Q6@|JPS zda}V4CMR@;i8g^%ZcbKJg|R-|RQhS=8qLY+;o6184%G**I+?>Nosvy{Esd6VK0iXn z#oFSmG2h^M5LJG}M|)0HS2dkveQe4%-UX!8Z<#LdEONfIMN~~<073R6m&R*Htc~p<4 z3hGqn5j>XQKG^vEpOlqT*^ed1iTT|KkIWID}os)xuthg}eqOFl}Wv`@U=PcbV&@@4r2 z2OjyzU2>K8NM0;IBKv-5Wbo8l*KR;Uys{4g5V!u+l0|q*R~2V2&(twqSqdrE2gY2g zDLdRxI}9Nqbemh(V0NtW5*L&5u{h; zTgo-LvzXReR#Sy_Oe2vkAPc#(oaWEo(UySbT!hV(+Nrw}RveDVNNX;XMo*>3vZ58U zRRZ5O{?4EaKpzW(?U}AtcGjcJuw{lRYw}n{z*CM!x%x8OJJwK3?W*eRDlPZvy1@9D zflv*;Q!a;{7To2He^#KZ0MhPT2P5X^T+8HY@WqW@*V#8eADPyBiO)Ik<=qqe4=Vpe zncB#G=iTYP&cH_GGoiko3j`KRmQSWcsk&PO#MnAY>bdhtt0zN}Q98e&wRWvXf$Z=! zP!PB~_vp@TFN%v-T>w#OE#@nQVs1`JM4x!yAx2SpAD%YUnFi(*O~wDhUg?b9f}#cZ zU(MAg`TtR-+Qk4$!xF!8?%teF)Y%QeM~W^a)9_2$`XvmzUS?^_J~t{Cb&ZAWqVyXd z!7OW`VCNklQ>%d}K_F*1LVp})VNOa)1{(II=%Cu9Q^;HjhJ!=j4X}p~1x069c}c)+ ze8;ImpxVVYVn;?2#+uH|W6X+hHdA~Yq@$vd_hWLtNhzkW$$;swq=$So&@K=rbl~mN-*Uo@@!*5SOY}$ zXWuPHh$ZfjU!!twNVHWVzMs_FlsQxV#nq{rPLKOoBA_nWu}p&AnTy2PkZ*D*+j73) zj%@t!-{pAMUj#_rTsHAC?`4|!r{^# zW}cj=b^@A)aZ9KiJPDRQgr@^vMJ^Woh;RrNg{xe}AfGO=9FAeUnzp8b{927TQLDtA zO(~rke^1x1UJ2Ig+3hWT;@*oBh~Ku5WEVn5tU2(}x~c_O*!2{ z$0TOFAi0mo`XLK?4s4A8R~z6*lx>O=!Kn1i3`Z!NRHxY9d=-1WWo z=M@6O$U`CDnO|IEBpCT=5=$u5@ZLj7Qw@3hHSLW5WF^$S+H|YUKm~ z1osXFn?>@-ToCNPUFGNu6QXC$m|Zh5$5CX+N5gD9k3cQ5=n%>H!>A7jd1x1OwyKi{L*qW(%V|am^GY zQnl>hrjTzcB?_8$wOQp>jp3R8{R3`5`ee zy<|P?{9s2v_ymqrvHFl=e;tcCB{Pt^Z~UXcLe4s}i- zkc5P5s-pOOz^!yMRU;2xhy5?KD|VotEz=}OPDkNeenUW`PFoevVT?LL^{wBNkcYjA z05}3wuK^}@$3sDYZqgICya+b#?IcKCWpa>t=_c^?Kx9>OL8GV9&Ge8W8_M^ozVnc7 z>-oX059_gfIT`BhZAo&EFRNevpt?Z&oL^}!9+MVsC<(xM++SUhBe}nJiQ3a6=y`ta zy>OWm=56rMbZ8w5duwmteS|D)m!3g^pHn_ms8)h2$n`6F9tc-VFyD=KXwg-|?UDRK z>aQ3P-OV?@@g4rfy|LbS&i+Fw(4pcAHs_iPCJ{O(w2qe~tUxXz-N2Hc>Q-8d=c9zm z_gbnZS|_Rkh_B>Pxq;VRHG4FBgyMLwgf+IdAGsRw?ezOA5+@EtoM2L5Jj5J#QKG}M zgR?7w9nKa_xt^~?6OQw_F*P|@n`+9N*xuI%pO>L2E50C+?M@li1+Vnsg^bHHof^%g zew@%gSFI$bx2=?jHB_nJD%s*V-#qa3Uln%_jf<*!h~VxQqf|#GnZ!_l>s$va8gE;q zKMH?Qw)Y6qSfO>?_*PV+xykbULx zY4Z+T8A^Dgc|&yZiy#aDNW&g}#LSz~N!!YU@mAydU1RRyk)h%pulk04GRYry?=3;#dV;e$L!awe)^Q|21)e;pxx;$iN6Z*f+?m=j(dc={AsdegpMG>++22&R5&~t) zOT2tS{ZOvuz)tDoL?bvgI7y$ZTO|NB@0 z3Wi~~n3|gZ%z^`AuF$K;;J~X%0NH%;q(@F#t#X;?WKK-HjOL2*G}*v>ya_%-QF-t?PS!HacIv-8>#gM8%6 zG|=mKuOlU~y3G=IRJUc#WwlqkAs0ORx`NWdeCPJc{64j%*z z#BUrvBz=cJ)$jZN>zKzV4p|Y$G0I*EZ{wh2 zM#vr^Gh`>*If@)3E1Qr?*_G^ZY%+_Gb!?J2_OZ@6zw`P2{s8CoxNq0>yq?#3-f81) z^tHON9P$o8SF3#Jd?cN9?-EGyT`_&MHo{a(F!5hx#q&p5he?%fV*EYbIrJANXnQD? zdeT!T;bknhS>05Q%lA*YP0-xiT^ow|^a%(vbMQNOUWIQD56 z&v~EOerW6Nqmfp;`xcpLbY=#O)IH3Q7$7wX{5j@l^ORbpRU)-Zp-ixM!<<~8ySJ9? zsHrWo*}kaAL3T(~G$FN4?6r%qTo6{SC{5ip|ITM17g8*rrlZT7cNWFtZT&7+55Ygo z!w}^4Jk`2{P=NQSzjOVN>QlS8$C7wN^4s#~}*lyzrafVvvmQ0XGhDtCo22g*2!6z86 zf6+@|SRbLsEaTgdmfMvMjD*Yk@>05<>K8X4hu|{ zG(%6k0E2#e`?OUY%x&g_ujDhiigX10uH;SAZ+|EejJRe=$fVCR+*VHhVfz(Z9Z^xx3 zFqb3V11FJ`x8&}Yl-q>}QkW}3Wa&VcEM3UgOE?`zR1L+Ym^!lYuQG@P9I%AIx=Q5Z z`IhNp<8e3b*g6jKq@3P>Q$Mq0You6PUVNQbK&4VA4KbKlIc~u8yAFBOuR;3TUq9CN zzL>HJA4m+>=_$RE+s8ATVLjDYZgWTGLuKQe&2h2m?x$~@^FDnwcAlMO=URR#-gEoo zO{m1Kh=AA$!HQYv$GFv!>^t{TSersj zj4%KvgstNVd0E-ohMfSrn*R2HtB9v_&)n2b-e{R!X9bB1b5u}>rVs|~?$er1-tyxU zd$GPS^wHVC#6uJ~KH2$rCoWtzaGTqS?y%igOzM4^wqhlg=TR(orB(9Bp}Gb`TdykL zx%&v?f%iSXY!|~S67(I83@LI(KKQ)3BR~mSoHKmQ?$DdQHLTK?<1CI6mkYxg=C>SU zv)^+A0i8SL_cqtJv#g$~gW$%>gQ(sW9T4;JRE6X4md{Xf`@hFsg5tTi49U%L_n-AU z;NQ8m9VOD;3x&RTFnp|K&PrWFFi9zHCZLtAxL3A*(&nzh@+X!4N(u$rCTBp)Y73i3 zgPK9Gq&&A<4!t+hP+u+Y^A@1j6XU%XjivzjF=H>Bw9CRiwPiu$(Nq6Y*se5nAW(5X zer+7F8J$Ygn1&eOC#U6xG+nYL{r58)E}D|?t+zB0cDqVc=!5~m73tu_G2y%_@Q=w` zGHES@t9{6XC5lu4S-hukEdstzV%X~kSW{ymkM%Y!1^e|ePELK%l&1cM^pzmyT zr(SF(lSz99kAxY6m6Nyq?aBjY0feBnE3N@V+H~R*&Y!WOllTw&wH| zXhEnW-2)ey{cpx;I_K(U7P2O$JBH(tp-0gfvCxm!AsQ6w!gMSNI_UAA!R-6PPaO)& zWN>bQ_qm-blb?(}as$@WhIzIc<{swc-*KrHXYv|M`u**={TK_`i%JGBo||ND&@iK2 zCghwY8pYsu-j&G0EFb4I*;d{fwHw12D%1|Hzw+mM9gC7?Rh>>P{Zqx?u@gm!(AH0h zu~A{FKB^a0|9w6>K3s`^rc}*93JzAk_Ol#TQiXS3Y^lcwiru2m^AWRp2{z}3==NeJk-3KLvyMOr@PBKx)%(o1uB>`msE7pt$x9H=mJ8z4j#OIy3VMhE*PY6*#Ec3 zSWff_%%$rAx3PvvsJ1jBR!h>A^+2Fb6zpL@i*oI=GhFg~3uCeD``(q{&$YkJS^33y4=WzbIMd2(L#ybA4DnjMt3In<#Pm&75WT zpE!bLxqPyQ_Bh83HTxsS+v)zs*ins#41zfEnULKBPy> zQbHIge+kT(_fX2d(28}X_5ey#r8}G7*8b%&mEPoG|03VKh~vd(y!-tm$MB~redaPG zGg|B0c?*3?<&)+o-AjSZ%CeSW8iuulj44_-;*HFzkao3~f|VN5Kd@mK)Vh$FyE}5 znaegFcAooKFB>5v3ksFrDyK>*wqzIfz5{YS)@Ns7r;vdsm6?C|EALx*4<@YGdL%J4mFg75K$@J8vKm^} zA%&@n+frr5qZrag1_m8V zD(z;!(qbNpZ9tg85IGeFu%4AlQm$Ng#Gq3?AN}|G02*7bUTkgnU#j{u%c=E?F7`a@~_Jzp#Nj}234(k!s&)9oF=JvHc+&!13qsgJ#E zeP{D5CZ|#ejp80b*DNG1u&Q0?$9b*@iYDuqP5C<4irXCQIhH>^qt+bE@rc$fSt;zU z6sd8kF!)vK=Cey4iz%$anP>8fQgLlen&l5tm}<=)jMZ2)948xtKkwLX&#|!Jr%t@x z-Arb~ybQH6=)!!_1LDRVFflui#S=7n67IjMr+XA>)w5PHXf5Thw;+z8fF?66t-hL} z9uKyfRbH>!ZniHUpTl1C4c}v5G_%3oEA5BH2x*GXn(OspIjH?vMekGd7fOx!@HLGlSojIEWc6Jr4qD$pyw< zsWCHw(F|w~fBFzVhW8LNj_*jEcwD85V64;ZdV$XUQ%e*0;k<3$KAGSbXz`Q0LRk+m z0%1qf1LWRnW2w`x1l5PnbX?AZVvq{IvVkax0P$I$XbSQ2bY|QtR$dHtAoEV+J(Mn0 z_ba_9og&Blb7~>oq?}fj>nUzl%+awHyeHwgm1Y_i;}0cv3%7IeDnvd+!ry`d?60c>*-63fFUsTq6M4rMyU^blm3Fq@PsMW-DB^Tjf@{ ze1=)i(nafrXo8n!EeEuBQ}_ z8TyjQ{npCLWqjTK-TR*k?7@D?7dfLz9}SsKmprb#e@|Y#eX#X$lI137`3v8cz=Aoa zb*b$}83Of3tc|spg*>9m6O1zZ>2b1qB3bgpW>SBCppr9CTtg4hT-Bp%Bgq`-TU9fo zm?>1=^1Nl&Z45o$NE83+5{M{RzIXaNUvmFf zd+?)(i(OYkclGy^FIAoFWcfY_m$Zb_0Lfbw>v836I2f*bn(ib@@L;O0!bT02vS6q+ zWz0o2AirV%JF%8t_N#i%zG}2slF9mn<;-(q^#QShiVo){>xbr$+#G@QT-5?=RF7&- zj+Mpe`UB3&pwD=<4HvuX=?U~P6l>1#oX2@G^s-C(Qw}DsOh)Pe@FUEJE6pOl+3pr# zo)aVX`$3Kpc@AveqC1-l^2NzP_1`^*vvF+093cx*AXb-mdUm$cj=LwBgn%qBS5OQN zvh7hAQ|o~-pub+A_KGDq#oiv}eo@tF5o?seDPf2$rg8kVJl*3}67&%b;AA7aUKcMB zE62Xv4I${J+)o+QACTAWj@Vx}&dt;q&TW66X%#wSt5zC4#Od5@{`|IogZv*8v-mv~ zoR_R5ByFHz(_J?=7LTV)ew{LmNvYeU39QZi;W_%ac*vq@+z z!V{3YV|7zC7n11VM&BC@wq9)>Y0wgS2PuwQJ`XM3j@oyeuUkYM{iNlKyo_B9;O|L+ zhcz$iu*)sqEQ+8)&rQY8Y>JFq=svaBy_iV%k(>`)tfx-qook;r3%u$?p>Bh32SXD+ z*9$jG%xJJ;@!Bz>+-l#z>$|ycOL)H=-w@5^6q_K=0GSKPS-xa$(gL~I2qA>i&`=l1 z>rdnbp$C&P8_(>p6>}f+zkt=_2Uw2GAp#VTo;<|YR?d653FTGtZ0p;{U%#%@x67ON zIKjBPhZn9eo3SnbR2feINIH}8v`b)_y_952L2_x3_g=qT56%wxAZA3w4JtdtL`a-VPwXIQHX8H&*} zqi=P~WtR!WoW9NEusNhviA*xJdTdyXa z%rk+GPz)xDu(6FHa*HnWxW5#r%Bf|$03|)hOhZ|T>l?%0@c>bbe$4_)@Is;(9cT&n z{PL{_@~biRO)fJt3IX!eD%bsE-madwN{Qj5R8~vGRp*Rw^-yz&muqaO1_)r8?A8Oo z{KE`R6(zbaZJc%|O4;_m_`Bpv%vDJ*E8W-pCKC}hck)Rc3Zdvyx&i7}B3t5>xr>v4 z7S~?i%bUp6hNx{R2jdm^p%H0bRhimJr@Q}hu|mg94=Rai@NDqb(!B* zeG>_ObierJ?UD0#kb>)! zVU3VGwruf z%C(i2Z8cLW^J|FZw)cSslvG8OX&_emzE%Yb1S25F&`>!n4f}~5zKkl2iRt3{dGV5( zmyV6?u`~1x*}HOV9-Yffs|8n216=Aw-kPqL(c8hoBp~CVp_8dKl=5k(E=od+jUs0&>_n%`EVe8$vG!)Lh%BY_+Ri#DB#2 zdbDEO!!Hhz#Kn69dL8Oq_4T7%khE88JTLf6M2{WQ%xfL7K9v;4=xbcNa$QB$HDmr8 zJPApLWzdOF3RHqw-g8-Z@U?shk17UMGlSsD$Ccu$a_QT?qzw##iTDvxPhS?DwUHWdgeix8CgQlmNfr4F#9{cQ7;=5i2>wdbNK(N` zyx3#o83k%_EapjxR6{t0OwFy%^MkpX#@=Ja^Qo~%6ZaK{*2tXeAn)R#^+3=Q0#E$_ zv)kychPM>PAIfK~t;}=iaCk`1I9Va+0SbRHbDnGr(S8ngp%cIM2=V+=w+e%W{>O5P zUppsT->lpPD289<((C7@4E2tDyFC%@f{PS+kQtwm_SvhYs9S6oKgZHPTR?3hCiaFI zAn>GEza1{;C4#Lr57#f)mR*If1m8+x)J8oIJg+Z{gD>_?wMZKU=huodM>q0k8W(*0 zQ2#^QS)BDiRlR97@^}Fzsth6DEMaK(YWTI*@X*WWc%#)hzq?6b1VS5@ zoV30L5`;wS3s#pi>SUo^ASP9Qhc3So5K-#t2EX&$!;X)lMo^O1fr|R^DuJah-VKMX zI^Rk!gg2FP%6z${-Mx4vD`P%&(J{SJ)0F4`1Wv)WS4|FhxSm+ zE+XU1?_u;G!P)aXs#=z98509m@;5<_Piu=v4y;*QuNj${r#KnK1Jk_4sy+x zFh|TH%_k}*qTsGTYOdf?t$N$vZg?mpA~uvH9>G?B{@zRiKEa-Qv_CKTS}bO6 z?kx1F?jCmJ^OOJTOD{fHx_wc>%v%IRv%I`0NG&&Kest%)BZRR$?{$$ROYE;ZEeqzi zSc*Hmwb?bw!0ghF{MwSY%VFuCKK)+cVwm2$;+J;ye&gj=l-J)BU4`J{4*?_i*%w+J zLWz!Ur5w=l5;gxT$I=aXrgic^V+InE)SX-`b^=Gc{;MaP92{7EMz3w1dqToBHNOe3 zS8;Kv#|(2W=ca0TUHgqh9f?6PbjuufiT=fKiz7=>q}KbB14W`sK z5IMVKmB(JvKUz|!1950HaF~h=Tcj2w9v^w|{pR9D+u}tFaucWjNwnZlG6uKXFw{;P zo9!Xfd)5 zO4DE`-bL=m0ZT;}5}0+SOCtQUZ$F$g7q#6GIoAN{KoU7fhkU1Ui^$}k%wJnyD5f^y z`*^cVxD&xOPp=DVzEsk2vB?-=EyuQntDP8fmiA&BsC2Rn^R<#>O0R%`;)oa>nDG3Q z5aG8v?>{~EawE4j zhea0c6&;-V@)PAWNis{;XYTPxuU@=*B;#HR>!p1v-h;T5E2c{cfToRC62QZP8!PMf zrAOoffhbr!f-yko;L`3DrLowi-<8_31SK8zw1~ZBTCy_P&z1&X(%%$PqfYFVjb|;3 zu|j>|FKGn6-%m=JE44lfP!@ZG_QuNnJwCqf;q~vBXLIo^nA8eCy|D-a$b6Us zLnyjDk$EYt?I;XgX1s|okKdDS$o##fG?K%a;HIeIv8}7(o};8*wJ*18Z~n&9=HHw~ zQOnmh1r+TeHE_?fLBNge+QKHnDeWra5j$i|id^Afl!9h@CtbjrVlp8Tmr)o(9P+>@ z;!pv3=wP`<++!jQFkN=wNfnq)JaL`x!o-^!s^Qw1_a@e)Ow>HIrA_*~QQMWD0&=^z z+T{74w;vz2x(hvG11~wJQUhk|-kdCQ6NG}zvk!AhpO=oTna3KkuXO4K!S7I{#3YG^ zwZEcriFwpJK-Sgs*>qu3*Z90$A7Xph<(2KUJW!5a+3HM9{a#{{3Nd)9TmhWCvIKZ# zPO#s+t+_VmQ`)}HYqLtg9yR`(&Yrs`cr<0@{&OL+KQ$GDN5FptfVxDCkBQQ?ui;XxFYZ`VL z7RMi+Ea#`ls))%kK)$kkDeWycNqfAN9MAbhdO28|fTPCnF3mwn5-9KmlH)Qw3B$fT z4JCFCVA6{XyI-R-t+8`uT`w{$A6S}N{2JEOmayBhc}_K4ce@2;j2wBs?t}13h-OVY z+L?}+t2sBv{6(JEB2UKbrB27Q+sT-B_6D=*KxkV$koX@4ERe?2w~+W?d?@fFw6k-_VAa! z#AC7+l{=9Sc^*s{T|7&S+Lt2!-$z@Bg_uny(p&hcGO{0c`eE_B3bSH)nF84_I=vZ1 z$Zo$h7dh>ZTBy0WKz2%zH@--JYR)Fp_82hh9E7{1*T_Gc#Cg(&4%vG%Ya-UA2)&q7 z9n5ApIh%{>&#A>fjNzAnVUAcy>nS7-xCM$72S4ctmX+IAm2F;=_DDzlzMDyY5ONq@ zxW|YYV?=!Q%Xb?ly&x@<9!J*ro@M!lHWeA%mbj%^*EF5r{#j{yMovd*0|)bNJ@wWr6Qy z-~WzV;&8Ns*-{|skTyvnqq#DyB43#;3VQC|zP3!d^gY|eMxCF~MlI12=b0|80bR$k zh|o~&Pl3t9POy}6&O5vJj%fjdBR5=8d+Yn#i3O_>bqxdh(6y^~(yf`hM^O~02KRp? zzIvj{kFOQthy9BlRdr)Z4We|$8ZPBf4H=N2E{nPi6hieO8U?)zcndNiY-y!rEyY+#bRCji?hTYO^LBuZm9!uUU>P z+B_4~&=0C+h);gv$Ut?40&Qb1Z^sQu_gabR46Mr78Yq?2FO`tu4-l>6`jXK*IGk#5 zD^ny_i{9TaiP?$iUypa8PRP8j1nt^e3yrnv1l{DNzu-~vh2|!irH-&?JF|JS7V@3~ zVus^>6fnm_ZC$~&tGwEX*`S^|`6>vy2aF9DTB%aMLJ66C8AT!DN>yf|kUuD1CGU?% zx7$gAZsbxgJ(h*My!cj|AR|VRcP4!+r;L{9aENh>U|w;CV%Po1??tpeAVkGiQ|>YL z-BeGCB%(BcB&a(@v6eO9xD)x*HuvW|#fu-4!y^2Ovd~AkNoW5ZkXMBPHTZBfS$Wyp z7dcdQU-fu4xN$eA=Hk!cXv=2X?(t}Fs~3q#SY5hp*ybhKR2O#Xf8h|g9P9ojsDb1@ z)%Nq1&rwc)0X`pdR(v=bK712?EP{&R>?Xi{7Ang;8>apaIS>zQ7tSsEiAP5tRd*(e z&UHpv6-N#4!6wgsTWu`+e8J8c=El@M6Y8Jv!6#mv>?lW^?wJxVOp8v}Zl)+J1P79~ zxUqkdl;=S}My<)CY6-mP17WQ`ZFnlp71oW~>Elpj$m9K;dZIvvn()zw4f4RR!gZ znU>JIrU|ZQa5Vu&ktA z91+{rLRO6F*imB5psF@}1HQ9HDR_nI<=F(M~JFjS{KU^Q@Ddu z6^lRVu?t^Y8>SdAdt*(GCSC=tlfC5fTj8}NIs&^Wc6yNG1 z3|4&H^r;X~CG)D5xan@J;;$o(n4s!mk8i${$`r|arTq0zy~SaOy3uZsQ74l9((8{h zKzg(9@t60Dc35mbA8X+i|NoXZQ3z@1w`Wk!yqa`5=p@$pcJHIa-Qwl^7>#Ep0rk>Q zH{$oa2+r-UD>5O0|K_f`^&+PR<>w%QCT}igYu17-L~ZU@2IK(|7a^T?;ZO#j@6LPr!o5@ zgo~4)AeRQLG>bdMXB+N7nC6bK!E!hJ8uQZ2c&Loh_l42sxoAq-sqN!%>|tS?${K$I zh9E^;-*za9QN1mbDGMnLU&JZ+gbvx-Kbx7xo+SsDZ<(=oL%Ig=?PG05O2-y)Onk)G z*{$zA6yyR1L>`i86cll-hd$wRa}*uBSnMX8be1U9zP3o(3GZ*W$!IM*zSGb&5{V1O z2g!XZfi|m2wm&;7ZQz_DcRL$vxWw~u`7Npun6|8dA zAuve)>+r;U^9|chtxxB>ZdD6{AMR%Jg<%7W@aLG2g|VW8!`T)a+75RW!q&wJAAUEu z?II3-xg46Jg!?ve|DtD+L|_<&laeNk;G4uvyTB27DHT%e#J3;V@WoHs_Jb3JC%-0q zf@eoZuL2QU_Z-4-EsKX|W0B8P-sRedj>un>PKvfrwEQf?_~ny-cs{=L7 zMiMtIFSo>e!YfQk+mX1}Xvq*_pxfskS@&da_JnN66%hj)TGx+}e?KxW(JqpRI%)^Y z_asBN?cad(8EZM{6rHRZr^}T#{iuq0)k;jec(^D_f}lx)W~zc8R5C+rO@jFU%szK) zvZC&=Q&19O66ir0%bN;81dY-=L65hefzS`w-9Ahjs)JprlGH8dG}V7`zVzap(AO^A z1*@{VNQxV5AJcgJj#q&R(or2@O=n?^+G}gX$z<}#=3UC@FAsDIH%FYFn+>7{0d@5! zufLU+RU}9!?-jj`b-qm5gVRRP_e4S^VXfDGk6?FC9iJCbhtTv9nuD*>bCxjj$)>dH z$W8#>OVDx{t7lI!eUKba+qwxq$;h@#`cROLj&I*~6TAEDihCC13mBqq#-mmz3~-w+#Vl z!->Gci+{ALd!1DyAyssNIcB?0HhxCgv@a zz?YY0dFmN35cB=e!9Xua=L1+0_*X@FX$EqgH<%Wc68X;=7uK)LcaR!a5Hw{yt?aiH zzDV%#&eZ$GUAuU&i6lN^3jf{9@$je}-_8WGeM710|F>=7Aj6dR{Bs=H7hR=7u!kQ# zG}o#LKgpI&XB4p#(4=zG^d{l5}c4HfxXN4Kf|sd7n=h?jDW&{UO`_Je>mr z=II#W_la2Lb~xQcMh%w1MYP@o42lG|Z9l{zNf+=#uCdFxlt_b^khyx4pzM0(Us&H< zjx&HN6I>}7UwHCxn(u6Ywr~G9OiD;nh;;C9H{fsCN8)yH`{9o`)uW}(7r@@SRHO)G zeuce35kDU&)pj(_p+cfAFLy(1wc{`9KEhYGR(<;I#|h*QDqOBR@V;3CqfR!g5iH|; zs(2-`?>E7l4$D3klJ5o+k=@dYU%*A3cJo~Yke6{|Yk+3;L)?K_FzFrq{2l3N>0@D7 zL+x19sQ_}@e^d3OW$|pP)LhdIox#kgOa+SOzN$r2%q;WbnPpIMRdGdJD6|j2HZlf{(6*WX^S;8#y{0+KmP!fGKY9^l^^73-b_VKv;=ex>Zl{4?mo2ZlN

    2k@H3O2QX&(mFRKn`gOR{5Dm&1h^ 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

    JuLu!KehuMUzh99vIO$A3>MwI+^T6m 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 N002ovPDHLkV1hjR^9TR{ literal 0 HcmV?d00001 diff --git a/src/vst3/resources/background_2x.png b/src/vst3/resources/background_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1312d4df5df361202192ee7526c440a5fd6cd4 GIT binary patch literal 538360 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