| @@ -1,3 +0,0 @@ | |||
| DisableFormat: true | |||
| SortIncludes: Never | |||
| @@ -15,9 +15,9 @@ jobs: | |||
| include: | |||
| - target: debian:11 | |||
| - target: debian:12 | |||
| - target: ubuntu:18.04 | |||
| - target: ubuntu:20.04 | |||
| - target: ubuntu:22.04 | |||
| - target: ubuntu:24.04 | |||
| runs-on: ubuntu-latest | |||
| container: | |||
| image: ${{ matrix.target }} | |||
| @@ -43,11 +43,11 @@ jobs: | |||
| strategy: | |||
| matrix: | |||
| include: | |||
| #- target: macos-11 | |||
| - target: macos-12 | |||
| - target: macos-13 | |||
| runs-on: ${{ matrix.target }} | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: Set up dependencies | |||
| @@ -61,12 +61,12 @@ jobs: | |||
| wasm: | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: Set up cache | |||
| id: cache | |||
| uses: actions/cache@v3 | |||
| uses: actions/cache@v4 | |||
| with: | |||
| path: | | |||
| ~/emsdk | |||
| @@ -12,14 +12,13 @@ jobs: | |||
| include: | |||
| - container: debian:11 | |||
| - container: debian:12 | |||
| #- container: ubuntu:20.04 | |||
| - container: ubuntu:22.04 | |||
| - container: ubuntu:23.10 | |||
| - container: ubuntu:24.04 | |||
| runs-on: ubuntu-latest | |||
| container: | |||
| image: ${{ matrix.container }} | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| - name: Set up dependencies | |||
| run: | | |||
| apt-get update -qq | |||
| @@ -31,7 +30,7 @@ jobs: | |||
| run: cmake --build build -j $(nproc) | |||
| - name: install | |||
| run: cmake --install build --verbose | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: linux-${{ env.PACK_NAME }} | |||
| path: ${{ env.DESTDIR }} | |||
| @@ -44,7 +43,7 @@ jobs: | |||
| - frameworks: OFF | |||
| runs-on: macos-latest | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| - name: Set up dependencies | |||
| run: | | |||
| brew install cmake fluid-synth liblo libmagic libsndfile pkg-config | |||
| @@ -59,9 +58,9 @@ jobs: | |||
| run: cmake --build build -j $(sysctl -n hw.logicalcpu) | |||
| - name: install | |||
| run: cmake --install build --verbose | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: macos-${{ env.PACK_NAME }} | |||
| name: macos-${{ env.PACK_NAME }}-${{ matrix.frameworks }} | |||
| path: ${{ env.DESTDIR }} | |||
| mingw32-cross: | |||
| @@ -70,14 +69,13 @@ jobs: | |||
| include: | |||
| - container: debian:11 | |||
| - container: debian:12 | |||
| #- container: ubuntu:20.04 | |||
| - container: ubuntu:22.04 | |||
| - container: ubuntu:23.10 | |||
| - container: ubuntu:24.04 | |||
| runs-on: ubuntu-latest | |||
| container: | |||
| image: ${{ matrix.container }} | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| - name: Set up dependencies | |||
| run: | | |||
| dpkg --add-architecture i386 | |||
| @@ -97,7 +95,7 @@ jobs: | |||
| run: cmake --build build -j $(nproc) | |||
| - name: install | |||
| run: cmake --install build --verbose | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: mingw32-${{ env.PACK_NAME }} | |||
| path: ${{ env.DESTDIR }} | |||
| @@ -108,14 +106,13 @@ jobs: | |||
| include: | |||
| - container: debian:11 | |||
| - container: debian:12 | |||
| #- container: ubuntu:20.04 | |||
| - container: ubuntu:22.04 | |||
| - container: ubuntu:23.10 | |||
| - container: ubuntu:24.04 | |||
| runs-on: ubuntu-latest | |||
| container: | |||
| image: ${{ matrix.container }} | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| - name: Set up dependencies | |||
| run: | | |||
| dpkg --add-architecture i386 | |||
| @@ -135,7 +132,7 @@ jobs: | |||
| run: cmake --build build -j $(nproc) | |||
| - name: install | |||
| run: cmake --install build --verbose | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: mingw64-${{ env.PACK_NAME }} | |||
| path: ${{ env.DESTDIR }} | |||
| @@ -143,7 +140,7 @@ jobs: | |||
| windows: | |||
| runs-on: windows-latest | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| - name: configure | |||
| run: cmake -S cmake -B build | |||
| - name: build | |||
| @@ -13,9 +13,9 @@ jobs: | |||
| target: [linux-x86_64] | |||
| # TODO: add PawPaw bootstrap type | |||
| # linux-arm64, linux-armhf, linux-i686, linux-riscv64, | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - uses: distrho/dpf-makefile-action@v1 | |||
| @@ -28,9 +28,9 @@ jobs: | |||
| strategy: | |||
| matrix: | |||
| target: [macos-intel, macos-universal, macos-universal-10.15] | |||
| runs-on: macos-11 | |||
| runs-on: macos-12 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: fake dpf script | |||
| @@ -50,7 +50,7 @@ jobs: | |||
| target: [win32, win64] | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - uses: distrho/dpf-makefile-action@v1 | |||
| @@ -66,7 +66,7 @@ jobs: | |||
| #pluginval: | |||
| #runs-on: ubuntu-20.04 | |||
| #steps: | |||
| #- uses: actions/checkout@v3 | |||
| #- uses: actions/checkout@v4 | |||
| #with: | |||
| #submodules: recursive | |||
| #- uses: distrho/dpf-makefile-action@v1 | |||
| @@ -75,9 +75,9 @@ jobs: | |||
| #pawpaw: true | |||
| source: | |||
| runs-on: ubuntu-20.04 | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - uses: distrho/dpf-makefile-action@v1 | |||
| @@ -14,13 +14,13 @@ env: | |||
| jobs: | |||
| # macOS native universal build | |||
| macos_universal: | |||
| runs-on: macos-11 | |||
| runs-on: macos-12 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: Set up cache | |||
| uses: actions/cache@v3 | |||
| uses: actions/cache@v4 | |||
| with: | |||
| path: | | |||
| ~/PawPawBuilds | |||
| @@ -46,7 +46,7 @@ jobs: | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} -j 1 | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: macOS dmg | |||
| path: ./*.dmg | |||
| @@ -64,11 +64,11 @@ jobs: | |||
| win32: | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: Set up cache | |||
| uses: actions/cache@v3 | |||
| uses: actions/cache@v4 | |||
| with: | |||
| path: | | |||
| ~/PawPawBuilds | |||
| @@ -110,7 +110,7 @@ jobs: | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} -j 1 | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: win32 zip | |||
| path: ./*.zip | |||
| @@ -128,11 +128,11 @@ jobs: | |||
| win64: | |||
| runs-on: ubuntu-22.04 | |||
| steps: | |||
| - uses: actions/checkout@v3 | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: recursive | |||
| - name: Set up cache | |||
| uses: actions/cache@v3 | |||
| uses: actions/cache@v4 | |||
| with: | |||
| path: | | |||
| ~/PawPawBuilds | |||
| @@ -175,7 +175,7 @@ jobs: | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} TESTING=true -j 1 | |||
| make dist ${MAKE_ARGS} -j 1 | |||
| - uses: actions/upload-artifact@v3 | |||
| - uses: actions/upload-artifact@v4 | |||
| with: | |||
| name: win64 zip | |||
| path: ./*.zip | |||
| @@ -60,6 +60,7 @@ qrc_resources.cpp | |||
| *.pyc | |||
| # Qt files | |||
| qt_config.py | |||
| *_ui.hpp | |||
| *_ui.py | |||
| *_rc.cpp | |||
| @@ -38,20 +38,14 @@ Optional for extra Linux-only engine features: | |||
| - ALSA | |||
| - PulseAudio | |||
| - X11 (LV2/VST X11 UI support) | |||
| - X11 (CLAP/LV2/VST2/VST3 X11 UI support) | |||
| Optional for extended LV2 UIs support: (Linux only) | |||
| - Gtk2 | |||
| - Gtk3 | |||
| - Qt4 | |||
| - Qt5 | |||
| Optional for Linux VST3 support: | |||
| - freetype2 | |||
| - Xcursor | |||
| - Xext | |||
| NOTE: Gtk2 and Gtk3 support is always on, as Carla uses dlopen + dlsym to support them | |||
| Optional for extra samplers support: | |||
| @@ -73,14 +67,14 @@ Under Debian based systems, you can use this command to install everything: | |||
| ``` | |||
| sudo apt install python3-pyqt5.qtsvg python3-rdflib pyqt5-dev-tools \ | |||
| libmagic-dev liblo-dev libasound2-dev libpulse-dev libx11-dev libxcursor-dev libxext-dev \ | |||
| libgtk2.0-dev libgtk-3-dev libqt4-dev qtbase5-dev libfluidsynth-dev | |||
| qtbase5-dev libfluidsynth-dev | |||
| ``` | |||
| Under Fedora, you can use the following command instead: | |||
| ``` | |||
| sudo dnf install python3-qt5-devel python3-rdflib \ | |||
| file-devel liblo-devel alsa-lib-devel pulseaudio-libs-devel libX11-devel | |||
| gtk2-devel gtk3-devel qt4-devel qt5-devel fluidsynth-devel libsndfile-devel | |||
| qt5-devel fluidsynth-devel libsndfile-devel | |||
| ``` | |||
| ## BUILD BRIDGES (Experimental) | |||
| @@ -78,23 +78,12 @@ ifeq ($(HAVE_QT5),true) | |||
| 3RD_LIBS += $(MODULEDIR)/theme.qt5.a | |||
| endif | |||
| ifeq ($(HAVE_YSFX),true) | |||
| 3RD_LIBS += $(MODULEDIR)/ysfx.a | |||
| ifeq ($(HAVE_QT6),true) | |||
| 3RD_LIBS += $(MODULEDIR)/theme.qt6.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| 3RD_LIBS += $(MODULEDIR)/carla_juce.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_audio_basics.a | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| 3RD_LIBS += $(MODULEDIR)/juce_audio_devices.a | |||
| endif | |||
| 3RD_LIBS += $(MODULEDIR)/juce_audio_processors.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_core.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_data_structures.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_events.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_graphics.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_gui_basics.a | |||
| 3RD_LIBS += $(MODULEDIR)/juce_gui_extra.a | |||
| ifeq ($(HAVE_YSFX),true) | |||
| 3RD_LIBS += $(MODULEDIR)/ysfx.a | |||
| endif | |||
| ifeq ($(USING_RTAUDIO),true) | |||
| @@ -136,6 +125,9 @@ $(MODULEDIR)/theme.qt4.a: .FORCE | |||
| $(MODULEDIR)/theme.qt5.a: .FORCE | |||
| @$(MAKE) -C source/theme qt5 | |||
| $(MODULEDIR)/theme.qt6.a: .FORCE | |||
| @$(MAKE) -C source/theme qt6 | |||
| $(MODULEDIR)/%.arm32.a: .FORCE | |||
| ifneq ($(WINDOWS),true) | |||
| @$(MAKE) -C source/modules/$* arm32 | |||
| @@ -340,6 +332,10 @@ else | |||
| $(MAKE) -C source/discovery win64 | |||
| endif | |||
| mingw64: | |||
| $(MAKE) AR=i686-w64-mingw32-ar CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ win32 | |||
| $(MAKE) AR=x86_64-w64-mingw32-ar CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ win64 | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Binaries (wine) | |||
| @@ -711,6 +707,8 @@ endif | |||
| $(LINK) ../carla_utils.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../carla_widgets.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../externalui.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../qt_compat.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../qt_config.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../resources_rc.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../ui_carla_about.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| $(LINK) ../ui_carla_edit.py $(DESTDIR)$(DATADIR)/carla/resources | |||
| @@ -27,7 +27,7 @@ endif | |||
| features_print_main: | |||
| @printf -- "$(tS)---> Main features $(tE)\n" | |||
| ifeq ($(HAVE_FRONTEND),true) | |||
| @printf -- "Front-End: $(ANS_YES)\n" | |||
| @printf -- "Front-End: $(ANS_YES) (Qt$(FRONTEND_TYPE))\n" | |||
| @printf -- "LV2 plugin: $(ANS_YES)\n" | |||
| ifneq ($(HAIKU),true) | |||
| @printf -- "VST2 plugin: $(ANS_YES)\n" | |||
| @@ -41,13 +41,9 @@ else | |||
| endif | |||
| ifeq ($(HAVE_HYLIA),true) | |||
| @printf -- "Link support: $(ANS_YES)\n" | |||
| else | |||
| ifeq ($(MACOS_OLD),true) | |||
| @printf -- "Link support: $(ANS_NO) $(mZ)MacOS >= 10.8 only$(mE)\n" | |||
| else | |||
| @printf -- "Link support: $(ANS_NO) $(mZ)Linux, MacOS and Windows only$(mE)\n" | |||
| endif | |||
| endif | |||
| ifeq ($(HAVE_LIBLO),true) | |||
| @printf -- "OSC support: $(ANS_YES)\n" | |||
| else | |||
| @@ -55,12 +51,10 @@ else | |||
| endif | |||
| ifeq ($(WINDOWS),true) | |||
| @printf -- "Binary detect: $(ANS_YES)\n" | |||
| else | |||
| ifeq ($(HAVE_LIBMAGIC),true) | |||
| else ifeq ($(HAVE_LIBMAGIC),true) | |||
| @printf -- "Binary detect: $(ANS_YES)\n" | |||
| else | |||
| @printf -- "Binary detect: $(ANS_NO) $(mS)Missing libmagic/file$(mE)\n" | |||
| endif | |||
| endif | |||
| @printf -- "\n" | |||
| @@ -94,11 +88,9 @@ else | |||
| @printf -- "CoreAudio: $(ANS_NO) $(mZ)MacOS only$(mE)\n" | |||
| endif | |||
| ifeq ($(WINDOWS),true) | |||
| @printf -- "ASIO: $(ANS_YES)\n" | |||
| @printf -- "DirectSound: $(ANS_YES)\n" | |||
| @printf -- "WASAPI: $(ANS_YES)\n" | |||
| else | |||
| @printf -- "ASIO: $(ANS_NO) $(mZ)Windows only$(mE)\n" | |||
| @printf -- "DirectSound: $(ANS_NO) $(mZ)Windows only$(mE)\n" | |||
| @printf -- "WASAPI: $(ANS_NO) $(mZ)Windows only$(mE)\n" | |||
| endif | |||
| @@ -116,37 +108,20 @@ endif | |||
| @printf -- "LV2: $(ANS_YES)\n" | |||
| @printf -- "CLAP: $(ANS_YES)\n" | |||
| ifeq ($(MACOS_OR_WINDOWS),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| @printf -- "VST2: $(ANS_YES) (with UI, using JUCE)\n" | |||
| @printf -- "VST3: $(ANS_YES) (with UI, using JUCE)\n" | |||
| else # USING_JUCE | |||
| @printf -- "VST2: $(ANS_YES) (with UI)\n" | |||
| @printf -- "VST3: $(ANS_NO)\n" | |||
| endif # USING_JUCE | |||
| else # MACOS_OR_WINDOWS | |||
| ifeq ($(HAIKU),true) | |||
| @printf -- "VST3: $(ANS_YES) (with UI)\n" | |||
| else ifeq ($(HAIKU),true) | |||
| @printf -- "VST2: $(ANS_YES) (without UI)\n" | |||
| @printf -- "VST3: $(ANS_NO)\n" | |||
| else # HAIKU | |||
| ifeq ($(HAVE_X11),true) | |||
| @printf -- "VST3: $(ANS_YES) (without UI)\n" | |||
| else ifeq ($(HAVE_X11),true) | |||
| @printf -- "VST2: $(ANS_YES) (with UI)\n" | |||
| ifeq ($(USING_JUCE),true) | |||
| @printf -- "VST3: $(ANS_YES) (with UI, using JUCE)\n" | |||
| else # USING_JUCE | |||
| @printf -- "VST3: $(ANS_NO)\n" | |||
| endif # USING_JUCE | |||
| else # HAVE_X11 | |||
| @printf -- "VST3: $(ANS_YES) (with UI)\n" | |||
| else | |||
| @printf -- "VST2: $(ANS_YES) (without UI) $(mS)Missing X11$(mE)\n" | |||
| @printf -- "VST3: $(ANS_NO)\n" | |||
| endif # HAVE_X11 | |||
| endif # HAIKU | |||
| endif # MACOS_OR_WINDOWS | |||
| @printf -- "VST3: $(ANS_YES) (without UI) $(mS)Missing X11$(mE)\n" | |||
| endif | |||
| ifeq ($(MACOS),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| @printf -- "AU: $(ANS_YES) (with UI, using JUCE)\n" | |||
| else # USING_JUCE | |||
| @printf -- "AU: $(ANS_NO)\n" | |||
| endif # USING_JUCE | |||
| @printf -- "AU: $(ANS_YES) (with UI)\n" | |||
| else # MACOS | |||
| @printf -- "AU: $(ANS_NO) $(mZ)MacOS only$(mE)\n" | |||
| endif # MACOS | |||
| @@ -14,7 +14,7 @@ Features | |||
| * SF2/3 and SFZ sound banks | |||
| * Internal audio and midi file player | |||
| * Automation of plugin parameters via MIDI CC | |||
| * Remote control over OSC | |||
| * Remote control over [OSC](https://opensoundcontrol.stanford.edu/) | |||
| * Rack and Patchbay processing modes, plus Single and Multi-Client if using JACK | |||
| * Native audio drivers (ALSA, DirectSound, CoreAudio, etc) and JACK | |||
| @@ -790,7 +790,6 @@ target_sources(carla-bridge-native | |||
| ../source/backend/plugin/CarlaPluginAU.cpp | |||
| ../source/backend/plugin/CarlaPluginCLAP.cpp | |||
| ../source/backend/plugin/CarlaPluginFluidSynth.cpp | |||
| ../source/backend/plugin/CarlaPluginJuce.cpp | |||
| ../source/backend/plugin/CarlaPluginJSFX.cpp | |||
| ../source/backend/plugin/CarlaPluginLADSPADSSI.cpp | |||
| ../source/backend/plugin/CarlaPluginLV2.cpp | |||
| @@ -1021,7 +1020,6 @@ target_sources(carla-host-plugin | |||
| ../source/backend/plugin/CarlaPluginAU.cpp | |||
| ../source/backend/plugin/CarlaPluginCLAP.cpp | |||
| ../source/backend/plugin/CarlaPluginFluidSynth.cpp | |||
| ../source/backend/plugin/CarlaPluginJuce.cpp | |||
| ../source/backend/plugin/CarlaPluginJSFX.cpp | |||
| ../source/backend/plugin/CarlaPluginLADSPADSSI.cpp | |||
| ../source/backend/plugin/CarlaPluginLV2.cpp | |||
| @@ -1122,7 +1120,6 @@ if(APPLE) | |||
| -Wl,-exported_symbol,_carla_host_handle_free | |||
| -Wl,-exported_symbol,_carla_get_native_plugin_engine | |||
| -Wl,-exported_symbol,_carla_get_complete_license_text | |||
| -Wl,-exported_symbol,_carla_get_juce_version | |||
| -Wl,-exported_symbol,_carla_get_supported_file_extensions | |||
| -Wl,-exported_symbol,_carla_get_supported_features | |||
| -Wl,-exported_symbol,_carla_get_library_filename | |||
| @@ -1132,7 +1129,7 @@ elseif(EMSCRIPTEN) | |||
| target_link_options(carla-native-plugin | |||
| PRIVATE | |||
| -sSIDE_MODULE=2 | |||
| -sEXPORTED_FUNCTIONS="['carla_get_native_rack_plugin','carla_get_native_patchbay_plugin','carla_get_native_patchbay16_plugin','carla_get_native_patchbay32_plugin','carla_get_native_patchbay64_plugin','carla_get_native_patchbay_cv_plugin','carla_get_native_patchbay_cv8_plugin','carla_get_native_patchbay_cv32_plugin','carla_get_native_patchbay_obs_plugin','carla_create_native_plugin_host_handle','carla_host_handle_free','carla_get_native_plugin_engine','carla_get_complete_license_text','carla_get_juce_version','carla_get_supported_file_extensions','carla_get_supported_features','carla_get_library_filename','carla_get_library_folder']" | |||
| -sEXPORTED_FUNCTIONS="['carla_get_native_rack_plugin','carla_get_native_patchbay_plugin','carla_get_native_patchbay16_plugin','carla_get_native_patchbay32_plugin','carla_get_native_patchbay64_plugin','carla_get_native_patchbay_cv_plugin','carla_get_native_patchbay_cv8_plugin','carla_get_native_patchbay_cv32_plugin','carla_get_native_patchbay_obs_plugin','carla_create_native_plugin_host_handle','carla_host_handle_free','carla_get_native_plugin_engine','carla_get_complete_license_text','carla_get_supported_file_extensions','carla_get_supported_features','carla_get_library_filename','carla_get_library_folder']" | |||
| ) | |||
| elseif(MSVC) | |||
| target_link_options(carla-native-plugin | |||
| @@ -1189,7 +1186,6 @@ target_sources(carla-native-plugin | |||
| ../source/backend/plugin/CarlaPluginAU.cpp | |||
| ../source/backend/plugin/CarlaPluginCLAP.cpp | |||
| ../source/backend/plugin/CarlaPluginFluidSynth.cpp | |||
| ../source/backend/plugin/CarlaPluginJuce.cpp | |||
| ../source/backend/plugin/CarlaPluginJSFX.cpp | |||
| ../source/backend/plugin/CarlaPluginLADSPADSSI.cpp | |||
| ../source/backend/plugin/CarlaPluginLV2.cpp | |||
| @@ -1321,7 +1317,6 @@ target_sources(carla-standalone | |||
| ../source/backend/plugin/CarlaPluginAU.cpp | |||
| ../source/backend/plugin/CarlaPluginCLAP.cpp | |||
| ../source/backend/plugin/CarlaPluginFluidSynth.cpp | |||
| ../source/backend/plugin/CarlaPluginJuce.cpp | |||
| ../source/backend/plugin/CarlaPluginJSFX.cpp | |||
| ../source/backend/plugin/CarlaPluginLADSPADSSI.cpp | |||
| ../source/backend/plugin/CarlaPluginLV2.cpp | |||
| @@ -1440,7 +1435,6 @@ target_sources(carla-utils | |||
| ../source/backend/utils/CachedPlugins.cpp | |||
| ../source/backend/utils/CarlaUtils.cpp | |||
| ../source/backend/utils/Information.cpp | |||
| ../source/backend/utils/JUCE.cpp | |||
| ../source/backend/utils/PipeClient.cpp | |||
| ../source/backend/utils/PluginDiscovery.cpp | |||
| ../source/backend/utils/System.cpp | |||
| @@ -1516,6 +1510,7 @@ if(APPLE) | |||
| set_source_files_properties( | |||
| ../source/backend/CarlaStandalone.cpp | |||
| ../source/backend/engine/CarlaEngineNative.cpp | |||
| ../source/backend/plugin/CarlaPluginAU.cpp | |||
| ../source/backend/plugin/CarlaPluginCLAP.cpp | |||
| ../source/backend/plugin/CarlaPluginVST2.cpp | |||
| ../source/backend/plugin/CarlaPluginVST3.cpp | |||
| @@ -0,0 +1,6 @@ | |||
| # binary files | |||
| *.dll | |||
| *.so | |||
| # this script | |||
| build.sh | |||
| @@ -0,0 +1,46 @@ | |||
| FROM ubuntu:20.04 | |||
| LABEL maintainer="falkTX <falktx@falktx.com>" | |||
| ENV DEBIAN_FRONTEND noninteractive | |||
| # enable i386 | |||
| RUN dpkg --add-architecture i386 | |||
| # update system | |||
| RUN apt-get update -qq && apt-get upgrade -qqy && apt-get clean | |||
| # install packages needed for build | |||
| RUN apt-get install -qqy --no-install-recommends ca-certificates g++-multilib git libgl-dev make openssl pkg-config wget && \ | |||
| apt-get clean | |||
| # install newer wine | |||
| RUN mkdir -pm755 /etc/apt/keyrings && \ | |||
| wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key && \ | |||
| wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/focal/winehq-focal.sources | |||
| RUN apt-get update -qq && \ | |||
| apt-get install -qqy --no-install-recommends winehq-stable wine-stable-dev && \ | |||
| apt-get clean | |||
| # fetch Carla | |||
| RUN git clone --recursive https://github.com/falkTX/Carla.git --depth=1 # v4 | |||
| WORKDIR /Carla | |||
| # build plugin-wine 32bit | |||
| RUN apt-get install -yqq --no-install-recommends libx11-dev:i386 && apt-get clean | |||
| RUN CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 make plugin plugin-wine | |||
| RUN mkdir bin32 | |||
| RUN mv bin/CarlaVst*ShellBridged.dll* bin32 | |||
| RUN make distclean | |||
| # build plugin-wine 64bit | |||
| RUN apt-get install -yqq --no-install-recommends libx11-dev:amd64 && apt-get clean | |||
| RUN CFLAGS=-m64 CXXFLAGS=-m64 LDFLAGS=-m64 make plugin plugin-wine | |||
| RUN mkdir bin64 | |||
| RUN mv bin/CarlaVst*ShellBridged.dll* bin64 | |||
| RUN make distclean | |||
| # build Carla wine bridges | |||
| RUN make wine32 wine64 | |||
| # CMD for inspection | |||
| CMD ["bash"] | |||
| @@ -0,0 +1,25 @@ | |||
| #!/bin/bash | |||
| cd $(dirname $0) | |||
| rm -rf bin32 bin64 *.dll | |||
| set -e | |||
| mkdir bin32 bin64 | |||
| docker build -t carla-bridge-win . | |||
| docker run -v $PWD:/mnt --rm --entrypoint \ | |||
| cp carla-bridge-win:latest \ | |||
| /Carla/bin32/CarlaVstShellBridged.dll.so \ | |||
| /Carla/bin32/CarlaVstFxShellBridged.dll.so \ | |||
| /mnt/bin32 | |||
| docker run -v $PWD:/mnt --rm --entrypoint \ | |||
| cp carla-bridge-win:latest \ | |||
| /Carla/bin64/CarlaVstShellBridged.dll.so \ | |||
| /Carla/bin64/CarlaVstFxShellBridged.dll.so \ | |||
| /mnt/bin64 | |||
| docker run -v $PWD:/mnt --rm --entrypoint \ | |||
| cp carla-bridge-win:latest \ | |||
| /Carla/bin/jackbridge-wine32.dll \ | |||
| /Carla/bin/jackbridge-wine64.dll \ | |||
| /mnt | |||
| @@ -574,7 +574,6 @@ | |||
| <string>&Help</string> | |||
| </property> | |||
| <addaction name="act_help_about"/> | |||
| <addaction name="act_help_about_juce"/> | |||
| <addaction name="act_help_about_qt"/> | |||
| </widget> | |||
| <addaction name="menu_File"/> | |||
| @@ -1471,14 +1470,6 @@ | |||
| <enum>QAction::NoRole</enum> | |||
| </property> | |||
| </action> | |||
| <action name="act_help_about_juce"> | |||
| <property name="text"> | |||
| <string>About &JUCE</string> | |||
| </property> | |||
| <property name="menuRole"> | |||
| <enum>QAction::NoRole</enum> | |||
| </property> | |||
| </action> | |||
| <action name="act_help_about_qt"> | |||
| <property name="text"> | |||
| <string>About &Qt</string> | |||
| @@ -1008,7 +1008,7 @@ | |||
| <string>Maximum number of parameters to allow in the built-in 'Edit' dialog</string> | |||
| </property> | |||
| <property name="maximum"> | |||
| <number>1000</number> | |||
| <number>2000</number> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| @@ -214,6 +214,9 @@ HAVE_QT4 = $(shell $(PKG_CONFIG) --exists QtCore QtGui && echo true) | |||
| HAVE_QT5 = $(shell $(PKG_CONFIG) --exists Qt5Core Qt5Gui Qt5Widgets && \ | |||
| $(PKG_CONFIG) --variable=qt_config Qt5Core | grep -q -v "static" && echo true) | |||
| HAVE_QT5PKG = $(shell $(PKG_CONFIG) --silence-errors --variable=prefix Qt5OpenGLExtensions 1>/dev/null && echo true) | |||
| HAVE_QT5BREW = $(shell test -e /usr/local/opt/qt5/bin/uic && echo true) | |||
| HAVE_QT6 = $(shell $(PKG_CONFIG) --exists Qt6Core Qt6Gui Qt6Widgets && echo true) | |||
| HAVE_QT6BREW = $(shell test -e /opt/homebrew/opt/qt6/share/qt/libexec/uic && echo true) | |||
| HAVE_SNDFILE = $(shell $(PKG_CONFIG) --exists sndfile && echo true) | |||
| ifeq ($(HAVE_FLUIDSYNTH),true) | |||
| @@ -259,29 +262,65 @@ endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set Qt tools | |||
| # Set Qt tools, part1 | |||
| ifeq ($(HAVE_QT4),true) | |||
| MOC_QT4 ?= $(shell $(PKG_CONFIG) --variable=moc_location QtCore) | |||
| RCC_QT4 ?= $(shell $(PKG_CONFIG) --variable=rcc_location QtCore) | |||
| ifeq (,$(wildcard $(MOC_QT4))) | |||
| HAVE_QT4 = false | |||
| endif | |||
| ifeq (,$(wildcard $(RCC_QT4))) | |||
| HAVE_QT4 = false | |||
| endif | |||
| QT4_CXX_FLAGS = $(BUILD_CXX_FLAGS) $(shell pkg-config --cflags QtCore QtGui) | |||
| QT4_LINK_FLAGS = $(NON_STATIC_LINK_FLAGS) $(shell pkg-config --libs QtCore QtGui) | |||
| QT4_STYLES_DIR = $(shell pkg-config --variable=libdir QtCore)/qt4/plugins/styles | |||
| endif | |||
| ifeq ($(HAVE_QT5),true) | |||
| QT5_HOSTBINS = $(shell $(PKG_CONFIG) --variable=host_bins Qt5Core) | |||
| QT5_HOSTBINS = $(shell $(PKG_CONFIG) --variable=host_bins Qt5Core) | |||
| QT5_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt5Core) | |||
| QT5_CXX_FLAGS = $(shell $(PKG_CONFIG) --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
| QT5_LINK_FLAGS = -Wl,-rpath,$(QT5_PREFIX)/lib $(shell $(PKG_CONFIG) --libs Qt5Core Qt5Gui Qt5Widgets) | |||
| QT5_STYLES_DIR = $(shell pkg-config --variable=libdir Qt5Core)/qt5/plugins/styles | |||
| else ifeq ($(HAVE_QT5PKG),true) | |||
| QT5_HOSTBINS = $(shell $(PKG_CONFIG) --variable=prefix Qt5OpenGLExtensions)/bin | |||
| QT5_HOSTBINS = $(shell $(PKG_CONFIG) --variable=prefix Qt5OpenGLExtensions)/bin | |||
| QT5_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt5OpenGLExtensions) | |||
| QT5_CXX_FLAGS = -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -I $(QT5_PREFIX)/include/qt5 | |||
| QT5_LINK_FLAGS = -Wl,-rpath,$(QT5_PREFIX)/lib -F $(QT5_PREFIX)/lib -framework QtCore -framework QtGui -framework QtWidgets | |||
| QT5_STYLES_DIR = $(QT5_PREFIX)/lib/qt5/plugins/styles | |||
| else ifeq ($(HAVE_QT5BREW),true) | |||
| QT5_HOSTBINS = /usr/local/opt/qt5/bin | |||
| QT5_PREFIX = /usr/local/opt/qt5 | |||
| QT5_CXX_FLAGS = -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -I $(QT5_PREFIX)/include | |||
| QT5_LINK_FLAGS = -Wl,-rpath,$(QT5_PREFIX)/lib -F $(QT5_PREFIX)/lib -framework QtCore -framework QtGui -framework QtWidgets | |||
| QT5_STYLES_DIR = $(QT5_PREFIX)/plugins/styles | |||
| endif | |||
| ifeq ($(HAVE_QT6),true) | |||
| QT6_HOSTBINS = $(shell $(PKG_CONFIG) --variable=libexecdir Qt6Core) | |||
| QT6_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt6Core) | |||
| QT6_CXX_FLAGS = $(shell $(PKG_CONFIG) --cflags Qt6Core Qt6Gui Qt6Widgets) -std=gnu++17 | |||
| QT6_LINK_FLAGS = -Wl,-rpath,$(QT6_PREFIX)/lib $(shell $(PKG_CONFIG) --libs Qt6Core Qt6Gui Qt6Widgets) | |||
| QT6_STYLES_DIR = $(shell pkg-config --variable=libdir Qt6Core)/qt6/plugins/styles | |||
| else ifeq ($(HAVE_QT6BREW),true) | |||
| QT6_HOSTBINS = /opt/homebrew/opt/qt6/share/qt/libexec | |||
| QT6_PREFIX = /opt/homebrew/opt/qt6 | |||
| QT6_CXX_FLAGS = -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -I $(QT6_PREFIX)/include -std=gnu++17 | |||
| QT6_LINK_FLAGS = -Wl,-rpath,$(QT6_PREFIX)/lib -F $(QT6_PREFIX)/lib -framework QtCore -framework QtGui -framework QtWidgets | |||
| QT6_STYLES_DIR = $(QT6_PREFIX)/share/qt/plugins/styles | |||
| endif | |||
| MOC_QT5 ?= $(QT5_HOSTBINS)/moc | |||
| RCC_QT5 ?= $(QT5_HOSTBINS)/rcc | |||
| UIC_QT5 ?= $(QT5_HOSTBINS)/uic | |||
| MOC_QT6 ?= $(QT6_HOSTBINS)/moc | |||
| RCC_QT6 ?= $(QT6_HOSTBINS)/rcc | |||
| UIC_QT6 ?= $(QT6_HOSTBINS)/uic | |||
| ifeq (,$(wildcard $(MOC_QT4))) | |||
| HAVE_QT4 = false | |||
| endif | |||
| ifeq (,$(wildcard $(RCC_QT4))) | |||
| HAVE_QT4 = false | |||
| endif | |||
| ifeq (,$(wildcard $(MOC_QT5))) | |||
| HAVE_QT5 = false | |||
| endif | |||
| @@ -292,17 +331,14 @@ ifeq (,$(wildcard $(UIC_QT5))) | |||
| HAVE_QT5 = false | |||
| endif | |||
| ifeq ($(HAVE_QT4),true) | |||
| HAVE_QT = true | |||
| else ifeq ($(HAVE_QT5),true) | |||
| HAVE_QT = true | |||
| # FIXME | |||
| else ifeq ($(WINDOWS),true) | |||
| HAVE_QT = true | |||
| ifeq (,$(wildcard $(MOC_QT6))) | |||
| HAVE_QT6 = false | |||
| endif | |||
| ifneq (,$(findstring true,$(HAVE_QT5)$(HAVE_QT5PKG))) | |||
| HAVE_THEME = true | |||
| ifeq (,$(wildcard $(RCC_QT6))) | |||
| HAVE_QT6 = false | |||
| endif | |||
| ifeq (,$(wildcard $(UIC_QT6))) | |||
| HAVE_QT6 = false | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -311,27 +347,49 @@ endif | |||
| PYRCC5 ?= $(shell which pyrcc5 2>/dev/null) | |||
| PYUIC5 ?= $(shell which pyuic5 2>/dev/null) | |||
| ifneq ($(PYUIC5),) | |||
| ifneq ($(PYRCC5),) | |||
| HAVE_PYQT = true | |||
| ifneq (,$(findstring true,$(HAVE_QT5)$(HAVE_QT5PKG))) | |||
| PYUIC6 ?= $(shell which pyuic6 2>/dev/null) | |||
| ifneq (,$(findstring true,$(HAVE_QT6)$(HAVE_QT6BREW))) | |||
| ifneq ($(PYUIC6),) | |||
| HAVE_FRONTEND = true | |||
| HAVE_PYQT = true | |||
| FRONTEND_TYPE = 6 | |||
| endif | |||
| endif | |||
| ifneq (,$(findstring true,$(HAVE_QT5)$(HAVE_QT5PKG)$(HAVE_QT5BREW))) | |||
| ifneq ($(PYUIC5)$(PYRCC5),) | |||
| HAVE_FRONTEND = true | |||
| HAVE_PYQT = true | |||
| FRONTEND_TYPE = 5 | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set PyQt tools, part2 | |||
| # Set Qt tools, part2 | |||
| ifneq (,$(findstring true,$(HAVE_QT4)$(HAVE_QT5)$(HAVE_QT5PKG)$(HAVE_QT5BREW)$(HAVE_QT6)$(HAVE_QT6BREW))) | |||
| HAVE_QT = true | |||
| endif | |||
| ifeq ($(FRONTEND_TYPE),5) | |||
| MOC = $(MOC_QT5) | |||
| RCC = $(RCC_QT5) | |||
| UIC = $(UIC_QT5) | |||
| PYRCC ?= $(PYRCC5) | |||
| PYUIC ?= $(PYUIC5) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set USING_JUCE | |||
| ifeq ($(MACOS_OR_WINDOWS),true) | |||
| USING_JUCE = true | |||
| USING_JUCE_AUDIO_DEVICES = true | |||
| HAVE_THEME = $(HAVE_QT5) | |||
| QT_CXX_FLAGS = $(QT5_CXX_FLAGS) | |||
| QT_LINK_FLAGS = $(QT5_LINK_FLAGS) | |||
| else ifeq ($(FRONTEND_TYPE),6) | |||
| MOC = $(MOC_QT6) | |||
| RCC = $(RCC_QT6) | |||
| UIC = $(UIC_QT6) | |||
| PYRCC ?= $(RCC_QT6) -g python | |||
| PYUIC ?= $(PYUIC6) | |||
| HAVE_THEME = $(HAVE_QT6) | |||
| QT_CXX_FLAGS = $(QT6_CXX_FLAGS) | |||
| QT_LINK_FLAGS = $(QT6_LINK_FLAGS) | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -339,11 +397,9 @@ endif | |||
| ifneq ($(HAIKU),true) | |||
| ifneq ($(WASM),true) | |||
| ifneq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| USING_RTAUDIO = true | |||
| endif | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Disable features for static plugin target | |||
| @@ -360,11 +416,11 @@ HAVE_PYQT = false | |||
| HAVE_QT4 = false | |||
| HAVE_QT5 = false | |||
| HAVE_QT5PKG = false | |||
| HAVE_QT5BREW = false | |||
| HAVE_QT6 = false | |||
| HAVE_SDL = false | |||
| HAVE_SDL1 = false | |||
| HAVE_SDL2 = false | |||
| USING_JUCE = false | |||
| USING_JUCE_AUDIO_DEVICES = false | |||
| USING_RTAUDIO = false | |||
| endif | |||
| @@ -401,6 +457,11 @@ QT5_FLAGS = $(shell $(PKG_CONFIG) --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
| QT5_LIBS = $(shell $(PKG_CONFIG) --libs Qt5Core Qt5Gui Qt5Widgets) | |||
| endif | |||
| ifeq ($(HAVE_QT6),true) | |||
| QT6_FLAGS = $(shell $(PKG_CONFIG) --cflags Qt6Core Qt6Gui Qt6Widgets) | |||
| QT6_LIBS = $(shell $(PKG_CONFIG) --libs Qt6Core Qt6Gui Qt6Widgets) | |||
| endif | |||
| ifeq ($(WASM),true) | |||
| HAVE_SDL = true | |||
| SDL_FLAGS = -sUSE_SDL=2 | |||
| @@ -488,35 +549,6 @@ endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set libs stuff (juce) | |||
| ifeq ($(USING_JUCE),true) | |||
| ifeq ($(MACOS),true) | |||
| JUCE_AUDIO_BASICS_LIBS = -framework Accelerate | |||
| JUCE_AUDIO_DEVICES_LIBS = -framework AppKit -framework AudioToolbox -framework CoreAudio -framework CoreMIDI | |||
| JUCE_AUDIO_FORMATS_LIBS = -framework AudioToolbox -framework CoreFoundation | |||
| JUCE_AUDIO_PROCESSORS_LIBS = -framework AudioToolbox -framework AudioUnit -framework CoreAudio -framework CoreAudioKit -framework Cocoa | |||
| JUCE_CORE_LIBS = -framework AppKit | |||
| JUCE_EVENTS_LIBS = -framework AppKit | |||
| JUCE_GRAPHICS_LIBS = -framework Cocoa -framework QuartzCore | |||
| JUCE_GUI_BASICS_LIBS = -framework Cocoa | |||
| JUCE_GUI_EXTRA_LIBS = -framework IOKit | |||
| else ifeq ($(WINDOWS),true) | |||
| JUCE_AUDIO_BASICS_LIBS = | |||
| JUCE_AUDIO_DEVICES_LIBS = -lwinmm -lole32 | |||
| JUCE_AUDIO_FORMATS_LIBS = | |||
| JUCE_AUDIO_PROCESSORS_LIBS = | |||
| JUCE_CORE_LIBS = -luuid -lwsock32 -lwininet -lversion -lole32 -lws2_32 -loleaut32 -limm32 -lcomdlg32 -lshlwapi -lrpcrt4 -lwinmm | |||
| JUCE_EVENTS_LIBS = -lole32 | |||
| JUCE_GRAPHICS_LIBS = -lgdi32 | |||
| JUCE_GUI_BASICS_LIBS = -lgdi32 -limm32 -lcomdlg32 -lole32 | |||
| JUCE_GUI_EXTRA_LIBS = | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Set libs stuff (rtaudio) | |||
| @@ -650,17 +682,6 @@ STATIC_CARLA_PLUGIN_LIBS += $(RTMEMPOOL_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(WATER_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(YSFX_LIBS) | |||
| ifeq ($(USING_JUCE),true) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_AUDIO_FORMATS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_AUDIO_PROCESSORS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_CORE_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_EVENTS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_GRAPHICS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_GUI_BASICS_LIBS) | |||
| STATIC_CARLA_PLUGIN_LIBS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif | |||
| ifeq ($(EXTERNAL_PLUGINS),true) | |||
| ifneq ($(DEBUG),true) | |||
| ifneq ($(TESTBUILD),true) | |||
| @@ -175,10 +175,7 @@ BASE_FLAGS += -DHAVE_DGL | |||
| BASE_FLAGS += -DHAVE_OPENGL | |||
| BASE_FLAGS += -DDGL_OPENGL | |||
| BASE_FLAGS += -DDONT_SET_USING_DGL_NAMESPACE | |||
| ifneq ($(USING_CUSTOM_DPF),true) | |||
| BASE_FLAGS += -DDGL_FILE_BROWSER_DISABLED | |||
| BASE_FLAGS += -DDGL_NO_SHARED_RESOURCES | |||
| else | |||
| ifeq ($(USING_CUSTOM_DPF),true) | |||
| BASE_FLAGS += -DDISTRHO_UI_FILE_BROWSER=0 | |||
| endif | |||
| ifneq ($(DGL_NAMESPACE),) | |||
| @@ -188,6 +185,11 @@ BASE_FLAGS += -DDGL_NAMESPACE=CarlaDGL | |||
| endif | |||
| endif | |||
| ifneq ($(USING_CUSTOM_DPF),true) | |||
| BASE_FLAGS += -DDGL_FILE_BROWSER_DISABLED | |||
| BASE_FLAGS += -DDGL_NO_SHARED_RESOURCES | |||
| endif | |||
| ifeq ($(HAVE_FLUIDSYNTH),true) | |||
| BASE_FLAGS += -DHAVE_FLUIDSYNTH | |||
| ifeq ($(HAVE_FLUIDSYNTH_INSTPATCH),true) | |||
| @@ -237,18 +239,6 @@ ifeq ($(HAVE_YSFX),true) | |||
| BASE_FLAGS += -DHAVE_YSFX | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| BASE_FLAGS += -DUSING_JUCE | |||
| BASE_FLAGS += -DJUCE_APP_CONFIG_HEADER='"AppConfig.h"' | |||
| ifeq ($(WINDOWS),true) | |||
| BASE_FLAGS += -D_WIN32_WINNT=0x0600 | |||
| endif | |||
| endif | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| BASE_FLAGS += -DUSING_JUCE_AUDIO_DEVICES | |||
| endif | |||
| ifeq ($(USING_RTAUDIO),true) | |||
| BASE_FLAGS += -DUSING_RTAUDIO | |||
| endif | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_ENGINE_HPP_INCLUDED | |||
| #define CARLA_ENGINE_HPP_INCLUDED | |||
| @@ -52,35 +38,30 @@ enum EngineType { | |||
| */ | |||
| kEngineTypeJack = 1, | |||
| /*! | |||
| * JUCE engine type, used to provide Native Audio and MIDI support. | |||
| */ | |||
| kEngineTypeJuce = 2, | |||
| /*! | |||
| * RtAudio engine type, used to provide Native Audio and MIDI support. | |||
| */ | |||
| kEngineTypeRtAudio = 3, | |||
| kEngineTypeRtAudio = 2, | |||
| /*! | |||
| * SDL engine type, used to provide Native Audio support. | |||
| */ | |||
| kEngineTypeSDL = 4, | |||
| kEngineTypeSDL = 3, | |||
| /*! | |||
| * Plugin engine type, used to export the engine as a plugin. | |||
| */ | |||
| kEngineTypePlugin = 5, | |||
| kEngineTypePlugin = 4, | |||
| /*! | |||
| * Bridge engine type, used in BridgePlugin class. | |||
| */ | |||
| kEngineTypeBridge = 6, | |||
| kEngineTypeBridge = 5, | |||
| /*! | |||
| * Dummy engine type, does not send audio or MIDI anywhere. | |||
| */ | |||
| kEngineTypeDummy = 7 | |||
| kEngineTypeDummy = 6 | |||
| }; | |||
| /*! | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_ENGINE_INIT_HPP_INCLUDED | |||
| #define CARLA_ENGINE_INIT_HPP_INCLUDED | |||
| @@ -60,14 +46,6 @@ CarlaEngine* newBridge(const char* audioPoolBaseName, | |||
| const char* nonRtClientBaseName, | |||
| const char* nonRtServerBaseName); | |||
| // Juce | |||
| CarlaEngine* newJuce(AudioApi api); | |||
| uint getJuceApiCount(); | |||
| const char* getJuceApiName(uint index); | |||
| const char* const* getJuceApiDeviceNames(uint index); | |||
| const EngineDriverDeviceInfo* getJuceDeviceInfo(uint index, const char* deviceName); | |||
| bool showJuceDeviceControlPanel(uint index, const char* deviceName); | |||
| // RtAudio | |||
| CarlaEngine* newRtAudio(AudioApi api); | |||
| uint getRtAudioApiCount(); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_HOST_H_INCLUDED | |||
| #define CARLA_HOST_H_INCLUDED | |||
| @@ -1173,11 +1159,6 @@ CARLA_API_EXPORT void carla_nsm_ready(CarlaHostHandle handle, NsmCallbackOpcode | |||
| */ | |||
| CARLA_API_EXPORT const char* carla_get_complete_license_text(void); | |||
| /*! | |||
| * Get the juce version used in the current Carla build. | |||
| */ | |||
| CARLA_API_EXPORT const char* carla_get_juce_version(void); | |||
| /*! | |||
| * Get the list of supported file extensions in carla_load_file(). | |||
| */ | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_PLUGIN_HPP_INCLUDED | |||
| #define CARLA_PLUGIN_HPP_INCLUDED | |||
| @@ -24,7 +10,6 @@ | |||
| // ----------------------------------------------------------------------- | |||
| // Avoid including extra libs here | |||
| typedef void* lo_message; | |||
| typedef struct _NativePluginDescriptor NativePluginDescriptor; | |||
| struct LADSPA_RDF_Descriptor; | |||
| @@ -778,7 +763,7 @@ public: | |||
| int argc, | |||
| const void* argv, | |||
| const char* types, | |||
| lo_message msg); | |||
| void* msg); | |||
| // ------------------------------------------------------------------- | |||
| // MIDI events | |||
| @@ -987,7 +972,6 @@ public: | |||
| static CarlaPluginPtr newJSFX(const Initializer& init); | |||
| static CarlaPluginPtr newCLAP(const Initializer& init); | |||
| static CarlaPluginPtr newJuce(const Initializer& init, const char* format); | |||
| static CarlaPluginPtr newFluidSynth(const Initializer& init, PluginType ptype, bool use16Outs); | |||
| static CarlaPluginPtr newSFZero(const Initializer& init); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Standalone | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| // TODO: | |||
| // Check carla_stderr2("Engine is not running"); <= prepend func name and args | |||
| @@ -30,10 +16,6 @@ | |||
| #include "water/files/File.h" | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| #define CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(cond, msg, ret) \ | |||
| if (! (cond)) { \ | |||
| carla_stderr2("%s: " msg, __FUNCTION__); \ | |||
| @@ -404,10 +386,6 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha | |||
| carla_setenv("WINEASIO_CLIENT_NAME", clientName); | |||
| #endif | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| #endif | |||
| CarlaHostStandalone& shandle((CarlaHostStandalone&)*handle); | |||
| CarlaEngine* const engine = CarlaEngine::newDriverByName(driverName); | |||
| @@ -454,9 +432,6 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha | |||
| shandle.lastError = engine->getLastError(); | |||
| shandle.engine = nullptr; | |||
| delete engine; | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| return false; | |||
| } | |||
| } | |||
| @@ -534,9 +509,6 @@ bool carla_engine_close(CarlaHostHandle handle) | |||
| shandle.engine = nullptr; | |||
| delete engine; | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| return closed; | |||
| } | |||
| @@ -545,11 +517,6 @@ void carla_engine_idle(CarlaHostHandle handle) | |||
| CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr && handle->isStandalone,); | |||
| handle->engine->idle(); | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| if (handle->isStandalone) | |||
| CarlaJUCE::idleJuce_GUI(); | |||
| #endif | |||
| } | |||
| bool carla_is_engine_running(CarlaHostHandle handle) | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Standalone | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaHostImpl.hpp" | |||
| @@ -318,9 +304,7 @@ protected: | |||
| fProjectPath = projectPath; | |||
| fProjectPath += ".carxp"; | |||
| const String jfilename = String(CharPointer_UTF8(fProjectPath)); | |||
| if (File(jfilename).existsAsFile()) | |||
| if (File(fProjectPath).existsAsFile()) | |||
| carla_load_project(handle, fProjectPath); | |||
| } | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef CARLA_UTILS_H_INCLUDED | |||
| #define CARLA_UTILS_H_INCLUDED | |||
| @@ -341,19 +327,13 @@ typedef struct _CarlaCachedPluginInfo { | |||
| /*! | |||
| * Get how many cached plugins are available. | |||
| * Internal and LV2 plugin formats are cached and need to be discovered via this function. | |||
| * Internal, LV2 and SFZ plugin formats are cached and can be discovered via this function. | |||
| * Do not call this for any other plugin formats. | |||
| * | |||
| * @note if this carla build uses JUCE, then you must call carla_juce_init beforehand | |||
| * @note for AU plugins, you cannot call this outside the main thread | |||
| */ | |||
| CARLA_PLUGIN_EXPORT uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath); | |||
| /*! | |||
| * Get information about a cached plugin. | |||
| * | |||
| * @note if this carla build uses JUCE, then you must call carla_juce_init beforehand | |||
| * @note for AU plugins, you cannot call this outside the main thread | |||
| */ | |||
| CARLA_PLUGIN_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint index); | |||
| @@ -367,11 +347,6 @@ CARLA_PLUGIN_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(Pl | |||
| */ | |||
| CARLA_PLUGIN_EXPORT const char* carla_get_complete_license_text(void); | |||
| /*! | |||
| * Get the juce version used in the current Carla build. | |||
| */ | |||
| CARLA_PLUGIN_EXPORT const char* carla_get_juce_version(void); | |||
| /*! | |||
| * Get the list of supported file extensions in carla_load_file(). | |||
| */ | |||
| @@ -393,30 +368,6 @@ CARLA_PLUGIN_EXPORT const char* carla_get_library_filename(void); | |||
| CARLA_PLUGIN_EXPORT const char* carla_get_library_folder(void); | |||
| #endif | |||
| /* -------------------------------------------------------------------------------------------------------------------- | |||
| * JUCE */ | |||
| /*! | |||
| * Initialize data structures and GUI support for JUCE. | |||
| * This is only needed when carla builds use JUCE and you call cached-plugin related APIs. | |||
| * | |||
| * Idle must then be called at somewhat regular intervals, though in practice there is no reason for it yet. | |||
| * | |||
| * Make sure to call carla_juce_cleanup after you are done with APIs that need JUCE. | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_init(void); | |||
| /*! | |||
| * Give idle time to JUCE stuff. | |||
| * Currently only used for Linux. | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_idle(void); | |||
| /*! | |||
| * Cleanup the JUCE stuff that was initialized by carla_juce_init. | |||
| */ | |||
| CARLA_PLUGIN_EXPORT void carla_juce_cleanup(void); | |||
| /* -------------------------------------------------------------------------------------------------------------------- | |||
| * pipes */ | |||
| @@ -54,21 +54,6 @@ ifeq ($(HAVE_YSFX),true) | |||
| STANDALONE_LIBS += $(MODULEDIR)/ysfx.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| STANDALONE_LIBS += $(MODULEDIR)/carla_juce.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_audio_basics.a | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_audio_devices.a | |||
| endif | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_audio_processors.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_core.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_data_structures.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_events.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_graphics.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_gui_basics.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/juce_gui_extra.a | |||
| endif | |||
| ifeq ($(USING_RTAUDIO),true) | |||
| STANDALONE_LIBS += $(MODULEDIR)/rtaudio.a | |||
| STANDALONE_LIBS += $(MODULEDIR)/rtmidi.a | |||
| @@ -93,20 +78,6 @@ ifeq ($(HAVE_YSFX),true) | |||
| STANDALONE_LINK_FLAGS += $(YSFX_GRAPHICS_LIBS) | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_AUDIO_DEVICES_LIBS) | |||
| endif | |||
| STANDALONE_LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_CORE_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_EVENTS_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif | |||
| ifeq ($(USING_RTAUDIO),true) | |||
| STANDALONE_LINK_FLAGS += $(RTAUDIO_LIBS) | |||
| STANDALONE_LINK_FLAGS += $(RTMIDI_LIBS) | |||
| @@ -10,13 +10,6 @@ endif | |||
| include $(CWD)/Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BINDIR := $(CWD)/../bin | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| /* TODO: | |||
| * - complete processRack(): carefully add to input, sorted events | |||
| @@ -100,10 +86,6 @@ uint CarlaEngine::getDriverCount() | |||
| ++count; | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| count += getJuceApiCount(); | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| count += getRtAudioApiCount(); | |||
| #endif | |||
| @@ -131,15 +113,6 @@ const char* CarlaEngine::getDriverName(const uint index) | |||
| } | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| if (const uint count = getJuceApiCount()) | |||
| { | |||
| if (index2 < count) | |||
| return getJuceApiName(index2); | |||
| index2 -= count; | |||
| } | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| if (const uint count = getRtAudioApiCount()) | |||
| { | |||
| @@ -178,15 +151,6 @@ const char* const* CarlaEngine::getDriverDeviceNames(const uint index) | |||
| } | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| if (const uint count = getJuceApiCount()) | |||
| { | |||
| if (index2 < count) | |||
| return getJuceApiDeviceNames(index2); | |||
| index2 -= count; | |||
| } | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| if (const uint count = getRtAudioApiCount()) | |||
| { | |||
| @@ -228,15 +192,6 @@ const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const uint index, | |||
| } | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| if (const uint count = getJuceApiCount()) | |||
| { | |||
| if (index2 < count) | |||
| return getJuceDeviceInfo(index2, deviceName); | |||
| index2 -= count; | |||
| } | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| if (const uint count = getRtAudioApiCount()) | |||
| { | |||
| @@ -280,15 +235,6 @@ bool CarlaEngine::showDriverDeviceControlPanel(const uint index, const char* con | |||
| } | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| if (const uint count = getJuceApiCount()) | |||
| { | |||
| if (index2 < count) | |||
| return showJuceDeviceControlPanel(index2, deviceName); | |||
| index2 -= count; | |||
| } | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| if (const uint count = getRtAudioApiCount()) | |||
| { | |||
| @@ -324,30 +270,6 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | |||
| return newDummy(); | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| // ------------------------------------------------------------------- | |||
| // linux | |||
| if (std::strcmp(driverName, "ALSA") == 0) | |||
| return newJuce(AUDIO_API_ALSA); | |||
| // ------------------------------------------------------------------- | |||
| // macos | |||
| if (std::strcmp(driverName, "CoreAudio") == 0) | |||
| return newJuce(AUDIO_API_COREAUDIO); | |||
| // ------------------------------------------------------------------- | |||
| // windows | |||
| if (std::strcmp(driverName, "ASIO") == 0) | |||
| return newJuce(AUDIO_API_ASIO); | |||
| if (std::strcmp(driverName, "DirectSound") == 0) | |||
| return newJuce(AUDIO_API_DIRECTSOUND); | |||
| if (std::strcmp(driverName, "WASAPI") == 0 || std::strcmp(driverName, "Windows Audio") == 0) | |||
| return newJuce(AUDIO_API_WASAPI); | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| // ------------------------------------------------------------------- | |||
| // common | |||
| @@ -782,14 +704,14 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| plugin = CarlaPlugin::newVST3(initializer); | |||
| break; | |||
| case PLUGIN_AU: | |||
| plugin = CarlaPlugin::newAU(initializer); | |||
| break; | |||
| case PLUGIN_CLAP: | |||
| plugin = CarlaPlugin::newCLAP(initializer); | |||
| break; | |||
| case PLUGIN_AU: | |||
| plugin = CarlaPlugin::newAU(initializer); | |||
| break; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| case PLUGIN_INTERNAL: | |||
| plugin = CarlaPlugin::newNative(initializer); | |||
| @@ -1298,8 +1220,7 @@ bool CarlaEngine::loadFile(const char* const filename) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename"); | |||
| carla_debug("CarlaEngine::loadFile(\"%s\")", filename); | |||
| const String jfilename = String(CharPointer_UTF8(filename)); | |||
| File file(jfilename); | |||
| File file(filename); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(file.exists(), "Requested file does not exist or is not a readable"); | |||
| CarlaString baseName(file.getFileNameWithoutExtension().toRawUTF8()); | |||
| @@ -1442,6 +1363,9 @@ bool CarlaEngine::loadFile(const char* const filename) | |||
| // Direct plugin binaries | |||
| #ifdef CARLA_OS_MAC | |||
| if (extension == "component") | |||
| return addPlugin(PLUGIN_AU, filename, nullptr, nullptr, 0, nullptr); | |||
| if (extension == "vst") | |||
| return addPlugin(PLUGIN_VST2, filename, nullptr, nullptr, 0, nullptr); | |||
| #else | |||
| @@ -1467,8 +1391,7 @@ bool CarlaEngine::loadProject(const char* const filename, const bool setAsCurren | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename"); | |||
| carla_debug("CarlaEngine::loadProject(\"%s\")", filename); | |||
| const String jfilename = String(CharPointer_UTF8(filename)); | |||
| const File file(jfilename); | |||
| const File file(filename); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(file.existsAsFile(), "Requested file does not exist or is not a readable file"); | |||
| if (setAsCurrentProject) | |||
| @@ -1529,8 +1452,7 @@ bool CarlaEngine::saveProject(const char* const filename, const bool setAsCurren | |||
| MemoryOutputStream out; | |||
| saveProjectInternal(out); | |||
| const String jfilename = String(CharPointer_UTF8(filename)); | |||
| File file(jfilename); | |||
| File file(filename); | |||
| if (file.replaceWithData(out.getData(), out.getDataSize())) | |||
| return true; | |||
| @@ -2679,7 +2601,7 @@ static String findBinaryInCustomPath(const char* const searchPath, const char* c | |||
| jbinary = jbinary.substring(2).replaceCharacter('\\', '/'); | |||
| #endif | |||
| String filename = File(jbinary).getFileName(); | |||
| String filename = File(jbinary.toRawUTF8()).getFileName(); | |||
| int searchFlags = File::findFiles|File::ignoreHiddenFiles; | |||
| @@ -2693,10 +2615,10 @@ static String findBinaryInCustomPath(const char* const searchPath, const char* c | |||
| std::vector<File> results; | |||
| for (const String *it=searchPaths.begin(), *end=searchPaths.end(); it != end; ++it) | |||
| { | |||
| const File path(*it); | |||
| const File path(it->toRawUTF8()); | |||
| results.clear(); | |||
| path.findChildFiles(results, searchFlags, true, filename); | |||
| path.findChildFiles(results, searchFlags, true, filename.toRawUTF8()); | |||
| if (!results.empty()) | |||
| return results.front().getFullPathName(); | |||
| @@ -2705,23 +2627,23 @@ static String findBinaryInCustomPath(const char* const searchPath, const char* c | |||
| // try changing extension | |||
| #if defined(CARLA_OS_MAC) | |||
| if (filename.endsWithIgnoreCase(".dll") || filename.endsWithIgnoreCase(".so")) | |||
| filename = File(jbinary).getFileNameWithoutExtension() + ".dylib"; | |||
| filename = File(jbinary.toRawUTF8()).getFileNameWithoutExtension() + ".dylib"; | |||
| #elif defined(CARLA_OS_WIN) | |||
| if (filename.endsWithIgnoreCase(".dylib") || filename.endsWithIgnoreCase(".so")) | |||
| filename = File(jbinary).getFileNameWithoutExtension() + ".dll"; | |||
| filename = File(jbinary.toRawUTF8()).getFileNameWithoutExtension() + ".dll"; | |||
| #else | |||
| if (filename.endsWithIgnoreCase(".dll") || filename.endsWithIgnoreCase(".dylib")) | |||
| filename = File(jbinary).getFileNameWithoutExtension() + ".so"; | |||
| filename = File(jbinary.toRawUTF8()).getFileNameWithoutExtension() + ".so"; | |||
| #endif | |||
| else | |||
| return String(); | |||
| for (const String *it=searchPaths.begin(), *end=searchPaths.end(); it != end; ++it) | |||
| { | |||
| const File path(*it); | |||
| const File path(it->toRawUTF8()); | |||
| results.clear(); | |||
| path.findChildFiles(results, searchFlags, true, filename); | |||
| path.findChildFiles(results, searchFlags, true, filename.toRawUTF8()); | |||
| if (!results.empty()) | |||
| return results.front().getFullPathName(); | |||
| @@ -3174,6 +3096,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw | |||
| case PLUGIN_VST2: | |||
| case PLUGIN_VST3: | |||
| case PLUGIN_CLAP: | |||
| case PLUGIN_AU: | |||
| btype = getBinaryTypeFromFile(stateSave.binary); | |||
| break; | |||
| default: | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef BUILD_BRIDGE | |||
| # error This file should not be compiled if not building bridge | |||
| @@ -934,7 +920,7 @@ public: | |||
| { | |||
| if (valueSize > maxLocalValueLen) | |||
| { | |||
| const BridgeTextReader bigValueFilePathTry(fShmNonRtClientControl, valueSize); | |||
| const BridgeTextReader bigValueFilePathTry(fShmNonRtClientControl); | |||
| CARLA_SAFE_ASSERT_BREAK(bigValueFilePathTry.text[0] != '\0'); | |||
| if (! plugin->isEnabled()) break; | |||
| @@ -947,7 +933,7 @@ public: | |||
| bigValueFilePath = bigValueFilePath.replaceSection(0, 1, "Z:\\").replace("/", "\\"); | |||
| #endif | |||
| File bigValueFile(bigValueFilePath); | |||
| File bigValueFile(bigValueFilePath.toRawUTF8()); | |||
| CARLA_SAFE_ASSERT_BREAK(bigValueFile.existsAsFile()); | |||
| plugin->setCustomData(type.text, key.text, bigValueFile.loadFileAsString().toRawUTF8(), true); | |||
| @@ -988,7 +974,7 @@ public: | |||
| chunkFilePath = chunkFilePath.replaceSection(0, 1, "Z:\\").replace("/", "\\"); | |||
| #endif | |||
| File chunkFile(chunkFilePath); | |||
| File chunkFile(chunkFilePath.toRawUTF8()); | |||
| CARLA_SAFE_ASSERT_BREAK(chunkFile.existsAsFile()); | |||
| String chunkDataBase64(chunkFile.loadFileAsString()); | |||
| @@ -1122,7 +1108,7 @@ public: | |||
| filePath += CARLA_OS_SEP_STR ".CarlaCustomData_"; | |||
| filePath += fShmAudioPool.getFilenameSuffix(); | |||
| if (File(filePath).replaceWithText(cdata.value)) | |||
| if (File(filePath.toRawUTF8()).replaceWithText(cdata.value)) | |||
| { | |||
| const uint32_t ulength(static_cast<uint32_t>(filePath.length())); | |||
| @@ -1160,7 +1146,7 @@ public: | |||
| filePath += CARLA_OS_SEP_STR ".CarlaChunk_"; | |||
| filePath += fShmAudioPool.getFilenameSuffix(); | |||
| if (File(filePath).replaceWithText(dataBase64.buffer())) | |||
| if (File(filePath.toRawUTF8()).replaceWithText(dataBase64.buffer())) | |||
| { | |||
| const uint32_t ulength(static_cast<uint32_t>(filePath.length())); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaEngineClient.hpp" | |||
| #include "CarlaEngineInit.hpp" | |||
| @@ -29,10 +15,6 @@ | |||
| #include "jackey.h" | |||
| #ifdef USING_JUCE | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| #ifdef __SSE2_MATH__ | |||
| # include <xmmintrin.h> | |||
| #endif | |||
| @@ -4535,10 +4517,6 @@ int jack_initialize(jack_client_t* const client, const char* const load_init) | |||
| else | |||
| mode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS; | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| #endif | |||
| CarlaEngineJack* const engine = new CarlaEngineJack(); | |||
| engine->setOption(ENGINE_OPTION_FORCE_STEREO, 1, nullptr); | |||
| @@ -4564,9 +4542,7 @@ int jack_initialize(jack_client_t* const client, const char* const load_init) | |||
| return 0; | |||
| delete engine; | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| return 1; | |||
| } | |||
| @@ -4582,10 +4558,6 @@ void jack_finish(void *arg) | |||
| engine->removeAllPlugins(); | |||
| engine->close(); | |||
| delete engine; | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaDefines.h" | |||
| @@ -49,10 +35,6 @@ | |||
| # include <direct.h> | |||
| #endif | |||
| #ifdef USING_JUCE | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| using water::File; | |||
| using water::MemoryOutputStream; | |||
| using water::String; | |||
| @@ -111,13 +93,6 @@ public: | |||
| const uint32_t cvIns = 0, const uint32_t cvOuts = 0) | |||
| : CarlaEngine(), | |||
| pHost(host), | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| // if not running inside Carla, we will have to run event loop ourselves | |||
| kNeedsJuceEvents(host->dispatcher(pHost->handle, | |||
| NATIVE_HOST_OPCODE_INTERNAL_PLUGIN, 0, 0, nullptr, 0.0f) == 0), | |||
| fJuceMsgMgr(), | |||
| fJuceMsgMutex(), | |||
| #endif | |||
| kIsPatchbay(isPatchbay), | |||
| kHasMidiIn(withMidiIn), | |||
| kHasMidiOut(withMidiOut), | |||
| @@ -136,11 +111,6 @@ public: | |||
| carla_zeroFloats(fParameters, kNumInParams+kNumOutParams); | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| if (kNeedsJuceEvents) | |||
| fJuceMsgMgr.incRef(); | |||
| #endif | |||
| pData->bufferSize = pHost->get_buffer_size(pHost->handle); | |||
| pData->sampleRate = pHost->get_sample_rate(pHost->handle); | |||
| pData->initTime(nullptr); | |||
| @@ -198,21 +168,11 @@ public: | |||
| pData->aboutToClose = true; | |||
| fIsRunning = false; | |||
| { | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| const ScopedJuceMessageThreadRunner sjmtr(*this, true); | |||
| #endif | |||
| removeAllPlugins(); | |||
| //runPendingRtEvents(); | |||
| close(); | |||
| pData->graph.destroy(); | |||
| } | |||
| removeAllPlugins(); | |||
| //runPendingRtEvents(); | |||
| close(); | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| if (kNeedsJuceEvents) | |||
| fJuceMsgMgr.decRef(); | |||
| #endif | |||
| pData->graph.destroy(); | |||
| carla_debug("CarlaEngineNative::~CarlaEngineNative() - END"); | |||
| } | |||
| @@ -351,6 +311,14 @@ public: | |||
| pHost->ui_closed(pHost->handle); | |||
| break; | |||
| case ENGINE_CALLBACK_EMBED_UI_RESIZED: | |||
| if (sendHost && fUsesEmbed) | |||
| pHost->dispatcher(pHost->handle, | |||
| NATIVE_HOST_OPCODE_UI_RESIZE, | |||
| value1, value2, | |||
| nullptr, 0.0f); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| @@ -1345,13 +1313,6 @@ protected: | |||
| void uiIdle() | |||
| { | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| const ScopedJuceMessageThreadRunner sjmtr(*this, false); | |||
| if (kNeedsJuceEvents && ! sjmtr.wasLocked) | |||
| return; | |||
| #endif | |||
| for (uint i=0; i < pData->curPluginCount; ++i) | |||
| { | |||
| if (const CarlaPluginPtr plugin = pData->plugins[i].plugin) | |||
| @@ -1391,11 +1352,13 @@ protected: | |||
| if (carla_isNotEqual(fLastScaleFactor, pData->options.uiScale)) | |||
| { | |||
| fLastScaleFactor = pData->options.uiScale; | |||
| pHost->dispatcher(pHost->handle, | |||
| NATIVE_HOST_OPCODE_UI_RESIZE, | |||
| static_cast<int>(kUiWidth * fLastScaleFactor + 0.5f), | |||
| static_cast<int>(kUiHeight * fLastScaleFactor + 0.5f), | |||
| nullptr, 0.0f); | |||
| if (! fUsesEmbed) | |||
| pHost->dispatcher(pHost->handle, | |||
| NATIVE_HOST_OPCODE_UI_RESIZE, | |||
| static_cast<int>(kUiWidth * fLastScaleFactor + 0.5f), | |||
| static_cast<int>(kUiHeight * fLastScaleFactor + 0.5f), | |||
| nullptr, 0.0f); | |||
| } | |||
| { | |||
| @@ -1537,10 +1500,6 @@ protected: | |||
| void setState(const char* const data) | |||
| { | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| const ScopedJuceMessageThreadRunner sjmtr(*this, true); | |||
| #endif | |||
| // remove all plugins from UI side | |||
| for (uint i=0, count=pData->curPluginCount; i < count; ++i) | |||
| CarlaEngine::callback(true, true, ENGINE_CALLBACK_PLUGIN_REMOVED, count-i-1, 0, 0, 0, 0.0f, nullptr); | |||
| @@ -1750,36 +1709,6 @@ public: | |||
| private: | |||
| const NativeHostDescriptor* const pHost; | |||
| #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER | |||
| const bool kNeedsJuceEvents; | |||
| const CarlaJUCE::ReferenceCountedJuceMessageMessager fJuceMsgMgr; | |||
| CarlaMutex fJuceMsgMutex; | |||
| struct ScopedJuceMessageThreadRunner { | |||
| const CarlaMutexTryLocker cmtl; | |||
| const bool wasLocked; | |||
| ScopedJuceMessageThreadRunner(CarlaEngineNative& self, const bool forceLock) noexcept | |||
| : cmtl(self.fJuceMsgMutex, forceLock), | |||
| wasLocked(cmtl.wasLocked()) | |||
| { | |||
| if (! self.kNeedsJuceEvents) | |||
| return; | |||
| if (! wasLocked) | |||
| return; | |||
| CarlaJUCE::setMessageManagerForThisThread(); | |||
| } | |||
| ~ScopedJuceMessageThreadRunner() | |||
| { | |||
| CarlaJUCE::dispatchMessageManagerMessages(); | |||
| } | |||
| CARLA_DECLARE_NON_COPYABLE(ScopedJuceMessageThreadRunner) | |||
| }; | |||
| #endif | |||
| const bool kIsPatchbay; // rack if false | |||
| const bool kHasMidiIn; | |||
| const bool kHasMidiOut; | |||
| @@ -3112,15 +3041,6 @@ namespace EngineInit { | |||
| CarlaEngine* newJack() { return nullptr; } | |||
| #endif | |||
| #ifdef USING_JUCE_AUDIO_DEVICES | |||
| CarlaEngine* newJuce(const AudioApi) { return nullptr; } | |||
| uint getJuceApiCount() { return 0; } | |||
| const char* getJuceApiName(const uint) { return nullptr; } | |||
| const char* const* getJuceApiDeviceNames(const uint) { return nullptr; } | |||
| const EngineDriverDeviceInfo* getJuceDeviceInfo(const uint, const char* const) { return nullptr; } | |||
| bool showJuceDeviceControlPanel(const uint, const char* const) { return false; } | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| CarlaEngine* newRtAudio(const AudioApi) { return nullptr; } | |||
| uint getRtAudioApiCount() { return 0; } | |||
| @@ -139,7 +139,7 @@ private: | |||
| int argc, const lo_arg* const* argv, const char* types, lo_message msg); | |||
| int handleMsgRegister(bool isTCP, int argc, const lo_arg* const* argv, const char* types, lo_address source); | |||
| int handleMsgUnregister(bool isTCP, int argc, const lo_arg* const* argv, const char* types); | |||
| int handleMsgUnregister(bool isTCP, int argc, const lo_arg* const* argv, const char* types, lo_address source); | |||
| int handleMsgControl(const char* method, | |||
| int argc, const lo_arg* const* argv, const char* types); | |||
| @@ -61,7 +61,7 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, | |||
| return handleMsgRegister(isTCP, argc, argv, types, source); | |||
| if (std::strcmp(path, "/unregister") == 0) | |||
| return handleMsgUnregister(isTCP, argc, argv, types); | |||
| return handleMsgUnregister(isTCP, argc, argv, types, source); | |||
| if (std::strncmp(path, "/ctrl/", 6) == 0) | |||
| { | |||
| @@ -284,7 +284,8 @@ int CarlaEngineOsc::handleMsgRegister(const bool isTCP, | |||
| } | |||
| int CarlaEngineOsc::handleMsgUnregister(const bool isTCP, | |||
| const int argc, const lo_arg* const* const argv, const char* const types) | |||
| const int argc, const lo_arg* const* const argv, const char* const types, | |||
| const lo_address source) | |||
| { | |||
| carla_debug("CarlaEngineOsc::handleMsgUnregister()"); | |||
| CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "s"); | |||
| @@ -297,16 +298,26 @@ int CarlaEngineOsc::handleMsgUnregister(const bool isTCP, | |||
| return 0; | |||
| } | |||
| const char* const url = &argv[0]->s; | |||
| const char* const url = &argv[0]->s; | |||
| const char* const host = lo_address_get_hostname(source); | |||
| const char* const path = lo_url_get_path(url); | |||
| if (std::strcmp(oscData.owner, host) != 0) | |||
| { | |||
| carla_stderr("OSC backend unregister failed, current owner host %s does not match requested %s", | |||
| oscData.owner, host); | |||
| return 0; | |||
| } | |||
| if (std::strcmp(oscData.owner, url) == 0) | |||
| if (std::strcmp(oscData.path, path) != 0) | |||
| { | |||
| carla_stdout("OSC client %s unregistered", url); | |||
| oscData.clear(); | |||
| carla_stderr("OSC backend unregister failed, current owner path %s does not match requested %s", | |||
| oscData.path, path); | |||
| return 0; | |||
| } | |||
| carla_stderr("OSC backend unregister failed, current owner %s does not match requested %s", oscData.owner, url); | |||
| carla_stdout("OSC client %s unregistered", url); | |||
| oscData.clear(); | |||
| return 0; | |||
| } | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaEngineGraph.hpp" | |||
| #include "CarlaEngineInit.hpp" | |||
| @@ -290,7 +276,10 @@ public: | |||
| } | |||
| RtAudio::StreamOptions rtOptions; | |||
| rtOptions.flags = RTAUDIO_MINIMIZE_LATENCY | RTAUDIO_SCHEDULE_REALTIME; | |||
| rtOptions.flags = RTAUDIO_SCHEDULE_REALTIME; | |||
| #ifndef CARLA_OS_MAC | |||
| rtOptions.flags |= RTAUDIO_MINIMIZE_LATENCY; | |||
| #endif | |||
| rtOptions.numberOfBuffers = pData->options.audioTripleBuffer ? 3 : 2; | |||
| rtOptions.streamName = clientName; | |||
| rtOptions.priority = 85; | |||
| @@ -7,13 +7,6 @@ | |||
| CWD=../.. | |||
| include ../Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| endif | |||
| endif | |||
| BUILD_CXX_FLAGS += $(MAGIC_FLAGS) | |||
| ifneq ($(HAIKU),true) | |||
| @@ -48,11 +41,6 @@ endif | |||
| OBJSa = $(OBJS) \ | |||
| $(OBJDIR)/CarlaEngineNative.cpp.o | |||
| ifeq ($(USING_JUCE_AUDIO_DEVICES),true) | |||
| OBJSa += \ | |||
| $(OBJDIR)/CarlaEngineJuce.cpp.o | |||
| endif | |||
| ifeq ($(USING_RTAUDIO),true) | |||
| OBJSa += \ | |||
| $(OBJDIR)/CarlaEngineRtAudio.cpp.o | |||
| @@ -132,13 +120,6 @@ $(OBJDIR)/CarlaEngineJack.cpp.o: CarlaEngineJack.cpp | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(JACK_FLAGS) -c -o $@ | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| $(OBJDIR)/CarlaEngineJuce.cpp.o: CarlaEngineJuce.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -std=gnu++14 -c -o $@ | |||
| endif | |||
| $(OBJDIR)/%.cpp.o: %.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaPluginInternal.hpp" | |||
| #include "CarlaEngine.hpp" | |||
| @@ -987,8 +973,7 @@ bool CarlaPlugin::saveStateToFile(const char* const filename) | |||
| out << streamState; | |||
| out << "</CARLA-PRESET>\n"; | |||
| const String jfilename = String(CharPointer_UTF8(filename)); | |||
| File file(jfilename); | |||
| File file(filename); | |||
| if (file.replaceWithData(out.getData(), out.getDataSize())) | |||
| return true; | |||
| @@ -1004,8 +989,7 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename) | |||
| CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | |||
| carla_debug("CarlaPlugin::loadStateFromFile(\"%s\")", filename); | |||
| const String jfilename = String(CharPointer_UTF8(filename)); | |||
| File file(jfilename); | |||
| File file(filename); | |||
| CARLA_SAFE_ASSERT_RETURN(file.existsAsFile(), false); | |||
| XmlDocument xml(file); | |||
| @@ -2368,7 +2352,7 @@ void CarlaPlugin::clearBuffers() noexcept | |||
| // OSC stuff | |||
| // FIXME | |||
| void CarlaPlugin::handleOscMessage(const char* const, const int, const void* const, const char* const, const lo_message) | |||
| void CarlaPlugin::handleOscMessage(const char*, int, const void*, const char*, void*) | |||
| { | |||
| // do nothing | |||
| } | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Plugin Bridge | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -60,7 +60,7 @@ static String findWinePrefix(const String filename, const int recursionLimit = 1 | |||
| const String path(filename.upToLastOccurrenceOf("/", false, false)); | |||
| if (File(path + "/dosdevices").isDirectory()) | |||
| if (File(String(path + "/dosdevices").toRawUTF8()).isDirectory()) | |||
| return path; | |||
| return findWinePrefix(path, recursionLimit-1); | |||
| @@ -204,7 +204,7 @@ protected: | |||
| if (fBridgeBinary.endsWithIgnoreCase("64.exe") | |||
| && options.wine.executable[0] == CARLA_OS_SEP | |||
| && File(wineCMD + "64").existsAsFile()) | |||
| && File(String(wineCMD + "64").toRawUTF8()).existsAsFile()) | |||
| wineCMD += "64"; | |||
| } | |||
| else | |||
| @@ -996,7 +996,7 @@ public: | |||
| filePath += CARLA_OS_SEP_STR ".CarlaCustomData_"; | |||
| filePath += fShmAudioPool.getFilenameSuffix(); | |||
| if (File(filePath).replaceWithText(value)) | |||
| if (File(filePath.toRawUTF8()).replaceWithText(value)) | |||
| { | |||
| const uint32_t ulength = static_cast<uint32_t>(filePath.length()); | |||
| @@ -1034,7 +1034,7 @@ public: | |||
| filePath += CARLA_OS_SEP_STR ".CarlaChunk_"; | |||
| filePath += fShmAudioPool.getFilenameSuffix(); | |||
| if (File(filePath).replaceWithText(dataBase64.buffer())) | |||
| if (File(filePath.toRawUTF8()).replaceWithText(dataBase64.buffer())) | |||
| { | |||
| const uint32_t ulength = static_cast<uint32_t>(filePath.length()); | |||
| @@ -2550,7 +2550,7 @@ public: | |||
| } | |||
| #endif | |||
| const File bigValueFile(realBigValueFilePath); | |||
| const File bigValueFile(realBigValueFilePath.toRawUTF8()); | |||
| CARLA_SAFE_ASSERT_BREAK(bigValueFile.existsAsFile()); | |||
| CarlaPlugin::setCustomData(type.text, key.text, bigValueFile.loadFileAsString().toRawUTF8(), false); | |||
| @@ -2591,7 +2591,7 @@ public: | |||
| } | |||
| #endif | |||
| const File chunkFile(realChunkFilePath); | |||
| const File chunkFile(realChunkFilePath.toRawUTF8()); | |||
| CARLA_SAFE_ASSERT_BREAK(chunkFile.existsAsFile()); | |||
| fInfo.chunk = carla_getChunkFromBase64String(chunkFile.loadFileAsString().toRawUTF8()); | |||
| @@ -3245,7 +3245,7 @@ private: | |||
| filePath += CARLA_OS_SEP_STR ".CarlaChunk_"; | |||
| filePath += fShmAudioPool.getFilenameSuffix(); | |||
| if (File(filePath).replaceWithText(dataBase64.buffer())) | |||
| if (File(filePath.toRawUTF8()).replaceWithText(dataBase64.buffer())) | |||
| { | |||
| const uint32_t ulength(static_cast<uint32_t>(filePath.length())); | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla JSFX Plugin | |||
| * Copyright (C) 2021-2023 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -224,7 +224,7 @@ public: | |||
| bool getLabel(char* const strBuf) const noexcept override | |||
| { | |||
| std::strncpy(strBuf, fUnit.getFileId().toRawUTF8(), STR_MAX); | |||
| std::strncpy(strBuf, fUnit.getFileId(), STR_MAX); | |||
| return true; | |||
| } | |||
| @@ -943,7 +943,7 @@ public: | |||
| // find which engine search path we're in, and use this as the root | |||
| for (int i = 0; i < splitPaths.size() && !fUnit; ++i) | |||
| { | |||
| const File currentPath(splitPaths[i]); | |||
| const File currentPath(splitPaths[i].toRawUTF8()); | |||
| if (file.isAChildOf(currentPath)) | |||
| fUnit = CarlaJsfxUnit(currentPath, file); | |||
| } | |||
| @@ -957,7 +957,7 @@ public: | |||
| // search a matching file in plugin paths | |||
| for (int i = 0; i < splitPaths.size() && !fUnit; ++i) | |||
| { | |||
| const File currentPath(splitPaths[i]); | |||
| const File currentPath(splitPaths[i].toRawUTF8()); | |||
| const File currentFile = currentPath.getChildFile(CharPointer_UTF8(label)); | |||
| const CarlaJsfxUnit currentUnit(currentPath, currentFile); | |||
| if (File(currentUnit.getFilePath()).existsAsFile()) | |||
| @@ -977,12 +977,12 @@ public: | |||
| ysfx_config_u config(ysfx_config_new()); | |||
| CARLA_SAFE_ASSERT_RETURN(config != nullptr, false); | |||
| const water::String rootPath = fUnit.getRootPath(); | |||
| const water::String filePath = fUnit.getFilePath(); | |||
| const CarlaString rootPath = fUnit.getRootPath(); | |||
| const CarlaString filePath = fUnit.getFilePath(); | |||
| ysfx_register_builtin_audio_formats(config.get()); | |||
| ysfx_set_import_root(config.get(), rootPath.toRawUTF8()); | |||
| ysfx_guess_file_roots(config.get(), filePath.toRawUTF8()); | |||
| ysfx_set_import_root(config.get(), rootPath); | |||
| ysfx_guess_file_roots(config.get(), filePath); | |||
| ysfx_set_log_reporter(config.get(), &CarlaJsfxLogging::logAll); | |||
| ysfx_set_user_data(config.get(), (intptr_t)this); | |||
| @@ -993,7 +993,7 @@ public: | |||
| // get info | |||
| { | |||
| if (! ysfx_load_file(fEffect, filePath.toRawUTF8(), 0)) | |||
| if (! ysfx_load_file(fEffect, filePath, 0)) | |||
| { | |||
| pData->engine->setLastError("Failed to load JSFX"); | |||
| return false; | |||
| @@ -1021,7 +1021,7 @@ public: | |||
| pData->name = carla_strdup(ysfx_get_name(fEffect)); | |||
| } | |||
| pData->filename = carla_strdup(filePath.toRawUTF8()); | |||
| pData->filename = filePath.dup(); | |||
| // --------------------------------------------------------------- | |||
| // register client | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin JACK | |||
| * Copyright (C) 2016-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaPluginInternal.hpp" | |||
| #include "CarlaEngine.hpp" | |||
| @@ -499,7 +485,7 @@ private: | |||
| CARLA_SAFE_ASSERT_RETURN(uniqueCodeID != nullptr && uniqueCodeID[0] != '\0', false); | |||
| CARLA_SAFE_ASSERT_RETURN(appName.isNotEmpty(), false); | |||
| String child(pluginName); | |||
| CarlaString child(pluginName); | |||
| child += "."; | |||
| child += uniqueCodeID; | |||
| @@ -1886,7 +1872,7 @@ private: | |||
| char code[6]; | |||
| code[5] = '\0'; | |||
| String child; | |||
| CarlaString child; | |||
| for (;;) | |||
| { | |||
| @@ -2404,9 +2404,9 @@ public: | |||
| // ------------------------------------------------------------------- | |||
| // OSC stuff | |||
| void handleOscMessage(const char* const method, const int argc, const void* const argvx, const char* const types, const lo_message msg) override | |||
| void handleOscMessage(const char* const method, const int argc, const void* const argvx, const char* const types, void* const msg) override | |||
| { | |||
| const lo_address source(lo_message_get_source(msg)); | |||
| const lo_address source = lo_message_get_source(static_cast<lo_message>(msg)); | |||
| CARLA_SAFE_ASSERT_RETURN(source != nullptr,); | |||
| // protocol for DSSI UIs *must* be UDP | |||
| @@ -2441,7 +2441,7 @@ public: | |||
| if (std::strcmp(method, "midi") == 0) | |||
| return handleOscMessageMIDI(argc, argv, types); | |||
| if (std::strcmp(method, "update") == 0) | |||
| return handleOscMessageUpdate(argc, argv, types, lo_message_get_source(msg)); | |||
| return handleOscMessageUpdate(argc, argv, types, source); | |||
| if (std::strcmp(method, "exiting") == 0) | |||
| return handleOscMessageExiting(); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla LV2 Plugin | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| // testing macros | |||
| // #define LV2_UIS_ONLY_BRIDGES | |||
| @@ -5853,7 +5839,7 @@ public: | |||
| return nullptr; | |||
| } | |||
| water::String basedir(pData->engine->getName()); | |||
| CarlaString basedir(pData->engine->getName()); | |||
| if (temporary) | |||
| basedir += ".tmp"; | |||
| @@ -5881,7 +5867,7 @@ public: | |||
| { | |||
| // seems like a normal save, let's be nice and put a symlink | |||
| const water::String abstractFilename(wabsolutePath.getFileName()); | |||
| const File targetPath(targetDir.getChildFile(abstractFilename)); | |||
| const File targetPath(targetDir.getChildFile(abstractFilename.toRawUTF8())); | |||
| wabsolutePath.createSymbolicLink(targetPath, true); | |||
| @@ -5916,7 +5902,7 @@ public: | |||
| return File(); | |||
| } | |||
| water::String basedir(pData->engine->getName()); | |||
| CarlaString basedir(pData->engine->getName()); | |||
| if (temporary) | |||
| basedir += ".tmp"; | |||
| @@ -5930,7 +5916,7 @@ public: | |||
| if (File::isAbsolutePath(abstractPath)) | |||
| { | |||
| File wabstractPath(abstractPath); | |||
| targetPath = targetDir.getChildFile(wabstractPath.getFileName()); | |||
| targetPath = targetDir.getChildFile(wabstractPath.getFileName().toRawUTF8()); | |||
| if (symlinkIfNeeded) | |||
| { | |||
| @@ -1068,7 +1068,7 @@ public: | |||
| CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||
| carla_debug("CarlaPluginNative::reload() - start"); | |||
| const EngineProcessMode processMode(pData->engine->getProccessMode()); | |||
| const EngineProcessMode processMode = pData->engine->getProccessMode(); | |||
| // Safely disable plugin for reload | |||
| const ScopedDisabler sd(this); | |||
| @@ -1,27 +1,8 @@ | |||
| /* | |||
| * Carla VST2 Plugin | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaPluginInternal.hpp" | |||
| #include "CarlaEngine.hpp" | |||
| #include "AppConfig.h" | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST | |||
| # define USE_JUCE_FOR_VST2 | |||
| #endif | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| @@ -2970,11 +2951,6 @@ CarlaPluginPtr CarlaPlugin::newVST2(const Initializer& init) | |||
| carla_debug("CarlaPlugin::newVST2({%p, \"%s\", \"%s\", " P_INT64 "})", | |||
| init.engine, init.filename, init.name, init.uniqueId); | |||
| #ifdef USE_JUCE_FOR_VST2 | |||
| if (std::getenv("CARLA_DO_NOT_USE_JUCE_FOR_VST2") == nullptr) | |||
| return newJuce(init, "VST2"); | |||
| #endif | |||
| std::shared_ptr<CarlaPluginVST2> plugin(new CarlaPluginVST2(init.engine, init.id)); | |||
| if (! plugin->init(plugin, init.filename, init.name, init.uniqueId, init.options)) | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla VST3 Plugin | |||
| * Copyright (C) 2014-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| /* TODO list | |||
| * noexcept safe calls | |||
| @@ -21,11 +7,6 @@ | |||
| */ | |||
| #include "CarlaPluginInternal.hpp" | |||
| #include "CarlaEngine.hpp" | |||
| #include "AppConfig.h" | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 | |||
| # define USE_JUCE_FOR_VST3 | |||
| #endif | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaVst3Utils.hpp" | |||
| @@ -1406,9 +1387,7 @@ public: | |||
| options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
| options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
| options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| /* TODO | |||
| options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| */ | |||
| options |= PLUGIN_OPTION_SKIP_SENDING_NOTES; | |||
| } | |||
| @@ -2390,6 +2369,9 @@ public: | |||
| } | |||
| } | |||
| if (fEvents.paramInputs != nullptr && fV3.midiMapping != nullptr) | |||
| fMidiControllerAssignments.init(fV3.midiMapping, numEventInputBuses); | |||
| bufferSizeChanged(pData->engine->getBufferSize()); | |||
| reloadPrograms(true); | |||
| @@ -2460,7 +2442,32 @@ public: | |||
| if (pData->needsReset) | |||
| { | |||
| if (pData->ctrlChannel >= 0 && pData->ctrlChannel < MAX_MIDI_CHANNELS && fEvents.eventInputs != nullptr) | |||
| if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| for (uint8_t c=0; c<MAX_MIDI_CHANNELS; ++c) | |||
| { | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(0, c, MIDI_CONTROL_ALL_NOTES_OFF, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId) | |||
| { | |||
| index = i; | |||
| break; | |||
| } | |||
| } | |||
| if (index == UINT32_MAX) | |||
| break; | |||
| fEvents.paramInputs->setParamValueRT(index, 0, 0.f); | |||
| } | |||
| } | |||
| } | |||
| else if (pData->ctrlChannel >= 0 && pData->ctrlChannel < MAX_MIDI_CHANNELS && fEvents.eventInputs != nullptr) | |||
| { | |||
| fEvents.eventInputs->numEvents = MAX_MIDI_NOTE; | |||
| @@ -2588,6 +2595,9 @@ public: | |||
| // -------------------------------------------------------------------------------------------------------- | |||
| // Event Input (System) | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| bool allNotesOffSent = false; | |||
| #endif | |||
| bool isSampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||
| uint32_t startTime = 0; | |||
| @@ -2718,13 +2728,10 @@ public: | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_VALUE) | |||
| { | |||
| v3_param_id paramId = 0; | |||
| if (v3_cpp_obj(fV3.midiMapping)->get_midi_controller_assignment(fV3.midiMapping, | |||
| 0, | |||
| event.channel, | |||
| ctrlEvent.param, | |||
| ¶mId) == V3_OK) | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(0, event.channel, ctrlEvent.param, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| @@ -2764,8 +2771,61 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(0, event.channel, MIDI_CONTROL_ALL_SOUND_OFF, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId) | |||
| { | |||
| index = i; | |||
| break; | |||
| } | |||
| } | |||
| if (index == UINT32_MAX) | |||
| break; | |||
| fEvents.paramInputs->setParamValueRT(index, event.time, 0.f); | |||
| } | |||
| } | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| // TODO map to CC | |||
| if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| postponeRtAllNotesOff(); | |||
| } | |||
| #endif | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(0, event.channel, MIDI_CONTROL_ALL_NOTES_OFF, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| if (static_cast<v3_param_id>(pData->param.data[i].rindex) == paramId) | |||
| { | |||
| index = i; | |||
| break; | |||
| } | |||
| } | |||
| if (index == UINT32_MAX) | |||
| break; | |||
| fEvents.paramInputs->setParamValueRT(index, event.time, 0.f); | |||
| } | |||
| } | |||
| break; | |||
| } // switch (ctrlEvent.type) | |||
| break; | |||
| @@ -2854,13 +2914,10 @@ public: | |||
| const uint8_t control = midiEvent.data[1]; | |||
| const uint8_t value = midiEvent.data[2]; | |||
| v3_param_id paramId = 0; | |||
| if (v3_cpp_obj(fV3.midiMapping)->get_midi_controller_assignment(fV3.midiMapping, | |||
| midiEvent.port, | |||
| event.channel, | |||
| control, | |||
| ¶mId) == V3_OK) | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(midiEvent.port, event.channel, control, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| @@ -2885,13 +2942,10 @@ public: | |||
| { | |||
| const uint8_t pressure = midiEvent.data[1]; | |||
| v3_param_id paramId = 0; | |||
| if (v3_cpp_obj(fV3.midiMapping)->get_midi_controller_assignment(fV3.midiMapping, | |||
| midiEvent.port, | |||
| event.channel, | |||
| 128, | |||
| ¶mId) == V3_OK) | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(midiEvent.port, event.channel, 128, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| @@ -2916,13 +2970,10 @@ public: | |||
| { | |||
| const uint16_t pitchbend = (midiEvent.data[2] << 7) | midiEvent.data[1]; | |||
| v3_param_id paramId = 0; | |||
| if (v3_cpp_obj(fV3.midiMapping)->get_midi_controller_assignment(fV3.midiMapping, | |||
| midiEvent.port, | |||
| event.channel, | |||
| 129, | |||
| ¶mId) == V3_OK) | |||
| v3_param_id paramId; | |||
| if (fMidiControllerAssignments.get(midiEvent.port, event.channel, 129, paramId)) | |||
| { | |||
| // TODO create mapping between paramId -> index | |||
| uint32_t index = UINT32_MAX; | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| { | |||
| @@ -3407,7 +3458,7 @@ public: | |||
| binaryfilename += ".so"; | |||
| #endif | |||
| if (! water::File(binaryfilename).existsAsFile()) | |||
| if (! water::File(binaryfilename.toRawUTF8()).existsAsFile()) | |||
| { | |||
| pData->engine->setLastError("Failed to find a suitable VST3 bundle binary"); | |||
| return false; | |||
| @@ -3544,10 +3595,8 @@ public: | |||
| pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
| if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_PITCHBEND)) | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| /* TODO | |||
| if (isPluginOptionEnabled(options, PLUGIN_OPTION_SEND_ALL_SOUND_OFF)) | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| */ | |||
| if (isPluginOptionInverseEnabled(options, PLUGIN_OPTION_SKIP_SENDING_NOTES)) | |||
| pData->options |= PLUGIN_OPTION_SKIP_SENDING_NOTES; | |||
| } | |||
| @@ -4133,6 +4182,80 @@ private: | |||
| CARLA_DECLARE_NON_COPYABLE(Events) | |||
| } fEvents; | |||
| struct MidiControllerAssignments { | |||
| v3_param_id* mappings; | |||
| bool* used; | |||
| MidiControllerAssignments() noexcept | |||
| : mappings(nullptr), | |||
| used(nullptr) {} | |||
| ~MidiControllerAssignments() noexcept | |||
| { | |||
| clear(); | |||
| } | |||
| void init(v3_midi_mapping** const midiMapping, const uint32_t numPorts) | |||
| { | |||
| clear(); | |||
| if (numPorts == 0) | |||
| return; | |||
| const uint32_t dataPoints = numPorts * MAX_MIDI_CHANNELS * 130; | |||
| mappings = new v3_param_id[dataPoints]; | |||
| used = new bool[dataPoints]; | |||
| carla_zeroStructs(mappings, dataPoints); | |||
| carla_zeroStructs(used, dataPoints); | |||
| v3_param_id paramId; | |||
| for (uint32_t p=0; p<numPorts; ++p) | |||
| { | |||
| for (uint8_t ch=0; ch<MAX_MIDI_CHANNELS; ++ch) | |||
| { | |||
| for (uint16_t cc=0; cc<130; ++cc) | |||
| { | |||
| if (v3_cpp_obj(midiMapping)->get_midi_controller_assignment(midiMapping, p, | |||
| ch, cc, ¶mId) == V3_OK) | |||
| { | |||
| const uint32_t index = p * (130 + MAX_MIDI_CHANNELS) + cc * MAX_MIDI_CHANNELS + ch; | |||
| mappings[index] = paramId; | |||
| used[index] = true; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| void clear() noexcept | |||
| { | |||
| delete[] mappings; | |||
| delete[] used; | |||
| mappings = nullptr; | |||
| used = nullptr; | |||
| } | |||
| bool get(const uint8_t port, const uint8_t channel, const uint8_t cc, v3_param_id& paramId) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_UINT_RETURN(channel < MAX_MIDI_CHANNELS, channel, false); | |||
| CARLA_SAFE_ASSERT_UINT_RETURN(cc < 130, cc, false); | |||
| if (used == nullptr) | |||
| return false; | |||
| const uint32_t index = port * (130 + MAX_MIDI_CHANNELS) + cc * MAX_MIDI_CHANNELS + channel; | |||
| if (used[index]) | |||
| { | |||
| paramId = mappings[index]; | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| } fMidiControllerAssignments; | |||
| #ifdef V3_VIEW_PLATFORM_TYPE_NATIVE | |||
| struct UI { | |||
| bool isAttached; | |||
| @@ -4180,11 +4303,6 @@ CarlaPluginPtr CarlaPlugin::newVST3(const Initializer& init) | |||
| carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\", \"%s\"})", | |||
| init.engine, init.filename, init.name, init.label); | |||
| #ifdef USE_JUCE_FOR_VST3 | |||
| if (std::getenv("CARLA_DO_NOT_USE_JUCE_FOR_VST3") == nullptr) | |||
| return newJuce(init, "VST3"); | |||
| #endif | |||
| std::shared_ptr<CarlaPluginVST3> plugin(new CarlaPluginVST3(init.engine, init.id)); | |||
| if (! plugin->init(plugin, init.filename, init.name, init.label, init.options)) | |||
| @@ -7,13 +7,6 @@ | |||
| CWD=../.. | |||
| include ../Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| endif | |||
| endif | |||
| BUILD_CXX_FLAGS += $(MAGIC_FLAGS) | |||
| ifneq ($(HAIKU),true) | |||
| @@ -35,7 +28,6 @@ OBJS = \ | |||
| $(OBJDIR)/CarlaPluginVST3.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginAU.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginJSFX.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginFluidSynth.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginSFZero.cpp.o | |||
| @@ -83,34 +75,13 @@ $(OBJDIR)/CarlaPluginJSFX.cpp.o: CarlaPluginJSFX.cpp | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(YSFX_FLAGS) -c -o $@ | |||
| ifeq ($(MACOS),true) | |||
| $(OBJDIR)/CarlaPluginVST2.cpp.o: CarlaPluginVST2.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ | |||
| $(OBJDIR)/CarlaPluginAU.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginVST3.cpp.o: CarlaPluginVST3.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ | |||
| $(OBJDIR)/CarlaPluginCLAP.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginCLAP.cpp.o: CarlaPluginCLAP.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ | |||
| endif | |||
| $(OBJDIR)/CarlaPluginVST2.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| ifeq ($(USING_JUCE),true) | |||
| ifeq ($(MACOS),true) | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o: CarlaPluginJuce.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -std=gnu++14 -c -o $@ | |||
| else | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o: CarlaPluginJuce.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -std=gnu++14 -c -o $@ | |||
| endif | |||
| $(OBJDIR)/CarlaPluginVST3.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| endif | |||
| $(OBJDIR)/%.cpp.o: %.cpp | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| @@ -22,11 +8,6 @@ | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaLv2Utils.hpp" | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| # include "AppConfig.h" | |||
| # include "juce_audio_processors/juce_audio_processors.h" | |||
| #endif | |||
| #ifndef STATIC_PLUGIN_TARGET | |||
| # define HAVE_SFZ | |||
| # include "water/containers/Array.h" | |||
| @@ -98,7 +79,7 @@ static void findSFZs(const char* const sfzPaths) | |||
| { | |||
| std::vector<water::File> results; | |||
| if (water::File(*it).findChildFiles(results, water::File::findFiles|water::File::ignoreHiddenFiles, true, "*.sfz") > 0) | |||
| if (water::File(it->toRawUTF8()).findChildFiles(results, water::File::findFiles|water::File::ignoreHiddenFiles, true, "*.sfz") > 0) | |||
| { | |||
| gSFZs.reserve(gSFZs.size() + results.size()); | |||
| gSFZs.insert(gSFZs.end(), results.begin(), results.end()); | |||
| @@ -126,7 +107,7 @@ static void findJSFXs(const char* const jsfxPaths) | |||
| for (water::String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it) | |||
| { | |||
| std::vector<water::File> results; | |||
| const water::File path(*it); | |||
| const water::File path(it->toRawUTF8()); | |||
| if (path.findChildFiles(results, water::File::findFiles|water::File::ignoreHiddenFiles, true, "*") > 0) | |||
| { | |||
| @@ -603,67 +584,6 @@ static const CarlaCachedPluginInfo* get_cached_plugin_lv2(Lv2WorldClass& lv2Worl | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| static juce::StringArray gCachedAuPluginResults; | |||
| static void findAUs() | |||
| { | |||
| if (gCachedAuPluginResults.size() != 0) | |||
| return; | |||
| juce::AudioUnitPluginFormat auFormat; | |||
| gCachedAuPluginResults = auFormat.searchPathsForPlugins(juce::FileSearchPath(), false, false); | |||
| } | |||
| static const CarlaCachedPluginInfo* get_cached_plugin_au(const juce::String pluginId) | |||
| { | |||
| static CarlaCachedPluginInfo info; | |||
| static CarlaString sname, slabel, smaker; | |||
| info.valid = false; | |||
| juce::AudioUnitPluginFormat auFormat; | |||
| juce::OwnedArray<juce::PluginDescription> results; | |||
| auFormat.findAllTypesForFile(results, pluginId); | |||
| CARLA_SAFE_ASSERT_RETURN(results.size() > 0, &info); | |||
| CARLA_SAFE_ASSERT(results.size() == 1); | |||
| juce::PluginDescription* const desc(results[0]); | |||
| CARLA_SAFE_ASSERT_RETURN(desc != nullptr, &info); | |||
| info.category = CB::getPluginCategoryFromName(desc->category.toRawUTF8()); | |||
| info.hints = 0x0; | |||
| info.valid = true; | |||
| if (desc->isInstrument) | |||
| info.hints |= CB::PLUGIN_IS_SYNTH; | |||
| if (true) | |||
| info.hints |= CB::PLUGIN_HAS_CUSTOM_UI; | |||
| info.audioIns = static_cast<uint32_t>(desc->numInputChannels); | |||
| info.audioOuts = static_cast<uint32_t>(desc->numOutputChannels); | |||
| info.cvIns = 0; | |||
| info.cvOuts = 0; | |||
| info.midiIns = desc->isInstrument ? 1 : 0; | |||
| info.midiOuts = 0; | |||
| info.parameterIns = 0; | |||
| info.parameterOuts = 0; | |||
| sname = desc->name.toRawUTF8(); | |||
| slabel = desc->fileOrIdentifier.toRawUTF8(); | |||
| smaker = desc->manufacturerName.toRawUTF8(); | |||
| info.name = sname; | |||
| info.label = slabel; | |||
| info.maker = smaker; | |||
| info.copyright = gCachedPluginsNullCharPtr; | |||
| return &info; | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| #ifdef HAVE_SFZ | |||
| static const CarlaCachedPluginInfo* get_cached_plugin_sfz(const water::File& file) | |||
| { | |||
| @@ -707,17 +627,17 @@ static const CarlaCachedPluginInfo* get_cached_plugin_jsfx(const CB::CarlaJsfxUn | |||
| ysfx_config_u config(ysfx_config_new()); | |||
| const water::String rootPath = unit.getRootPath(); | |||
| const water::String filePath = unit.getFilePath(); | |||
| const CarlaString rootPath = unit.getRootPath(); | |||
| const CarlaString filePath = unit.getFilePath(); | |||
| ysfx_register_builtin_audio_formats(config.get()); | |||
| ysfx_set_import_root(config.get(), rootPath.toRawUTF8()); | |||
| ysfx_guess_file_roots(config.get(), filePath.toRawUTF8()); | |||
| ysfx_set_import_root(config.get(), rootPath); | |||
| ysfx_guess_file_roots(config.get(), filePath); | |||
| ysfx_set_log_reporter(config.get(), &CB::CarlaJsfxLogging::logErrorsOnly); | |||
| ysfx_u effect(ysfx_new(config.get())); | |||
| if (! ysfx_load_file(effect.get(), filePath.toRawUTF8(), 0)) | |||
| if (! ysfx_load_file(effect.get(), filePath, 0)) | |||
| { | |||
| info.valid = false; | |||
| return &info; | |||
| @@ -734,11 +654,11 @@ static const CarlaCachedPluginInfo* get_cached_plugin_jsfx(const CB::CarlaJsfxUn | |||
| } | |||
| static CarlaString name, label, maker; | |||
| label = unit.getFileId().toRawUTF8(); | |||
| label = unit.getFileId(); | |||
| name = ysfx_get_name(effect.get()); | |||
| maker = ysfx_get_author(effect.get()); | |||
| info.valid = true; | |||
| info.valid = true; | |||
| info.category = CB::CarlaJsfxCategories::getFromEffect(effect.get()); | |||
| @@ -796,12 +716,6 @@ uint carla_get_cached_plugin_count(CB::PluginType ptype, const char* pluginPath) | |||
| return lv2World.getPluginCount(); | |||
| } | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| case CB::PLUGIN_AU: | |||
| findAUs(); | |||
| return static_cast<uint>(gCachedAuPluginResults.size()); | |||
| #endif | |||
| #ifdef HAVE_SFZ | |||
| case CB::PLUGIN_SFZ: | |||
| findSFZs(pluginPath); | |||
| @@ -847,12 +761,6 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, | |||
| return get_cached_plugin_lv2(lv2World, lilvPlugin); | |||
| } | |||
| #if defined(USING_JUCE) && defined(CARLA_OS_MAC) | |||
| case CB::PLUGIN_AU: | |||
| CARLA_SAFE_ASSERT_BREAK(index < static_cast<uint>(gCachedAuPluginResults.size())); | |||
| return get_cached_plugin_au(gCachedAuPluginResults.strings.getUnchecked(static_cast<int>(index))); | |||
| #endif | |||
| #ifdef HAVE_SFZ | |||
| case CB::PLUGIN_SFZ: | |||
| CARLA_SAFE_ASSERT_BREAK(index < gSFZs.size()); | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| #include "CarlaString.hpp" | |||
| @@ -31,10 +17,6 @@ | |||
| # pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | |||
| #endif | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| #ifdef USING_RTAUDIO | |||
| # include "rtaudio/RtAudio.h" | |||
| # include "rtmidi/RtMidi.h" | |||
| @@ -64,18 +46,10 @@ const char* carla_get_complete_license_text() | |||
| "<li>LADSPA plugin support</li>" | |||
| "<li>DSSI plugin support</li>" | |||
| "<li>LV2 plugin support</li>" | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST | |||
| "<li>VST2 plugin support (using JUCE)</li>" | |||
| #else | |||
| "<li>VST2 plugin support (using VeSTige header by Javier Serrano Polo)</li>" | |||
| #endif | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 | |||
| "<li>VST3 plugin support (using JUCE)</li>" | |||
| #else | |||
| "<li>VST3 plugin support (using Travesty header files)</li>" | |||
| #endif | |||
| #if defined(USING_JUCE) && JUCE_PLUGINHOST_AU | |||
| "<li>AU plugin support (using JUCE)</li>" | |||
| #ifdef CARLA_OS_MAC | |||
| "<li>AU plugin support (discovery only)</li>" | |||
| #endif | |||
| #ifdef HAVE_YSFX | |||
| "<li>JSFX plugin support (using ysfx)</li>" | |||
| @@ -122,25 +96,6 @@ const char* carla_get_complete_license_text() | |||
| return retText; | |||
| } | |||
| const char* carla_get_juce_version() | |||
| { | |||
| carla_debug("carla_get_juce_version()"); | |||
| static CarlaString retVersion; | |||
| #if defined(USING_JUCE) && !defined(BUILD_BRIDGE) | |||
| if (retVersion.isEmpty()) | |||
| { | |||
| if (const char* const version = CarlaJUCE::getVersion()) | |||
| retVersion = version+6; | |||
| else | |||
| retVersion = "Unknown"; | |||
| } | |||
| #endif | |||
| return retVersion; | |||
| } | |||
| const char* const* carla_get_supported_file_extensions() | |||
| { | |||
| carla_debug("carla_get_supported_file_extensions()"); | |||
| @@ -229,12 +184,6 @@ const char* const* carla_get_supported_features() | |||
| #ifdef HAVE_YSFX | |||
| "jsfx", | |||
| #endif | |||
| #ifdef USING_JUCE | |||
| "juce", | |||
| #if defined(CARLA_OS_MAC) | |||
| "au", | |||
| #endif | |||
| #endif | |||
| nullptr | |||
| }; | |||
| @@ -1,47 +0,0 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "CarlaUtils.h" | |||
| #ifdef USING_JUCE | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| void carla_juce_init() | |||
| { | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::initialiseJuce_GUI(); | |||
| #endif | |||
| } | |||
| void carla_juce_idle() | |||
| { | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::idleJuce_GUI(); | |||
| #endif | |||
| } | |||
| void carla_juce_cleanup() | |||
| { | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::shutdownJuce_GUI(); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| @@ -10,7 +10,7 @@ include ../Makefile.mk | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS) | |||
| BUILD_CXX_FLAGS += $(MAGIC_LIBS) | |||
| BUILD_CXX_FLAGS += $(MAGIC_FLAGS) | |||
| BUILD_CXX_FLAGS += $(YSFX_FLAGS) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -19,7 +19,6 @@ OBJS = \ | |||
| $(OBJDIR)/CachedPlugins.cpp.o \ | |||
| $(OBJDIR)/CarlaUtils.cpp.o \ | |||
| $(OBJDIR)/Information.cpp.o \ | |||
| $(OBJDIR)/JUCE.cpp.o \ | |||
| $(OBJDIR)/PipeClient.cpp.o \ | |||
| $(OBJDIR)/PluginDiscovery.cpp.o \ | |||
| $(OBJDIR)/System.cpp.o \ | |||
| @@ -37,20 +36,9 @@ ifeq ($(HAVE_YSFX),true) | |||
| LIBS += $(MODULEDIR)/ysfx.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS += $(MODULEDIR)/carla_juce.a | |||
| LIBS += $(MODULEDIR)/juce_audio_basics.a | |||
| LIBS += $(MODULEDIR)/juce_audio_processors.a | |||
| LIBS += $(MODULEDIR)/juce_core.a | |||
| LIBS += $(MODULEDIR)/juce_data_structures.a | |||
| LIBS += $(MODULEDIR)/juce_events.a | |||
| LIBS += $(MODULEDIR)/juce_graphics.a | |||
| LIBS += $(MODULEDIR)/juce_gui_basics.a | |||
| LIBS += $(MODULEDIR)/juce_gui_extra.a | |||
| endif | |||
| LINK_FLAGS += $(JACKBRIDGE_LIBS) | |||
| LINK_FLAGS += $(LILV_LIBS) | |||
| LINK_FLAGS += $(MAGIC_LIBS) | |||
| LINK_FLAGS += $(WATER_LIBS) | |||
| ifeq ($(HAVE_X11),true) | |||
| @@ -67,17 +55,6 @@ LINK_FLAGS += -pthread | |||
| endif | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS) | |||
| LINK_FLAGS += $(JUCE_CORE_LIBS) | |||
| LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
| LINK_FLAGS += $(JUCE_EVENTS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| all: $(TARGETS) | |||
| @@ -100,12 +77,10 @@ $(BINDIR)/libcarla_utils$(LIB_EXT): $(OBJS) $(LIBS) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| ifeq ($(MACOS),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| $(OBJDIR)/CachedPlugins.cpp.o: BUILD_CXX_FLAGS += -std=gnu++14 | |||
| endif | |||
| $(OBJDIR)/CarlaUtils.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/Windows.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| endif | |||
| $(OBJDIR)/%.cpp.o: %.cpp | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #include "CarlaUtils.h" | |||
| @@ -41,7 +27,7 @@ static water::String findWinePrefix(const water::String filename, const int recu | |||
| const water::String path(filename.upToLastOccurrenceOf("/", false, false)); | |||
| if (water::File(path + "/dosdevices").isDirectory()) | |||
| if (water::File(water::String(path + "/dosdevices").toRawUTF8()).isDirectory()) | |||
| return path; | |||
| return findWinePrefix(path, recursionLimit-1); | |||
| @@ -111,6 +97,7 @@ public: | |||
| fDiscoveryCallback(discoveryCb), | |||
| fCheckCacheCallback(checkCacheCb), | |||
| fCallbackPtr(callbackPtr), | |||
| fPluginPath(nullptr), | |||
| fPluginsFoundInBinary(false), | |||
| fBinaryIndex(0), | |||
| fBinaryCount(static_cast<uint>(binaries.size())), | |||
| @@ -129,12 +116,14 @@ public: | |||
| const PluginType ptype, | |||
| const CarlaPluginDiscoveryCallback discoveryCb, | |||
| const CarlaPluginCheckCacheCallback checkCacheCb, | |||
| void* const callbackPtr) | |||
| void* const callbackPtr, | |||
| const char* const pluginPath = nullptr) | |||
| : fBinaryType(btype), | |||
| fPluginType(ptype), | |||
| fDiscoveryCallback(discoveryCb), | |||
| fCheckCacheCallback(checkCacheCb), | |||
| fCallbackPtr(callbackPtr), | |||
| fPluginPath(pluginPath != nullptr ? carla_strdup_safe(pluginPath) : nullptr), | |||
| fPluginsFoundInBinary(false), | |||
| fBinaryIndex(0), | |||
| fBinaryCount(1), | |||
| @@ -153,6 +142,7 @@ public: | |||
| std::free(fNextLabel); | |||
| std::free(fNextMaker); | |||
| std::free(fNextName); | |||
| delete[] fPluginPath; | |||
| } | |||
| bool idle() | |||
| @@ -385,6 +375,7 @@ private: | |||
| const CarlaPluginDiscoveryCallback fDiscoveryCallback; | |||
| const CarlaPluginCheckCacheCallback fCheckCacheCallback; | |||
| void* const fCallbackPtr; | |||
| const char* fPluginPath; | |||
| bool fPluginsFoundInBinary; | |||
| uint fBinaryIndex; | |||
| @@ -428,7 +419,7 @@ private: | |||
| { | |||
| helperTool = options.wine.executable.buffer(); | |||
| if (helperTool[0] == CARLA_OS_SEP && File(helperTool + "64").existsAsFile()) | |||
| if (helperTool.isNotEmpty() && helperTool[0] == CARLA_OS_SEP && File(String(helperTool + "64").toRawUTF8()).existsAsFile()) | |||
| helperTool += "64"; | |||
| } | |||
| else | |||
| @@ -457,7 +448,7 @@ private: | |||
| if (envWinePrefix != nullptr && envWinePrefix[0] != '\0') | |||
| winePrefix = envWinePrefix; | |||
| else if (options.wine.fallbackPrefix != nullptr && options.wine.fallbackPrefix[0] != '\0') | |||
| else if (options.wine.fallbackPrefix.isNotEmpty()) | |||
| winePrefix = options.wine.fallbackPrefix.buffer(); | |||
| else | |||
| winePrefix = File::getSpecialLocation(File::userHomeDirectory).getFullPathName() + "/.wine"; | |||
| @@ -467,14 +458,76 @@ private: | |||
| const CarlaScopedEnvVar sev2("WINEPREFIX", winePrefix.toRawUTF8()); | |||
| #endif | |||
| const CarlaScopedEnvVar sev3("CARLA_DISCOVERY_NO_PROCESSING_CHECKS", "1"); | |||
| if (fBinaries.empty()) | |||
| { | |||
| if (fBinaryType == CB::BINARY_NATIVE) | |||
| { | |||
| switch (fPluginType) | |||
| { | |||
| default: | |||
| break; | |||
| case CB::PLUGIN_INTERNAL: | |||
| case CB::PLUGIN_LV2: | |||
| case CB::PLUGIN_JSFX: | |||
| case CB::PLUGIN_SFZ: | |||
| if (const uint count = carla_get_cached_plugin_count(fPluginType, fPluginPath)) | |||
| { | |||
| for (uint i=0; i<count; ++i) | |||
| { | |||
| const CarlaCachedPluginInfo* const pinfo = carla_get_cached_plugin_info(fPluginType, i); | |||
| if (pinfo == nullptr || !pinfo->valid) | |||
| continue; | |||
| char* filename = nullptr; | |||
| CarlaPluginDiscoveryInfo info = {}; | |||
| info.btype = CB::BINARY_NATIVE; | |||
| info.ptype = fPluginType; | |||
| info.metadata.name = pinfo->name; | |||
| info.metadata.maker = pinfo->maker; | |||
| info.metadata.category = pinfo->category; | |||
| info.metadata.hints = pinfo->hints; | |||
| info.io.audioIns = pinfo->audioIns; | |||
| info.io.audioOuts = pinfo->audioOuts; | |||
| info.io.cvIns = pinfo->cvIns; | |||
| info.io.cvOuts = pinfo->cvOuts; | |||
| info.io.midiIns = pinfo->midiIns; | |||
| info.io.midiOuts = pinfo->midiOuts; | |||
| info.io.parameterIns = pinfo->parameterIns; | |||
| info.io.parameterOuts = pinfo->parameterOuts; | |||
| if (fPluginType == CB::PLUGIN_LV2) | |||
| { | |||
| const char* const slash = std::strchr(pinfo->label, CARLA_OS_SEP); | |||
| CARLA_SAFE_ASSERT_BREAK(slash != nullptr); | |||
| filename = strdup(pinfo->label); | |||
| filename[slash - pinfo->label] = '\0'; | |||
| info.filename = filename; | |||
| info.label = slash + 1; | |||
| } | |||
| else | |||
| { | |||
| info.filename = gPluginsDiscoveryNullCharPtr; | |||
| info.label = pinfo->label; | |||
| } | |||
| fDiscoveryCallback(fCallbackPtr, &info, nullptr); | |||
| std::free(filename); | |||
| } | |||
| } | |||
| return; | |||
| } | |||
| } | |||
| #ifndef CARLA_OS_WIN | |||
| if (helperTool.isNotEmpty()) | |||
| startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all"); | |||
| startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all", -1, 2000); | |||
| else | |||
| #endif | |||
| startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all"); | |||
| startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all", -1, 2000); | |||
| } | |||
| else | |||
| { | |||
| @@ -497,10 +550,10 @@ private: | |||
| #ifndef CARLA_OS_WIN | |||
| if (helperTool.isNotEmpty()) | |||
| startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
| startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8(), -1, 2000); | |||
| else | |||
| #endif | |||
| startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
| startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8(), -1, 2000); | |||
| } | |||
| } | |||
| @@ -553,7 +606,7 @@ static bool findDirectories(std::vector<water::File>& files, const char* const p | |||
| for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it) | |||
| { | |||
| const File dir(*it); | |||
| const File dir(it->toRawUTF8()); | |||
| std::vector<File> results; | |||
| if (dir.findChildFiles(results, File::findDirectories|File::ignoreHiddenFiles, true, wildcard) > 0) | |||
| @@ -585,7 +638,7 @@ static bool findFiles(std::vector<water::File>& files, | |||
| for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it) | |||
| { | |||
| const File dir(*it); | |||
| const File dir(it->toRawUTF8()); | |||
| std::vector<File> results; | |||
| if (dir.findChildFiles(results, File::findFiles|File::ignoreHiddenFiles, true, wildcard) > 0) | |||
| @@ -628,7 +681,7 @@ static bool findVST3s(std::vector<water::File>& files, | |||
| for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it) | |||
| { | |||
| const File dir(*it); | |||
| const File dir(it->toRawUTF8()); | |||
| std::vector<File> results; | |||
| if (dir.findChildFiles(results, flags|File::ignoreHiddenFiles, true, "*.vst3") > 0) | |||
| @@ -660,10 +713,28 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| CARLA_SAFE_ASSERT_RETURN(ptype != CB::PLUGIN_NONE, nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(discoveryTool != nullptr && discoveryTool[0] != '\0', nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(discoveryCb != nullptr, nullptr); | |||
| carla_debug("carla_plugin_discovery_start(%s, %d:%s, %d:%s, %s, %p, %p, %p)", | |||
| discoveryTool, btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), pluginPath, | |||
| discoveryCb, checkCacheCb, callbackPtr); | |||
| bool directories = false; | |||
| const char* wildcard = nullptr; | |||
| switch (ptype) | |||
| { | |||
| case CB::PLUGIN_INTERNAL: | |||
| case CB::PLUGIN_LV2: | |||
| case CB::PLUGIN_SFZ: | |||
| case CB::PLUGIN_JSFX: | |||
| case CB::PLUGIN_DLS: | |||
| case CB::PLUGIN_GIG: | |||
| case CB::PLUGIN_SF2: | |||
| CARLA_SAFE_ASSERT_UINT_RETURN(btype == CB::BINARY_NATIVE, btype, nullptr); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| switch (ptype) | |||
| { | |||
| case CB::PLUGIN_NONE: | |||
| @@ -671,16 +742,15 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| case CB::PLUGIN_TYPE_COUNT: | |||
| return nullptr; | |||
| case CB::PLUGIN_LV2: | |||
| case CB::PLUGIN_SFZ: | |||
| case CB::PLUGIN_JSFX: | |||
| { | |||
| const CarlaScopedEnvVar csev("CARLA_DISCOVERY_PATH", pluginPath); | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr, pluginPath); | |||
| } | |||
| case CB::PLUGIN_INTERNAL: | |||
| case CB::PLUGIN_LV2: | |||
| case CB::PLUGIN_AU: | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| case CB::PLUGIN_LADSPA: | |||
| @@ -728,6 +798,11 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| wildcard = "*.vst3"; | |||
| break; | |||
| case CB::PLUGIN_AU: | |||
| directories = true; | |||
| wildcard = "*.component"; | |||
| break; | |||
| case CB::PLUGIN_CLAP: | |||
| wildcard = "*.clap"; | |||
| #ifdef CARLA_OS_MAC | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Bridge Plugin | |||
| * Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #ifndef BUILD_BRIDGE | |||
| # error This file should not be compiled if not building bridge | |||
| @@ -84,6 +70,11 @@ static void saveSignalHandler(int) noexcept | |||
| gSaveNow = true; | |||
| } | |||
| #elif defined(CARLA_OS_WIN) | |||
| static LONG WINAPI winExceptionFilter(_EXCEPTION_POINTERS*) | |||
| { | |||
| return EXCEPTION_EXECUTE_HANDLER; | |||
| } | |||
| static BOOL WINAPI winSignalHandler(DWORD dwCtrlType) noexcept | |||
| { | |||
| if (dwCtrlType == CTRL_C_EVENT) | |||
| @@ -113,13 +104,15 @@ static void initSignalHandler() | |||
| sigaction(SIGUSR1, &sig, nullptr); | |||
| #elif defined(CARLA_OS_WIN) | |||
| SetConsoleCtrlHandler(winSignalHandler, TRUE); | |||
| SetErrorMode(SEM_NOGPFAULTERRORBOX); | |||
| SetUnhandledExceptionFilter(winExceptionFilter); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------------------------------- | |||
| static String gProjectFilename; | |||
| static CarlaHostHandle gHostHandle; | |||
| static CarlaString gProjectFilename; | |||
| static void gIdle() | |||
| { | |||
| @@ -131,7 +124,7 @@ static void gIdle() | |||
| if (gProjectFilename.isNotEmpty()) | |||
| { | |||
| if (! carla_save_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) | |||
| if (! carla_save_plugin_state(gHostHandle, 0, gProjectFilename)) | |||
| carla_stderr("Plugin preset save failed, error was:\n%s", carla_get_last_error(gHostHandle)); | |||
| } | |||
| } | |||
| @@ -202,15 +195,15 @@ public: | |||
| const CarlaPluginInfo* const pInfo = carla_get_plugin_info(gHostHandle, 0); | |||
| CARLA_SAFE_ASSERT_RETURN(pInfo != nullptr,); | |||
| gProjectFilename = CharPointer_UTF8(pInfo->name); | |||
| gProjectFilename = pInfo->name; | |||
| gProjectFilename += ".carxs"; | |||
| if (! File::isAbsolutePath(gProjectFilename)) | |||
| gProjectFilename = File::getCurrentWorkingDirectory().getChildFile(gProjectFilename).getFullPathName(); | |||
| gProjectFilename = File::getCurrentWorkingDirectory().getChildFile(gProjectFilename).getFullPathName().toRawUTF8(); | |||
| if (File(gProjectFilename).existsAsFile()) | |||
| { | |||
| if (carla_load_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) | |||
| if (carla_load_plugin_state(gHostHandle, 0, gProjectFilename)) | |||
| carla_stdout("Plugin state loaded successfully"); | |||
| else | |||
| carla_stderr("Plugin state load failed, error was:\n%s", carla_get_last_error(gHostHandle)); | |||
| @@ -218,7 +211,7 @@ public: | |||
| else | |||
| { | |||
| carla_stdout("Previous plugin state in '%s' is non-existent, will start from default state", | |||
| gProjectFilename.toRawUTF8()); | |||
| gProjectFilename.buffer()); | |||
| } | |||
| } | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla LV2 Single Plugin | |||
| * Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2017-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -29,10 +29,6 @@ | |||
| #include "water/files/File.h" | |||
| #ifdef USING_JUCE | |||
| # include "carla_juce/carla_juce.h" | |||
| #endif | |||
| template<> | |||
| void Lv2PluginBaseClass<CARLA_BACKEND_NAMESPACE::EngineTimeInfo>::clearTimeData() noexcept | |||
| { | |||
| @@ -53,9 +49,6 @@ public: | |||
| const LV2_Feature* const* const features) | |||
| : Lv2PluginBaseClass<EngineTimeInfo>(sampleRate, features), | |||
| fPlugin(nullptr) | |||
| #ifdef USING_JUCE | |||
| , fJuceInitialiser() | |||
| #endif | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(pData->curPluginCount == 0,) | |||
| CARLA_SAFE_ASSERT_RETURN(pData->plugins == nullptr,); | |||
| @@ -490,10 +483,6 @@ protected: | |||
| private: | |||
| CarlaPluginPtr fPlugin; | |||
| #ifdef USING_JUCE | |||
| CarlaJUCE::ScopedJuceInitialiser_GUI fJuceInitialiser; | |||
| #endif | |||
| void updateParameterOutputs() noexcept | |||
| { | |||
| float value; | |||
| @@ -8,15 +8,6 @@ CWD=.. | |||
| MODULENAME=carla-bridge | |||
| include $(CWD)/Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| # FIXME | |||
| BUILD_CXX_FLAGS += -Wno-deprecated-declarations | |||
| endif | |||
| endif | |||
| ifneq ($(HAIKU),true) | |||
| ifneq ($(WASM),true) | |||
| BUILD_CXX_FLAGS += -pthread | |||
| @@ -41,7 +32,6 @@ BUILD_CXX_FLAGS += -DBUILD_BRIDGE -I. -I$(CWD) -I$(CWD)/backend -I$(CWD)/include | |||
| BUILD_CXX_FLAGS += -I$(CWD)/backend/engine -I$(CWD)/backend/plugin | |||
| BUILD_CXX_FLAGS += -UHAVE_SDL | |||
| BUILD_CXX_FLAGS += -UUSING_JUCE_AUDIO_DEVICES | |||
| BUILD_CXX_FLAGS += -UUSING_RTAUDIO | |||
| 32BIT_FLAGS += -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| @@ -92,27 +82,6 @@ LIBS_native += $(MODULEDIR)/ysfx.a | |||
| LINK_FLAGS += $(YSFX_GRAPHICS_LIBS) | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS_native += $(MODULEDIR)/carla_juce.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_processors.a | |||
| LIBS_native += $(MODULEDIR)/juce_core.a | |||
| LIBS_native += $(MODULEDIR)/juce_data_structures.a | |||
| LIBS_native += $(MODULEDIR)/juce_events.a | |||
| LIBS_native += $(MODULEDIR)/juce_graphics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_extra.a | |||
| LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS) | |||
| LINK_FLAGS += $(JUCE_CORE_LIBS) | |||
| LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
| LINK_FLAGS += $(JUCE_EVENTS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif | |||
| ifeq ($(JACKBRIDGE_DIRECT),true) | |||
| LINK_FLAGS += $(JACK_LIBS) | |||
| endif | |||
| @@ -130,6 +99,7 @@ NATIVE_LINK_FLAGS += $(LIBLO_LIBS) | |||
| NATIVE_BUILD_FLAGS += $(FLUIDSYNTH_FLAGS) | |||
| NATIVE_LINK_FLAGS += $(FLUIDSYNTH_LIBS) | |||
| NATIVE_BUILD_FLAGS += $(MAGIC_FLAGS) | |||
| NATIVE_LINK_FLAGS += $(MAGIC_LIBS) | |||
| LIBS_native += $(MODULEDIR)/audio_decoder.a | |||
| @@ -179,7 +149,6 @@ OBJS_native = \ | |||
| $(OBJDIR)/CarlaPluginVST3.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginAU.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginJSFX.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginFluidSynth.cpp.o \ | |||
| $(OBJDIR)/CarlaPluginSFZero.cpp.o \ | |||
| $(OBJDIR)/CarlaStandalone.cpp.o | |||
| @@ -307,12 +276,10 @@ $(OBJDIR)/CarlaEng%.cpp.o: $(CWD)/backend/engine/CarlaEng%.cpp | |||
| $(OBJDIR)/CarlaPluginJSFX.cpp.o: BUILD_CXX_FLAGS += $(YSFX_FLAGS) | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o: BUILD_CXX_FLAGS += -std=gnu++14 | |||
| ifeq ($(MACOS),true) | |||
| $(OBJDIR)/CarlaPluginCLAP.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginAU.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginJuce.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginCLAP.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| $(OBJDIR)/CarlaPluginVST2.cpp.o: BUILD_CXX_FLAGS += -ObjC++ | |||
| @@ -3,7 +3,7 @@ Manager=KDevGenericManager | |||
| Name=Carla | |||
| [Filters] | |||
| Excludes=*/.*,*/*~,*/*.pyc,*/ui_*.py,*/__pycache__/,external,juce_* | |||
| Excludes=*/.*,*/*~,*/*.pyc,*/ui_*.py,*/__pycache__/,external | |||
| [Project] | |||
| VersionControlSupport=kdevgit | |||
| @@ -8,13 +8,6 @@ CWD=.. | |||
| MODULENAME=carla-discovery | |||
| include $(CWD)/Makefile.mk | |||
| # Workaround GCC bug | |||
| ifeq ($(TESTBUILD),true) | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -Wno-undef | |||
| endif | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BINDIR := $(CWD)/../bin | |||
| @@ -46,10 +39,6 @@ BUILD_CXX_FLAGS += -pthread | |||
| LINK_FLAGS += -pthread | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| BUILD_CXX_FLAGS += -std=gnu++14 | |||
| endif | |||
| 32BIT_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| 64BIT_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| ARM32_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| @@ -97,27 +86,6 @@ LIBS_win32 += $(MODULEDIR)/jackbridge.win32e.a | |||
| LIBS_win64 += $(MODULEDIR)/jackbridge.win64e.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS_native += $(MODULEDIR)/carla_juce.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_processors.a | |||
| LIBS_native += $(MODULEDIR)/juce_core.a | |||
| LIBS_native += $(MODULEDIR)/juce_data_structures.a | |||
| LIBS_native += $(MODULEDIR)/juce_events.a | |||
| LIBS_native += $(MODULEDIR)/juce_graphics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_basics.a | |||
| LIBS_native += $(MODULEDIR)/juce_gui_extra.a | |||
| LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_AUDIO_PROCESSORS_LIBS) | |||
| LINK_FLAGS += $(JUCE_CORE_LIBS) | |||
| LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
| LINK_FLAGS += $(JUCE_EVENTS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
| LINK_FLAGS += $(JUCE_GUI_EXTRA_LIBS) | |||
| endif # USING_JUCE | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| OBJS_native = $(OBJDIR)/$(MODULENAME).cpp.o | |||
| @@ -1,19 +1,5 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| // SPDX-License-Identifier: GPL-2.0-or-later | |||
| #pragma once | |||
| @@ -61,13 +47,14 @@ typedef struct { | |||
| uint parameterOuts; | |||
| } PluginListDialogResults; | |||
| #ifdef __cplusplus | |||
| class PluginListDialog; | |||
| #else | |||
| struct PluginListDialog; | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| CARLA_PLUGIN_EXPORT void | |||
| carla_frontend_createAndExecAboutJuceDialog(void* parent); | |||
| CARLA_PLUGIN_EXPORT const JackAppDialogResults* | |||
| carla_frontend_createAndExecJackAppDialog(void* parent, const char* projectFilename); | |||
| @@ -21,7 +21,6 @@ endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += -I. -Iutils | |||
| BUILD_CXX_FLAGS += -I../backend | |||
| BUILD_CXX_FLAGS += -I../includes | |||
| BUILD_CXX_FLAGS += -I../modules | |||
| @@ -30,34 +29,22 @@ BUILD_CXX_FLAGS += -I../utils | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| ifeq ($(WINDOWS),true) | |||
| QT5_LINK_FLAGS = $(shell echo $(LINK_FLAGS) | awk 'sub(" -static","")') | |||
| NON_STATIC_LINK_FLAGS = $(shell echo $(LINK_FLAGS) | awk 'sub(" -static","")') -static-libgcc | |||
| else | |||
| QT5_LINK_FLAGS = $(LINK_FLAGS) | |||
| endif | |||
| ifeq ($(HAVE_QT5),true) | |||
| QT5_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt5Core) | |||
| BUILD_CXX_FLAGS += $(shell $(PKG_CONFIG) --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
| QT5_LINK_FLAGS += -Wl,-rpath,$(QT5_PREFIX)/lib $(shell $(PKG_CONFIG) --libs Qt5Core Qt5Gui Qt5Widgets) | |||
| else ifeq ($(HAVE_QT5PKG),true) | |||
| QT5_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt5OpenGLExtensions) | |||
| BUILD_CXX_FLAGS += -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -I $(QT5_PREFIX)/include/qt5 | |||
| QT5_LINK_FLAGS += -Wl,-rpath,$(QT5_PREFIX)/lib -F $(QT5_PREFIX)/lib -framework QtCore -framework QtGui -framework QtWidgets | |||
| else | |||
| $(error Trying to build frontend without Qt5, cannot continue) | |||
| NON_STATIC_LINK_FLAGS = $(LINK_FLAGS) | |||
| endif | |||
| ifeq ($(WINDOWS),true) | |||
| QT5_LINK_FLAGS += -L$(BINDIR) $(BINDIR)/libcarla_utils.dll | |||
| QT_LINK_FLAGS += -L$(BINDIR) $(BINDIR)/libcarla_utils.dll | |||
| else | |||
| QT5_LINK_FLAGS += -L$(BINDIR) -lcarla_utils | |||
| QT_LINK_FLAGS += -L$(BINDIR) -lcarla_utils | |||
| endif | |||
| ifeq ($(MACOS),true) | |||
| QT5_LINK_FLAGS += -install_name @rpath/libcarla_frontend.dylib | |||
| QT_LINK_FLAGS += -install_name @rpath/libcarla_frontend.dylib | |||
| # FIXME this does not work: -Wl,-rpath,@loader_path | |||
| else | |||
| QT5_LINK_FLAGS += -Wl,-rpath,'$${ORIGIN}' | |||
| QT_LINK_FLAGS += -Wl,-rpath,'$${ORIGIN}' | |||
| endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -71,7 +58,6 @@ QMs = $(patsubst %,translations/carla_%.qm,$(I18N_LANGUAGES)) | |||
| CPP_FILES = \ | |||
| carla_frontend.cpp \ | |||
| dialogs/aboutjucedialog.cpp \ | |||
| dialogs/jackappdialog.cpp \ | |||
| pluginlist/pluginlistdialog.cpp | |||
| @@ -81,6 +67,7 @@ OBJS = $(CPP_FILES:%=$(OBJDIR)/%.o) | |||
| # Resources | |||
| RES = \ | |||
| qt_config.py \ | |||
| resources_rc.py \ | |||
| $(BINDIR)/resources/modgui \ | |||
| $(BINDIR)/resources/patchcanvas \ | |||
| @@ -163,24 +150,37 @@ all: $(BINDIR)/libcarla_frontend$(LIB_EXT) $(QMs) $(RES) $(UIs) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| dialogs/ui_%.h: dialogs/%.ui | |||
| $(UIC_QT5) $< -o $@ | |||
| dialogs/ui_%.h: dialogs/%.ui qt_config.py | |||
| $(UIC) $< -o $@ | |||
| pluginlist/ui_%.h: pluginlist/%.ui | |||
| $(UIC_QT5) $< -o $@ | |||
| pluginlist/ui_%.h: pluginlist/%.ui qt_config.py | |||
| $(UIC) $< -o $@ | |||
| %_ui.py: %.ui | |||
| %_ui.py: %.ui qt_config.py | |||
| $(PYUIC) $< -o $@ | |||
| ui_%.py: $(RESDIR)/ui/%.ui | |||
| ui_%.py: $(RESDIR)/ui/%.ui qt_config.py | |||
| $(PYUIC) $< -o $@ | |||
| qt_config.py: | |||
| ifneq (,$(FRONTEND_TYPE)) | |||
| echo "#!/usr/bin/env python3" > $@ | |||
| echo "qt = $(FRONTEND_TYPE)" >> $@ | |||
| else | |||
| @echo Error: Trying to build frontend without Qt and/or PyQt, cannot continue | |||
| @false | |||
| endif | |||
| resources_rc.py: $(RESDIR)/resources.qrc $(RESDIR)/*/*.png $(RESDIR)/*/*.svg $(RESDIR)/*/*.svgz | |||
| ifeq ($(FRONTEND_TYPE),6) | |||
| $(PYRCC) $< | sed -e 's/PySide6/PyQt6/' > $@ | |||
| else | |||
| $(PYRCC) $< -o $@ | |||
| endif | |||
| test: $(OBJS) $(LIBS) test.cpp | |||
| @echo "Linking test" | |||
| $(SILENT)$(CXX) $(OBJS) test.cpp $(BUILD_CXX_FLAGS) -Wl,-rpath,$(abspath $(BINDIR)) $(QT5_LINK_FLAGS) -o $@ | |||
| $(SILENT)$(CXX) $(OBJS) test.cpp $(BUILD_CXX_FLAGS) $(NON_STATIC_LINK_FLAGS) -Wl,-rpath,$(abspath $(BINDIR)) $(QT_LINK_FLAGS) -o $@ | |||
| $(BINDIR)/resources/%: % | |||
| -@mkdir -p $(BINDIR)/resources | |||
| @@ -199,7 +199,7 @@ $(BINDIR)/resources/zynaddsubfx-ui: ../native-plugins/resources/zynaddsubfx-ui | |||
| $(BINDIR)/libcarla_frontend$(LIB_EXT): $(OBJS) $(LIBS) | |||
| -@mkdir -p $(BINDIR) | |||
| @echo "Linking libcarla_frontend$(LIB_EXT)" | |||
| $(SILENT)$(CXX) $(OBJS) $(BUILD_CXX_FLAGS) $(QT5_LINK_FLAGS) $(SHARED) -o $@ | |||
| $(SILENT)$(CXX) $(OBJS) $(BUILD_CXX_FLAGS) $(QT_CXX_FLAGS) $(NON_STATIC_LINK_FLAGS) $(QT_LINK_FLAGS) $(SHARED) -o $@ | |||
| ifeq ($(MACOS),true) | |||
| # FIXME this does not work: -Wl,-rpath,@loader_path | |||
| $(SILENT)install_name_tool -change ../../../bin/libcarla_utils.dylib @loader_path/libcarla_utils.dylib $@ | |||
| @@ -208,7 +208,7 @@ endif | |||
| $(OBJDIR)/%.cpp.o: %.cpp $(UIs) | |||
| -@mkdir -p $(shell dirname $@) | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(QT_CXX_FLAGS) -c -o $@ | |||
| -include $(OBJS:%.o=%.d) | |||
| @@ -217,7 +217,6 @@ $(OBJDIR)/%.cpp.o: %.cpp $(UIs) | |||
| clean: | |||
| rm -rf $(BINDIR)/libcarla_frontend$(LIB_EXT) $(UIs) $(RES) $(QMs) __pycache__ *.pyc | |||
| # old files | |||
| rm -f ui_carla_about_juce.py | |||
| rm -f ui_carla_add_jack.py | |||
| rm -f ui_carla_database.py | |||
| rm -f ui_carla_refresh.py | |||
| @@ -1,25 +1,16 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla Native Plugins | |||
| # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import Qt | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import Qt | |||
| # ----------------------------------------------------------------------- | |||
| # Imports (Custom) | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -38,6 +24,8 @@ from carla_shared import ( | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2021 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -36,6 +22,8 @@ import sys | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -25,6 +11,8 @@ from carla_host import * | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -25,6 +11,8 @@ from carla_host import * | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -25,6 +11,8 @@ from carla_host import * | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host (plugin UI) | |||
| # Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the GPL.txt file | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtGui import QKeySequence, QMouseEvent | |||
| from PyQt5.QtWidgets import QFrame, QSplitter | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtGui import QKeySequence, QMouseEvent | |||
| from PyQt5.QtWidgets import QFrame, QSplitter | |||
| elif qt_config == 6: | |||
| from PyQt6.QtGui import QKeySequence, QMouseEvent | |||
| from PyQt6.QtWidgets import QFrame, QSplitter | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom Stuff) | |||
| @@ -577,6 +569,8 @@ class CarlaEmbedW(QEmbedWidget): | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------- | |||
| # Get details regarding target usage | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2015 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom Stuff) | |||
| @@ -25,6 +11,8 @@ from carla_host import * | |||
| # Main | |||
| if __name__ == '__main__': | |||
| import resources_rc | |||
| # ------------------------------------------------------------------------------------------------------------------ | |||
| # Read CLI args | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla application | |||
| # Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| @@ -28,11 +14,18 @@ import sys | |||
| from ctypes import CDLL, RTLD_GLOBAL | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (PyQt5) | |||
| # Imports (PyQt) | |||
| from PyQt5.QtCore import QT_VERSION, Qt, QCoreApplication, QLibraryInfo, QLocale, QTranslator | |||
| from PyQt5.QtGui import QColor, QIcon, QPalette | |||
| from PyQt5.QtWidgets import QApplication | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import QT_VERSION, Qt, QCoreApplication, QLibraryInfo, QLocale, QTranslator | |||
| from PyQt5.QtGui import QColor, QIcon, QPalette | |||
| from PyQt5.QtWidgets import QApplication | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import QT_VERSION, Qt, QCoreApplication, QLibraryInfo, QLocale, QTranslator | |||
| from PyQt6.QtGui import QColor, QIcon, QPalette | |||
| from PyQt6.QtWidgets import QApplication | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -137,7 +130,7 @@ class CarlaApplication(): | |||
| self.createPaletteBlue() | |||
| def createApp(self, appName): | |||
| if LINUX: | |||
| if qt_config == 5 and LINUX: | |||
| # AA_X11InitThreads is not available on old PyQt versions | |||
| try: | |||
| attr = Qt.AA_X11InitThreads | |||
| @@ -145,13 +138,13 @@ class CarlaApplication(): | |||
| attr = 10 | |||
| QApplication.setAttribute(attr) | |||
| if QT_VERSION >= 0x50600: | |||
| QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) | |||
| QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) | |||
| if MACOS: | |||
| QApplication.setAttribute(Qt.AA_DontShowIconsInMenus) | |||
| if QT_VERSION >= 0x50600: | |||
| QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) | |||
| QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) | |||
| args = sys.argv[:] | |||
| if WINDOWS: | |||
| @@ -1,25 +1,16 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla Backend code (Qt stuff) | |||
| # Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import pyqtSignal, QObject | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSignal, QObject | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSignal, QObject | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla Backend utils | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| @@ -28,7 +14,11 @@ from ctypes import ( | |||
| POINTER | |||
| ) | |||
| from sip import unwrapinstance | |||
| try: | |||
| from sip import unwrapinstance | |||
| except ImportError: | |||
| def unwrapinstance(_): | |||
| return None | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -91,9 +81,6 @@ class CarlaFrontendLib(): | |||
| def __init__(self, filename): | |||
| self.lib = cdll.LoadLibrary(filename) | |||
| self.lib.carla_frontend_createAndExecAboutJuceDialog.argtypes = (c_void_p,) | |||
| self.lib.carla_frontend_createAndExecAboutJuceDialog.restype = None | |||
| self.lib.carla_frontend_createAndExecJackAppDialog.argtypes = (c_void_p, c_char_p) | |||
| self.lib.carla_frontend_createAndExecJackAppDialog.restype = POINTER(JackApplicationDialogResults) | |||
| @@ -111,9 +98,6 @@ class CarlaFrontendLib(): | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| def createAndExecAboutJuceDialog(self, parent): | |||
| self.lib.carla_frontend_createAndExecAboutJuceDialog(unwrapinstance(parent)) | |||
| def createAndExecJackAppDialog(self, parent, projectFilename): | |||
| return structToDictOrNull(self.lib.carla_frontend_createAndExecJackAppDialog(unwrapinstance(parent), | |||
| projectFilename.encode("utf-8"))) | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla host code | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| @@ -29,23 +15,78 @@ from ctypes import ( | |||
| ) | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (PyQt5) | |||
| # Imports (PyQt) | |||
| # This fails in some configurations, assume >= 5.6.0 in that case | |||
| try: | |||
| from PyQt5.Qt import PYQT_VERSION | |||
| except ImportError: | |||
| PYQT_VERSION = 0x50600 | |||
| from qt_compat import qt_config | |||
| from PyQt5.QtCore import ( | |||
| QT_VERSION, qCritical, QBuffer, QEventLoop, QFileInfo, QIODevice, QMimeData, QModelIndex, QPointF, QTimer, QEvent | |||
| ) | |||
| from PyQt5.QtGui import ( | |||
| QImage, QImageWriter, QPainter, QPalette, QBrush | |||
| ) | |||
| from PyQt5.QtWidgets import ( | |||
| QAction, QApplication, QInputDialog, QFileSystemModel, QListWidgetItem, QGraphicsView, QMainWindow | |||
| ) | |||
| if qt_config == 5: | |||
| # This fails in some configurations, assume >= 5.6.0 in that case | |||
| try: | |||
| from PyQt5.Qt import PYQT_VERSION | |||
| except ImportError: | |||
| PYQT_VERSION = 0x50600 | |||
| from PyQt5.QtCore import ( | |||
| QT_VERSION, | |||
| qCritical, | |||
| QBuffer, | |||
| QEvent, | |||
| QEventLoop, | |||
| QFileInfo, | |||
| QIODevice, | |||
| QMimeData, | |||
| QModelIndex, | |||
| QPointF, | |||
| QTimer, | |||
| ) | |||
| from PyQt5.QtGui import ( | |||
| QBrush, | |||
| QImage, | |||
| QImageWriter, | |||
| QPainter, | |||
| QPalette, | |||
| ) | |||
| from PyQt5.QtWidgets import ( | |||
| QAction, | |||
| QApplication, | |||
| QInputDialog, | |||
| QFileSystemModel, | |||
| QListWidgetItem, | |||
| QGraphicsView, | |||
| QMainWindow, | |||
| ) | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import ( | |||
| PYQT_VERSION, | |||
| QT_VERSION, | |||
| qCritical, | |||
| QBuffer, | |||
| QEvent, | |||
| QEventLoop, | |||
| QFileInfo, | |||
| QIODevice, | |||
| QMimeData, | |||
| QModelIndex, | |||
| QPointF, | |||
| QTimer, | |||
| ) | |||
| from PyQt6.QtGui import ( | |||
| QAction, | |||
| QBrush, | |||
| QFileSystemModel, | |||
| QImage, | |||
| QImageWriter, | |||
| QPainter, | |||
| QPalette, | |||
| ) | |||
| from PyQt6.QtWidgets import ( | |||
| QApplication, | |||
| QInputDialog, | |||
| QListWidgetItem, | |||
| QGraphicsView, | |||
| QMainWindow, | |||
| ) | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -434,7 +475,6 @@ class HostWindow(QMainWindow): | |||
| self.ui.act_file_quit.setMenuRole(QAction.QuitRole) | |||
| self.ui.act_settings_configure.setMenuRole(QAction.PreferencesRole) | |||
| self.ui.act_help_about.setMenuRole(QAction.AboutRole) | |||
| self.ui.act_help_about_juce.setMenuRole(QAction.ApplicationSpecificRole) | |||
| self.ui.act_help_about_qt.setMenuRole(QAction.AboutQtRole) | |||
| self.ui.menu_Settings.setTitle("Panels") | |||
| @@ -526,7 +566,6 @@ class HostWindow(QMainWindow): | |||
| self.ui.act_settings_configure.triggered.connect(self.slot_configureCarla) | |||
| self.ui.act_help_about.triggered.connect(self.slot_aboutCarla) | |||
| self.ui.act_help_about_juce.triggered.connect(self.slot_aboutJuce) | |||
| self.ui.act_help_about_qt.triggered.connect(self.slot_aboutQt) | |||
| self.ui.cb_disk.currentIndexChanged.connect(self.slot_diskFolderChanged) | |||
| @@ -630,10 +669,6 @@ class HostWindow(QMainWindow): | |||
| self.ui.cb_transport_link.setEnabled(False) | |||
| self.ui.cb_transport_link.setVisible(False) | |||
| if "juce" not in features: | |||
| self.ui.act_help_about_juce.setEnabled(False) | |||
| self.ui.act_help_about_juce.setVisible(False) | |||
| # Plugin needs to have timers always running so it receives messages | |||
| if self.host.isPlugin or self.host.isRemote: | |||
| self.startTimers() | |||
| @@ -1674,7 +1709,7 @@ class HostWindow(QMainWindow): | |||
| self.ui.graphicsView.setRenderHint(QPainter.SmoothPixmapTransform, fullAA) | |||
| self.ui.graphicsView.setRenderHint(QPainter.TextAntialiasing, fullAA) | |||
| if self.fSavedSettings[CARLA_KEY_CANVAS_USE_OPENGL] and hasGL: | |||
| if self.fSavedSettings[CARLA_KEY_CANVAS_USE_OPENGL] and hasGL and QPainter.HighQualityAntialiasing is not None: | |||
| self.ui.graphicsView.setRenderHint(QPainter.HighQualityAntialiasing, self.fSavedSettings[CARLA_KEY_CANVAS_HQ_ANTIALIASING]) | |||
| else: | |||
| @@ -2255,10 +2290,6 @@ class HostWindow(QMainWindow): | |||
| def slot_aboutCarla(self): | |||
| CarlaAboutW(self.fParentOrSelf, self.host).exec_() | |||
| @pyqtSlot() | |||
| def slot_aboutJuce(self): | |||
| gCarla.felib.createAndExecAboutJuceDialog(self.fParentOrSelf) | |||
| @pyqtSlot() | |||
| def slot_aboutQt(self): | |||
| QApplication.instance().aboutQt() | |||
| @@ -2884,8 +2915,10 @@ class HostWindow(QMainWindow): | |||
| if MACOS: | |||
| nsViewPtr = int(self.winId()) | |||
| winIdStr = "%x" % gCarla.utils.cocoa_get_window(nsViewPtr) | |||
| else: | |||
| elif WINDOWS or QApplication.platformName() == "xcb": | |||
| winIdStr = "%x" % int(self.winId()) | |||
| else: | |||
| winIdStr = "0" | |||
| self.host.set_engine_option(ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr) | |||
| def hideEvent(self, event): | |||
| @@ -1,25 +1,16 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla Backend code (OSC stuff) | |||
| # Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ---------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import QEventLoop | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import QEventLoop | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import QEventLoop | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla settings code | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (PyQt5) | |||
| # Imports (PyQt) | |||
| from PyQt5.QtCore import pyqtSlot, QT_VERSION, Qt | |||
| from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFileDialog | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSlot, QT_VERSION, Qt | |||
| from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFileDialog | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSlot, QT_VERSION, Qt | |||
| from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QFileDialog | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Custom) | |||
| @@ -601,6 +593,10 @@ class CarlaSettingsW(QDialog): | |||
| # FIXME broken in some Qt5 versions | |||
| self.ui.cb_canvas_eyecandy.setEnabled(QT_VERSION >= 0x50c00) | |||
| # removed in Qt6 | |||
| if QT_VERSION >= 0x60000: | |||
| self.ui.cb_canvas_render_hq_aa.hide() | |||
| self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) | |||
| if MACOS: | |||
| @@ -749,7 +745,7 @@ class CarlaSettingsW(QDialog): | |||
| CARLA_DEFAULT_CANVAS_USE_OPENGL, bool)) | |||
| self.ui.cb_canvas_render_aa.setCheckState( | |||
| settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, int)) | |||
| Qt.CheckState(settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, int))) | |||
| self.ui.cb_canvas_render_hq_aa.setChecked(self.ui.cb_canvas_render_hq_aa.isEnabled() and | |||
| settings.value(CARLA_KEY_CANVAS_HQ_ANTIALIASING, | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Common Carla code | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| @@ -36,17 +22,25 @@ except: | |||
| haveSIGUSR1 = False | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (PyQt5) | |||
| # Imports (PyQt) | |||
| # import changed in PyQt 5.15.8, so try both | |||
| try: | |||
| from PyQt5.Qt import PYQT_VERSION_STR | |||
| except ImportError: | |||
| from PyQt5.QtCore import PYQT_VERSION_STR | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| # import changed in PyQt 5.15.8, so try both | |||
| try: | |||
| from PyQt5.Qt import PYQT_VERSION_STR | |||
| except ImportError: | |||
| from PyQt5.QtCore import PYQT_VERSION_STR | |||
| from PyQt5.QtCore import qFatal, QT_VERSION, QT_VERSION_STR, qWarning, QDir, QSettings | |||
| from PyQt5.QtGui import QIcon | |||
| from PyQt5.QtWidgets import QFileDialog, QMessageBox | |||
| from PyQt5.QtCore import qFatal, QT_VERSION, QT_VERSION_STR, qWarning, QDir, QSettings | |||
| from PyQt5.QtGui import QIcon | |||
| from PyQt5.QtWidgets import QFileDialog, QMessageBox | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import qFatal, PYQT_VERSION_STR, QT_VERSION, QT_VERSION_STR, qWarning, QDir, QSettings | |||
| from PyQt6.QtGui import QIcon | |||
| from PyQt6.QtWidgets import QFileDialog, QMessageBox | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -523,15 +517,21 @@ if not WINDOWS: | |||
| if not winePrefix: | |||
| winePrefix = HOME + "/.wine" | |||
| if os.path.exists(winePrefix): | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/VstPlugins" | |||
| DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST3" | |||
| DEFAULT_CLAP_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/CLAP" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/VstPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/VSTPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/Steinberg/VstPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/Steinberg/VSTPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST2" | |||
| DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST3" | |||
| DEFAULT_CLAP_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/CLAP" | |||
| if kIs64bit and os.path.exists(winePrefix + "/drive_c/Program Files (x86)"): | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/VstPlugins" | |||
| DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST3" | |||
| DEFAULT_CLAP_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/CLAP" | |||
| if kIs64bit: | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/VstPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/VSTPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Steinberg/VstPlugins" | |||
| DEFAULT_VST2_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Steinberg/VSTPlugins" | |||
| DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST3" | |||
| DEFAULT_CLAP_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/CLAP" | |||
| del winePrefix | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin/slot skin code | |||
| # Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt, QRectF, QLineF, QTimer | |||
| from PyQt5.QtGui import QColor, QFont, QFontDatabase, QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QColorDialog, QFrame, QLineEdit, QPushButton | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import Qt, QRectF, QLineF, QTimer | |||
| from PyQt5.QtGui import QColor, QFont, QFontDatabase, QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QColorDialog, QFrame, QLineEdit, QPushButton | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import Qt, QRectF, QLineF, QTimer | |||
| from PyQt6.QtGui import QColor, QFont, QFontDatabase, QPainter, QPainterPath, QPen | |||
| from PyQt6.QtWidgets import QColorDialog, QFrame, QLineEdit, QPushButton | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -262,9 +262,6 @@ class CarlaUtils(): | |||
| self.lib.carla_get_complete_license_text.argtypes = None | |||
| self.lib.carla_get_complete_license_text.restype = c_char_p | |||
| self.lib.carla_get_juce_version.argtypes = None | |||
| self.lib.carla_get_juce_version.restype = c_char_p | |||
| self.lib.carla_get_supported_file_extensions.argtypes = None | |||
| self.lib.carla_get_supported_file_extensions.restype = POINTER(c_char_p) | |||
| @@ -328,15 +325,6 @@ class CarlaUtils(): | |||
| self.lib.carla_pipe_client_destroy.argtypes = [CarlaPipeClientHandle] | |||
| self.lib.carla_pipe_client_destroy.restype = None | |||
| self.lib.carla_juce_init.argtypes = None | |||
| self.lib.carla_juce_init.restype = None | |||
| self.lib.carla_juce_idle.argtypes = None | |||
| self.lib.carla_juce_idle.restype = None | |||
| self.lib.carla_juce_cleanup.argtypes = None | |||
| self.lib.carla_juce_cleanup.restype = None | |||
| self.lib.carla_get_desktop_scale_factor.argtypes = None | |||
| self.lib.carla_get_desktop_scale_factor.restype = c_double | |||
| @@ -399,10 +387,6 @@ class CarlaUtils(): | |||
| def get_complete_license_text(self): | |||
| return charPtrToString(self.lib.carla_get_complete_license_text()) | |||
| # Get the juce version used in the current Carla build. | |||
| def get_juce_version(self): | |||
| return charPtrToString(self.lib.carla_get_juce_version()) | |||
| # Get the list of supported file extensions in carla_load_file(). | |||
| def get_supported_file_extensions(self): | |||
| return charPtrPtrToStringList(self.lib.carla_get_supported_file_extensions()) | |||
| @@ -484,15 +468,6 @@ class CarlaUtils(): | |||
| def pipe_client_destroy(self, handle): | |||
| self.lib.carla_pipe_client_destroy(handle) | |||
| def juce_init(self): | |||
| self.lib.carla_juce_init() | |||
| def juce_idle(self): | |||
| self.lib.carla_juce_idle() | |||
| def juce_cleanup(self): | |||
| self.lib.carla_juce_cleanup() | |||
| def get_desktop_scale_factor(self): | |||
| return float(self.lib.carla_get_desktop_scale_factor()) | |||
| @@ -1,20 +1,6 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla widgets code | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| @@ -22,11 +8,36 @@ | |||
| from abc import abstractmethod | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (PyQt5) | |||
| from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray | |||
| from PyQt5.QtGui import QCursor, QIcon, QPalette, QPixmap | |||
| from PyQt5.QtWidgets import QDialog, QFileDialog, QInputDialog, QMenu, QMessageBox, QScrollArea, QVBoxLayout, QWidget | |||
| # Imports (PyQt) | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray | |||
| from PyQt5.QtGui import QCursor, QIcon, QPalette, QPixmap | |||
| from PyQt5.QtWidgets import ( | |||
| QDialog, | |||
| QFileDialog, | |||
| QInputDialog, | |||
| QMenu, | |||
| QMessageBox, | |||
| QScrollArea, | |||
| QVBoxLayout, | |||
| QWidget, | |||
| ) | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray | |||
| from PyQt6.QtGui import QCursor, QIcon, QPalette, QPixmap | |||
| from PyQt6.QtWidgets import ( | |||
| QDialog, | |||
| QFileDialog, | |||
| QInputDialog, | |||
| QMenu, | |||
| QMessageBox, | |||
| QScrollArea, | |||
| QVBoxLayout, | |||
| QWidget, | |||
| ) | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -202,18 +213,11 @@ class CarlaAboutW(QDialog): | |||
| "<li>http://ll-plugins.nongnu.org/lv2/ext/miditype</li>" | |||
| "</ul>")) | |||
| usingJuce = "juce" in gCarla.utils.get_supported_features() | |||
| if usingJuce and (MACOS or WINDOWS): | |||
| self.ui.l_vst2.setText(self.tr("Using JUCE host")) | |||
| else: | |||
| self.ui.l_vst2.setText(self.tr("About 85% complete (missing vst bank/presets and some minor stuff)")) | |||
| if usingJuce: | |||
| self.ui.l_vst3.setText(self.tr("Using JUCE host")) | |||
| self.ui.l_vst2.setText(self.tr("About 85% complete (missing vst bank/presets and some minor stuff)")) | |||
| self.ui.l_vst3.setText(self.tr("About 66% complete")) | |||
| if MACOS: | |||
| self.ui.l_au.setText(self.tr("Using JUCE host")) | |||
| self.ui.l_au.setText(self.tr("About 20% complete")) | |||
| else: | |||
| self.ui.line_vst3.hide() | |||
| self.ui.l_au.hide() | |||
| @@ -16,5 +16,4 @@ | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| from .aboutjucedialog import AboutJuceDialog | |||
| from .jackappdialog import JackAppDialog | |||
| @@ -1,97 +0,0 @@ | |||
| /* | |||
| * Carla plugin host | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "aboutjucedialog.hpp" | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic push | |||
| # pragma clang diagnostic ignored "-Wdeprecated-copy-with-user-provided-copy" | |||
| # pragma clang diagnostic ignored "-Wdeprecated-register" | |||
| #elif defined(__GNUC__) && __GNUC__ >= 8 | |||
| # pragma GCC diagnostic push | |||
| # pragma GCC diagnostic ignored "-Wclass-memaccess" | |||
| # pragma GCC diagnostic ignored "-Wdeprecated-copy" | |||
| #endif | |||
| #include "ui_aboutjucedialog.h" | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic pop | |||
| #elif defined(__GNUC__) && __GNUC__ >= 8 | |||
| # pragma GCC diagnostic pop | |||
| #endif | |||
| #include "CarlaFrontend.h" | |||
| #include "CarlaUtils.h" | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Jack Application Dialog | |||
| struct AboutJuceDialog::Self { | |||
| Ui_AboutJuceDialog ui; | |||
| Self() {} | |||
| static Self& create() | |||
| { | |||
| Self* const self = new Self(); | |||
| return *self; | |||
| } | |||
| }; | |||
| AboutJuceDialog::AboutJuceDialog(QWidget* const parent) | |||
| : QDialog(parent), | |||
| self(Self::create()) | |||
| { | |||
| self.ui.setupUi(this); | |||
| // ------------------------------------------------------------------------------------------------------------- | |||
| // UI setup | |||
| self.ui.l_text2->setText(tr("This program uses JUCE version") + " " + carla_get_juce_version() + "."); | |||
| adjustSize(); | |||
| setFixedSize(size()); | |||
| Qt::WindowFlags flags = windowFlags(); | |||
| flags &= ~Qt::WindowContextHelpButtonHint; | |||
| #ifdef CARLA_OS_WIN | |||
| flags |= Qt::MSWindowsFixedSizeDialogHint; | |||
| #endif | |||
| setWindowFlags(flags); | |||
| #ifdef CARLA_OS_MAC | |||
| if (parent != nullptr) | |||
| setWindowModality(Qt::WindowModal); | |||
| #endif | |||
| } | |||
| AboutJuceDialog::~AboutJuceDialog() | |||
| { | |||
| delete &self; | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| void carla_frontend_createAndExecAboutJuceDialog(void* const parent) | |||
| { | |||
| AboutJuceDialog(reinterpret_cast<QWidget*>(parent)).exec(); | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,55 +0,0 @@ | |||
| /* | |||
| * Carla plugin host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #pragma once | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic push | |||
| # pragma clang diagnostic ignored "-Wdeprecated-copy-with-user-provided-copy" | |||
| # pragma clang diagnostic ignored "-Wdeprecated-register" | |||
| #elif defined(__GNUC__) && __GNUC__ >= 8 | |||
| # pragma GCC diagnostic push | |||
| # pragma GCC diagnostic ignored "-Wclass-memaccess" | |||
| # pragma GCC diagnostic ignored "-Wdeprecated-copy" | |||
| #endif | |||
| #include <QtWidgets/QDialog> | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic pop | |||
| #elif defined(__GNUC__) && __GNUC__ >= 8 | |||
| # pragma GCC diagnostic pop | |||
| #endif | |||
| #include "CarlaDefines.h" | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // About JUCE dialog | |||
| class AboutJuceDialog : public QDialog | |||
| { | |||
| struct Self; | |||
| Self& self; | |||
| // ---------------------------------------------------------------------------------------------------------------- | |||
| public: | |||
| explicit AboutJuceDialog(QWidget* parent); | |||
| ~AboutJuceDialog() override; | |||
| }; | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,77 +0,0 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla plugin host | |||
| # Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt | |||
| from PyQt5.QtWidgets import QDialog | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Carla) | |||
| from common import MACOS, WINDOWS | |||
| from carla_shared import gCarla | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Imports (Local) | |||
| from aboutjucedialog_ui import Ui_AboutJuceDialog | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # About JUCE dialog | |||
| class AboutJuceDialog(QDialog): | |||
| def __init__(self, parent): | |||
| QDialog.__init__(self, parent) | |||
| self.ui = Ui_AboutJuceDialog() | |||
| self.ui.setupUi(self) | |||
| self.ui.l_text2.setText(self.tr("This program uses JUCE version %s." % gCarla.utils.get_juce_version())) | |||
| self.adjustSize() | |||
| self.setFixedSize(self.size()) | |||
| flags = self.windowFlags() | |||
| flags &= ~Qt.WindowContextHelpButtonHint | |||
| if WINDOWS: | |||
| flags |= Qt.MSWindowsFixedSizeDialogHint | |||
| self.setWindowFlags(flags) | |||
| if MACOS: | |||
| self.setWindowModality(Qt.WindowModal) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| # Testing | |||
| if __name__ == '__main__': | |||
| import sys | |||
| # pylint: disable=ungrouped-imports | |||
| from PyQt5.QtWidgets import QApplication | |||
| # pylint: enable=ungrouped-imports | |||
| # from carla_utils import CarlaUtils | |||
| # gCarla.utils = CarlaUtils(os.path.dirname(__file__) + "/../../../bin/libcarla_utils.dylib") | |||
| _app = QApplication(sys.argv) | |||
| _gui = AboutJuceDialog(None) | |||
| _gui.exec_() | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,187 +0,0 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <ui version="4.0"> | |||
| <class>AboutJuceDialog</class> | |||
| <widget class="QDialog" name="AboutJuceDialog"> | |||
| <property name="geometry"> | |||
| <rect> | |||
| <x>0</x> | |||
| <y>0</y> | |||
| <width>463</width> | |||
| <height>244</height> | |||
| </rect> | |||
| </property> | |||
| <property name="windowTitle"> | |||
| <string>About JUCE</string> | |||
| </property> | |||
| <layout class="QGridLayout" name="gridLayout"> | |||
| <item row="0" column="0"> | |||
| <layout class="QVBoxLayout" name="verticalLayout"> | |||
| <item> | |||
| <widget class="QLabel" name="icon"> | |||
| <property name="minimumSize"> | |||
| <size> | |||
| <width>48</width> | |||
| <height>48</height> | |||
| </size> | |||
| </property> | |||
| <property name="maximumSize"> | |||
| <size> | |||
| <width>48</width> | |||
| <height>48</height> | |||
| </size> | |||
| </property> | |||
| <property name="text"> | |||
| <string/> | |||
| </property> | |||
| <property name="pixmap"> | |||
| <pixmap resource="../resources.qrc">:/48x48/juce.png</pixmap> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <spacer name="verticalSpacer"> | |||
| <property name="orientation"> | |||
| <enum>Qt::Vertical</enum> | |||
| </property> | |||
| <property name="sizeHint" stdset="0"> | |||
| <size> | |||
| <width>20</width> | |||
| <height>40</height> | |||
| </size> | |||
| </property> | |||
| </spacer> | |||
| </item> | |||
| </layout> | |||
| </item> | |||
| <item row="0" column="1"> | |||
| <layout class="QVBoxLayout" name="verticalLayout_2"> | |||
| <item> | |||
| <widget class="QLabel" name="l_text1"> | |||
| <property name="text"> | |||
| <string><b>About JUCE</b></string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <spacer name="verticalSpacer_3"> | |||
| <property name="orientation"> | |||
| <enum>Qt::Vertical</enum> | |||
| </property> | |||
| <property name="sizeType"> | |||
| <enum>QSizePolicy::Fixed</enum> | |||
| </property> | |||
| <property name="sizeHint" stdset="0"> | |||
| <size> | |||
| <width>10</width> | |||
| <height>10</height> | |||
| </size> | |||
| </property> | |||
| </spacer> | |||
| </item> | |||
| <item> | |||
| <widget class="QLabel" name="l_text2"> | |||
| <property name="text"> | |||
| <string>This program uses JUCE version 3.x.x.</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <spacer name="verticalSpacer_4"> | |||
| <property name="orientation"> | |||
| <enum>Qt::Vertical</enum> | |||
| </property> | |||
| <property name="sizeType"> | |||
| <enum>QSizePolicy::Fixed</enum> | |||
| </property> | |||
| <property name="sizeHint" stdset="0"> | |||
| <size> | |||
| <width>10</width> | |||
| <height>10</height> | |||
| </size> | |||
| </property> | |||
| </spacer> | |||
| </item> | |||
| <item> | |||
| <widget class="QLabel" name="l_text3"> | |||
| <property name="text"> | |||
| <string>JUCE is an open-source cross-platform C++ application framework for creating high quality desktop and mobile applications. | |||
| The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_core and juce_events) are permissively licensed under the terms of the ISC license. | |||
| Other modules are covered by a GNU GPL 3.0 license. | |||
| Copyright (C) 2022 Raw Material Software Limited.</string> | |||
| </property> | |||
| <property name="wordWrap"> | |||
| <bool>true</bool> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <spacer name="verticalSpacer_2"> | |||
| <property name="orientation"> | |||
| <enum>Qt::Vertical</enum> | |||
| </property> | |||
| <property name="sizeType"> | |||
| <enum>QSizePolicy::Expanding</enum> | |||
| </property> | |||
| <property name="sizeHint" stdset="0"> | |||
| <size> | |||
| <width>0</width> | |||
| <height>0</height> | |||
| </size> | |||
| </property> | |||
| </spacer> | |||
| </item> | |||
| </layout> | |||
| </item> | |||
| <item row="1" column="0" colspan="2"> | |||
| <widget class="QDialogButtonBox" name="buttonBox"> | |||
| <property name="orientation"> | |||
| <enum>Qt::Horizontal</enum> | |||
| </property> | |||
| <property name="standardButtons"> | |||
| <set>QDialogButtonBox::Ok</set> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| </layout> | |||
| </widget> | |||
| <resources> | |||
| <include location="../resources.qrc"/> | |||
| <include location="../resources.qrc"/> | |||
| </resources> | |||
| <connections> | |||
| <connection> | |||
| <sender>buttonBox</sender> | |||
| <signal>accepted()</signal> | |||
| <receiver>AboutJuceDialog</receiver> | |||
| <slot>accept()</slot> | |||
| <hints> | |||
| <hint type="sourcelabel"> | |||
| <x>248</x> | |||
| <y>254</y> | |||
| </hint> | |||
| <hint type="destinationlabel"> | |||
| <x>157</x> | |||
| <y>274</y> | |||
| </hint> | |||
| </hints> | |||
| </connection> | |||
| <connection> | |||
| <sender>buttonBox</sender> | |||
| <signal>rejected()</signal> | |||
| <receiver>AboutJuceDialog</receiver> | |||
| <slot>reject()</slot> | |||
| <hints> | |||
| <hint type="sourcelabel"> | |||
| <x>316</x> | |||
| <y>260</y> | |||
| </hint> | |||
| <hint type="destinationlabel"> | |||
| <x>286</x> | |||
| <y>274</y> | |||
| </hint> | |||
| </hints> | |||
| </connection> | |||
| </connections> | |||
| </ui> | |||
| @@ -1,28 +1,21 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # A piano roll viewer/editor | |||
| # Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> | |||
| # Copyright (C) 2014-2015 Perry Nguyen | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-FileCopyrightText: 2014-2015 Perry Nguyen | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import pyqtSlot, Qt, QEvent | |||
| from PyQt5.QtGui import QKeyEvent | |||
| from PyQt5.QtWidgets import QMainWindow | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSlot, QT_VERSION, Qt, QEvent | |||
| from PyQt5.QtGui import QKeyEvent | |||
| from PyQt5.QtWidgets import QMainWindow | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSlot, QT_VERSION, Qt, QEvent | |||
| from PyQt6.QtGui import QKeyEvent | |||
| from PyQt6.QtWidgets import QMainWindow | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -74,15 +67,25 @@ class MidiPatternW(ExternalUI, QMainWindow): | |||
| self.ui.piano.modeupdate.connect(self.ui.modeIndicator.changeMode) | |||
| self.ui.piano.modeupdate.connect(self.slot_modeChanged) | |||
| self.ui.timeSigBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.measureBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.defaultLengthBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.quantizeBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| if QT_VERSION >= 0x60000: | |||
| self.ui.timeSigBox.currentIndexChanged.connect(self.slot_paramChanged) | |||
| self.ui.measureBox.currentIndexChanged.connect(self.slot_paramChanged) | |||
| self.ui.defaultLengthBox.currentIndexChanged.connect(self.slot_paramChanged) | |||
| self.ui.quantizeBox.currentIndexChanged.connect(self.slot_paramChanged) | |||
| self.ui.timeSigBox.currentTextChanged.connect(self.slot_setTimeSignature) | |||
| self.ui.measureBox.currentTextChanged.connect(self.ui.piano.setMeasures) | |||
| self.ui.defaultLengthBox.currentTextChanged.connect(self.ui.piano.setDefaultLength) | |||
| self.ui.quantizeBox.currentTextChanged.connect(self.ui.piano.setGridDiv) | |||
| else: | |||
| self.ui.timeSigBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.measureBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.defaultLengthBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.quantizeBox.currentIndexChanged[int].connect(self.slot_paramChanged) | |||
| self.ui.timeSigBox.currentIndexChanged[str].connect(self.slot_setTimeSignature) | |||
| self.ui.measureBox.currentIndexChanged[str].connect(self.ui.piano.setMeasures) | |||
| self.ui.defaultLengthBox.currentIndexChanged[str].connect(self.ui.piano.setDefaultLength) | |||
| self.ui.quantizeBox.currentIndexChanged[str].connect(self.ui.piano.setGridDiv) | |||
| self.ui.timeSigBox.currentIndexChanged[str].connect(self.slot_setTimeSignature) | |||
| self.ui.measureBox.currentIndexChanged[str].connect(self.ui.piano.setMeasures) | |||
| self.ui.defaultLengthBox.currentIndexChanged[str].connect(self.ui.piano.setDefaultLength) | |||
| self.ui.quantizeBox.currentIndexChanged[str].connect(self.ui.piano.setGridDiv) | |||
| self.ui.hSlider.valueChanged.connect(self.ui.graphicsView.setZoomX) | |||
| self.ui.vSlider.valueChanged.connect(self.ui.graphicsView.setZoomY) | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # Carla Native Plugins | |||
| # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import pyqtSlot, Qt | |||
| from PyQt5.QtWidgets import QGridLayout, QLabel, QPushButton, QTextEdit, QWidget | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSlot, Qt | |||
| from PyQt5.QtWidgets import QGridLayout, QLabel, QPushButton, QTextEdit, QWidget | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSlot, Qt | |||
| from PyQt6.QtWidgets import QGridLayout, QLabel, QPushButton, QTextEdit, QWidget | |||
| # ----------------------------------------------------------------------- | |||
| # Imports (Custom) | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import QPointF, QRectF | |||
| from PyQt5.QtWidgets import QGraphicsItem | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import QPointF, QRectF | |||
| from PyQt5.QtWidgets import QGraphicsItem | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import QPointF, QRectF | |||
| from PyQt6.QtWidgets import QGraphicsItem | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Theme) | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt, QPointF | |||
| from PyQt5.QtGui import QColor, QLinearGradient, QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QGraphicsPathItem | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import Qt, QPointF | |||
| from PyQt5.QtGui import QColor, QLinearGradient, QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QGraphicsPathItem | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import Qt, QPointF | |||
| from PyQt6.QtGui import QColor, QLinearGradient, QPainter, QPainterPath, QPen | |||
| from PyQt6.QtWidgets import QGraphicsPathItem | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import qWarning, Qt, QPointF | |||
| from PyQt5.QtGui import QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QGraphicsPathItem | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import qWarning, Qt, QPointF | |||
| from PyQt5.QtGui import QPainter, QPainterPath, QPen | |||
| from PyQt5.QtWidgets import QGraphicsPathItem | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import qWarning, Qt, QPointF | |||
| from PyQt6.QtGui import QPainter, QPainterPath, QPen | |||
| from PyQt6.QtWidgets import QGraphicsPathItem | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,27 +1,22 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2021 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import pyqtSignal, pyqtSlot, qCritical, QT_VERSION, Qt, QPointF, QRectF, QTimer | |||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics, QImage, QLinearGradient, QPainter, QPen | |||
| from PyQt5.QtWidgets import QGraphicsItem, QGraphicsObject, QMenu | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSignal, pyqtSlot, qCritical, QT_VERSION, Qt, QPointF, QRectF, QTimer | |||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics, QImage, QLinearGradient, QPainter, QPen | |||
| from PyQt5.QtSvg import QGraphicsSvgItem | |||
| from PyQt5.QtWidgets import QGraphicsItem, QGraphicsObject, QMenu | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSignal, pyqtSlot, qCritical, QT_VERSION, Qt, QPointF, QRectF, QTimer | |||
| from PyQt6.QtGui import QCursor, QFont, QFontMetrics, QImage, QLinearGradient, QPainter, QPen | |||
| from PyQt6.QtSvgWidgets import QGraphicsSvgItem | |||
| from PyQt6.QtWidgets import QGraphicsItem, QGraphicsObject, QMenu | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Backwards-compatible horizontalAdvance/width call, depending on Qt version | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtGui import QColor | |||
| from PyQt5.QtWidgets import QGraphicsDropShadowEffect | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtGui import QColor | |||
| from PyQt5.QtWidgets import QGraphicsDropShadowEffect | |||
| elif qt_config == 6: | |||
| from PyQt6.QtGui import QColor | |||
| from PyQt6.QtWidgets import QGraphicsDropShadowEffect | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import QAbstractAnimation | |||
| from PyQt5.QtWidgets import QGraphicsObject | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import QAbstractAnimation | |||
| from PyQt5.QtWidgets import QGraphicsObject | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import QAbstractAnimation | |||
| from PyQt6.QtWidgets import QGraphicsObject | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,28 +1,23 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import qCritical, QRectF | |||
| from PyQt5.QtGui import QPainter | |||
| from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||
| from PyQt5.QtWidgets import QGraphicsColorizeEffect | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import qCritical, QRectF | |||
| from PyQt5.QtGui import QPainter | |||
| from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||
| from PyQt5.QtWidgets import QGraphicsColorizeEffect | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import qCritical, QRectF | |||
| from PyQt6.QtGui import QPainter | |||
| from PyQt6.QtSvg import QSvgRenderer | |||
| from PyQt6.QtSvgWidgets import QGraphicsSvgItem | |||
| from PyQt6.QtWidgets import QGraphicsColorizeEffect | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt, QLineF | |||
| from PyQt5.QtGui import QLinearGradient, QPainter, QPen | |||
| from PyQt5.QtWidgets import QGraphicsLineItem | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import Qt, QLineF | |||
| from PyQt5.QtGui import QLinearGradient, QPainter, QPen | |||
| from PyQt5.QtWidgets import QGraphicsLineItem | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import Qt, QLineF | |||
| from PyQt6.QtGui import QLinearGradient, QPainter, QPen | |||
| from PyQt6.QtWidgets import QGraphicsLineItem | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import qWarning, Qt, QLineF | |||
| from PyQt5.QtGui import QPainter, QPen | |||
| from PyQt5.QtWidgets import QGraphicsLineItem | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import qWarning, Qt, QLineF | |||
| from PyQt5.QtGui import QPainter, QPen | |||
| from PyQt5.QtWidgets import QGraphicsLineItem | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import qWarning, Qt, QLineF | |||
| from PyQt6.QtGui import QPainter, QPen | |||
| from PyQt6.QtWidgets import QGraphicsLineItem | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,29 +1,22 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from math import floor | |||
| from PyQt5.QtCore import qCritical, Qt, QLineF, QPointF, QRectF, QTimer | |||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics, QPainter, QPainterPath, QPen, QPolygonF | |||
| from PyQt5.QtWidgets import QGraphicsItem, QMenu | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import qCritical, Qt, QLineF, QPointF, QRectF, QTimer | |||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics, QPainter, QPainterPath, QPen, QPolygonF | |||
| from PyQt5.QtWidgets import QGraphicsItem, QMenu | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import qCritical, Qt, QLineF, QPointF, QRectF, QTimer | |||
| from PyQt6.QtGui import QCursor, QFont, QFontMetrics, QPainter, QPainterPath, QPen, QPolygonF | |||
| from PyQt6.QtWidgets import QGraphicsItem, QMenu | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -120,7 +113,16 @@ class CanvasPort(QGraphicsItem): | |||
| self.update() | |||
| def setPortName(self, port_name): | |||
| if QFontMetrics(self.m_port_font).width(port_name) < QFontMetrics(self.m_port_font).width(self.m_port_name): | |||
| metrics = QFontMetrics(self.m_port_font) | |||
| if QT_VERSION >= 0x50b00: | |||
| width1 = metrics.horizontalAdvance(port_name) | |||
| width2 = metrics.horizontalAdvance(self.m_port_name) | |||
| else: | |||
| width1 = metrics.width(port_name) | |||
| width2 = metrics.width(self.m_port_name) | |||
| if width1 < width2: | |||
| QTimer.singleShot(0, canvas.scene.update) | |||
| self.m_port_name = port_name | |||
| @@ -376,6 +378,7 @@ class CanvasPort(QGraphicsItem): | |||
| conn_pen = QPen(theme.port_parameter_pen_sel) | |||
| else: | |||
| qCritical("PatchCanvas::CanvasPort.paint() - invalid port type '%s'" % port_type2str(self.m_port_type)) | |||
| painter.restore() | |||
| return | |||
| # To prevent quality worsening | |||
| @@ -412,6 +415,7 @@ class CanvasPort(QGraphicsItem): | |||
| poly_locx[4] = lineHinting | |||
| else: | |||
| qCritical("PatchCanvas::CanvasPort.paint() - invalid theme port mode '%s'" % canvas.theme.port_mode) | |||
| painter.restore() | |||
| return | |||
| elif self.m_port_mode == PORT_MODE_OUTPUT: | |||
| @@ -431,10 +435,12 @@ class CanvasPort(QGraphicsItem): | |||
| poly_locx[4] = self.m_port_width + 12 - lineHinting | |||
| else: | |||
| qCritical("PatchCanvas::CanvasPort.paint() - invalid theme port mode '%s'" % canvas.theme.port_mode) | |||
| painter.restore() | |||
| return | |||
| else: | |||
| qCritical("PatchCanvas::CanvasPort.paint() - invalid port mode '%s'" % port_mode2str(self.m_port_mode)) | |||
| painter.restore() | |||
| return | |||
| polygon = QPolygonF() | |||
| @@ -1,25 +1,16 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtWidgets import QGraphicsDropShadowEffect | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtWidgets import QGraphicsDropShadowEffect | |||
| elif qt_config == 6: | |||
| from PyQt6.QtWidgets import QGraphicsDropShadowEffect | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,27 +1,20 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import pyqtSlot, qCritical, qFatal, qWarning, QObject | |||
| from PyQt5.QtCore import QPointF, QRectF, QTimer | |||
| from PyQt5.QtWidgets import QGraphicsObject | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import pyqtSlot, qCritical, qFatal, qWarning, QObject | |||
| from PyQt5.QtCore import QPointF, QRectF, QTimer | |||
| from PyQt5.QtWidgets import QGraphicsObject | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import pyqtSlot, qCritical, qFatal, qWarning, QObject | |||
| from PyQt6.QtCore import QPointF, QRectF, QTimer | |||
| from PyQt6.QtWidgets import QGraphicsObject | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -1,29 +1,22 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas engine using QGraphicsView/Scene | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from math import floor | |||
| from PyQt5.QtCore import QT_VERSION, pyqtSignal, pyqtSlot, qFatal, Qt, QPointF, QRectF | |||
| from PyQt5.QtGui import QCursor, QPixmap, QPolygonF | |||
| from PyQt5.QtWidgets import QGraphicsRectItem, QGraphicsScene | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import QT_VERSION, pyqtSignal, pyqtSlot, qFatal, Qt, QPointF, QRectF | |||
| from PyQt5.QtGui import QCursor, QPixmap, QPolygonF | |||
| from PyQt5.QtWidgets import QGraphicsRectItem, QGraphicsScene | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import QT_VERSION, pyqtSignal, pyqtSlot, qFatal, Qt, QPointF, QRectF | |||
| from PyQt6.QtGui import QCursor, QPixmap, QPolygonF | |||
| from PyQt6.QtWidgets import QGraphicsRectItem, QGraphicsScene | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -314,7 +307,7 @@ class PatchScene(QGraphicsScene): | |||
| ) | |||
| self.m_mouse_rubberband = False | |||
| if event.button() == Qt.MidButton and ctrlDown: | |||
| if event.button() == Qt.MiddleButton and ctrlDown: | |||
| self.startConnectionCut() | |||
| items = self.items(event.scenePos()) | |||
| for item in items: | |||
| @@ -1,26 +1,18 @@ | |||
| #!/usr/bin/env python3 | |||
| # -*- coding: utf-8 -*- | |||
| # PatchBay Canvas Themes | |||
| # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com> | |||
| # | |||
| # This program is free software; you can redistribute it and/or | |||
| # modify it under the terms of the GNU General Public License as | |||
| # published by the Free Software Foundation; either version 2 of | |||
| # the License, or any later version. | |||
| # | |||
| # This program is distributed in the hope that it will be useful, | |||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| # GNU General Public License for more details. | |||
| # | |||
| # For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com> | |||
| # SPDX-License-Identifier: GPL-2.0-or-later | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Global) | |||
| from PyQt5.QtCore import Qt | |||
| from PyQt5.QtGui import QColor, QFont, QPen, QPixmap | |||
| from qt_compat import qt_config | |||
| if qt_config == 5: | |||
| from PyQt5.QtCore import Qt | |||
| from PyQt5.QtGui import QColor, QFont, QPen, QPixmap | |||
| elif qt_config == 6: | |||
| from PyQt6.QtCore import Qt | |||
| from PyQt6.QtGui import QColor, QFont, QPen, QPixmap | |||
| # ------------------------------------------------------------------------------------------------------------ | |||