--- /dev/null
--- /dev/null
++repacking upstream sources
++--------------------------
++
++The original tarball has been repacked to remove files already in Debian.
++
++Upstream also bundles the 'JUCE' framework which is available as a Debian
++package.
++
++Upstream also bundles a slightly modified version of RtAudio.
++Since upstream relies on their modifications, we are using the bundled version
++(rather than the system provided package!)
++
++Files stripped away are enumerated in the Files-Excluded stanza in
++debian/copyright.
++
++
++gbp clone
++---------
++
++Starting with gbp>0.8.1, here's an simple way to automatically fine-tune the
++repository in the following ways:
++- make git ignore any .pc/ directory (created by quilt)
++- enable the "--follow-tags" when running 'git-push', so it's harder
++ to forget to push packaging tags along with the branches.
++
++To enable this, run gbp-clone with the '--postclone debian/gbp/postclone.sh'
++option.
++To enable this for ALL repositories cloned via 'gbp' (in the future), do
++something like the following:
++
++ $ mkdir -p ~/bin
++ $ cp debian/gbp/postclone.sh ~/bin/gbphook-postclone
++ $ cat >> ~/.gbp.conf <<EOF
++ [clone]
++ postclone = ~/bin/gbphook-postclone
++ EOF
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Mon, 1 Aug 2016 12:15:50 +0200
--- /dev/null
--- /dev/null
++giada (0.21.0-1) unstable; urgency=medium
++
++ * New upstream version 0.21.0
++ * Remove obsolete ds tag
++ * Refresh patchset
++ * Bump Standards Version to 4.6.1
++ * Update mcl-audio-buffer in d/missing-sources
++ * The desktop file is now correctly installed by upstream
++ * Bring back keywords and translations to the desktop file and add german
++ translation
++ * Add metainfo file to d/copyright
++ * Bump my d/copyright year
++ * Add d/upstream/metadata
++
++ -- Dennis Braun <d_braun@kabelmail.de> Sun, 15 May 2022 18:50:55 +0200
++
++giada (0.20.1+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.20.1+ds1
++ * Refresh patches
++ * Add patch that fixes missing include
++ * Update geompp library
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Thu, 03 Mar 2022 15:40:12 +0100
++
++giada (0.20.0+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.20.0+ds1
++ - Refresh patches
++ * Update dates in d/copyright
++ - Regenerate d/copyright_hints
++ * Bump d/watch version to 4
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 02 Feb 2022 19:08:36 +0100
++
++giada (0.19.2+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.19.2+ds1
++ - Refresh patches
++ * Add 'licensecheck' target
++ - Generate d/copyright_hints
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Mon, 10 Jan 2022 09:13:23 +0100
++
++giada (0.19.1+ds1-1) unstable; urgency=medium
++
++ * Upload to unstable.
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Thu, 23 Dec 2021 12:58:30 +0100
++
++giada (0.19.1+ds1-1~exp1) experimental; urgency=medium
++
++ * New upstream version 0.19.1+ds1
++
++ [ IOhannes m zmölnig ]
++ * Update patches
++ + Drop obsolete patches
++ + Refresh patches
++ * Add patch for geompp library
++ * Add patch to allow compilation with RtAudio-5.2
++ * Add patch to fix underlinking against libjpeg and libpng
++ * Modernize build with CMake
++ * B-D on fst-dev
++ + Apply some hacks for FST bugs
++ * Versioned B-D on juce
++ * Add missing upstream sources
++ * Update d/copyright
++ * Bump standards version to 4.6.0
++
++ [ Olivier Humbert ]
++ * Update README.source
++ * d/install: use the upstream icon
++ * d/giada.desktop: use the upstream icon
++ * Delete giada.svg (we use the upstream logo now)
++ * d/copyright: update year for me
++ * d/install: typo fix
++
++ [ Dennis Braun ]
++ * Update rtmidi patch
++ * d/control:
++ + Bump dh-compat to 13
++ + Add me as uploader
++ * d/copyright:
++ + Update Files-Excluded
++ + Update copyright year
++ + Add me to the d/ section
++ * d/rules:
++ + Update CXXFLAGS
++ + Remove -Wl,--as-needed flags
++ + Remove get-orig-source
++ * d/copyright: Remove .travis* from Files-Excluded
++
++ [ Debian Janitor ]
++ * Remove constraints unnecessary since buster
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Thu, 23 Dec 2021 09:48:37 +0100
++
++giada (0.16.2.2+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.16.2.2+ds1
++
++ * Refresh patches
++ * Refresh RtMidi patch
++ * Dropped RtAudio patch
++ * Refresh JUCE patch
++ * Build against system-provided nlohmann-json3 library
++ * Provide a patch for that as well
++ * Fix spelling errors
++ * Add salsa-ci configuration
++ * Refresh d/copyright
++ * Bump standards version to 4.5.0
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Thu, 02 Apr 2020 15:19:12 +0200
++
++giada (0.15.4+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.15.4+ds1
++
++ [ Ondřej Nový ]
++ * Use debhelper-compat instead of debian/compat
++
++ [ IOhannes m zmölnig ]
++ * B-D on juce>=5.4.4 (Closes: #925695)
++ * d/patches
++ * Refresh patches
++ * Refresh patches with 'gbp pq'
++ * Add patch for JUCE-5.4.4 compatibility
++ * Build requires C++14
++ * Dropped unrecognized 'IX' macro from manpages
++ * Drop obsolete d/source/local-options
++ * Bump dh compat to 12
++ * Bump standards version to 4.4.0
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Tue, 20 Aug 2019 15:32:54 +0200
++
++giada (0.15.2+ds1-2) unstable; urgency=medium
++
++ * B-D and link against libcurl (Closes: #923898)
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 06 Mar 2019 23:08:53 +0100
++
++giada (0.15.2+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.15.2+ds1
++ * Refreshed patches
++ * Bumped standards version to 4.2.1
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Sat, 08 Sep 2018 18:22:39 +0200
++
++giada (0.15.1+ds1-1) unstable; urgency=medium
++
++ * New upstream version 0.15.1+ds1
++
++ [ Olivier Humbert ]
++ * debian/control :
++ - Build-Depends: alphabetical order + one package per line
++ - long description (lines were too short)
++ * debian/copyright :
++ - adding myself
++ * debian/giada.desktop :
++ - removes [es] name (no need since it's not translated)
++ - adds Comment for EN and ES (then they get displayed when mouseovering the
++ menu item)
++ - adds French Generic Name and Comment
++ * debian/giada.1 :
++ - suppresses a duplicate (.TH)
++ * debian/giada.fr.1 :
++ - adds a French manpage (translated from the English one)
++ * debian/giada.manpages :
++ - install the French manpage
++
++ [ IOhannes m zmölnig ]
++ * Refreshed patches
++ * Switched to +ds suffix (more widespread than +repack)
++ * debian/control :
++ - Set Rules-Requires-Root to no
++ - Bumped standards version to 4.1.5
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 04 Jul 2018 22:23:58 +0200
++
++giada (0.15.0+repack1-2) unstable; urgency=medium
++
++ * Dropped versioned depends on alsa/sndfile/samplerate
++ * Added libatomic to riscv64 builds
++ * Install updstream changelog
++
++ * Upload to unstable.
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Thu, 24 May 2018 10:20:47 +0200
++
++giada (0.15.0+repack1-2~exp2) experimental; urgency=medium
++
++ * Pass "-latomic" via the LIBS
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 23 May 2018 19:56:50 +0200
++
++giada (0.15.0+repack1-2~exp1) experimental; urgency=medium
++
++ * Link against libatomic (on platforms that require it)
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 23 May 2018 16:36:00 +0200
++
++giada (0.15.0+repack1-1) unstable; urgency=medium
++
++ * New upstream version 0.15.0+repack1
++
++ * Enabled VST support
++ * Build with JUCE
++ * Repacked sources
++ * Exclude all travis-ci related stuff
++ * Don't exclude VST files (dropped upstream)
++ * Updated d/watch to new repacksuffix "+repack"
++ * Bumped standards version to 4.1.4
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Tue, 22 May 2018 21:10:08 +0200
++
++giada (0.14.6~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.6~dfsg1
++
++ [ Jaromír Mikeš ]
++ * Patch forwarded.
++
++ [ Ondřej Nový ]
++ * d/control: Set Vcs-* to salsa.debian.org
++
++ [ IOhannes m zmölnig ]
++ * Refreshed patches
++ * Run unit-tests in fake-X environment
++ * Updated maintainer email
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Wed, 04 Apr 2018 21:39:36 +0200
++
++giada (0.14.5~dfsg1-2) unstable; urgency=medium
++
++ * Add patch to fix build on some archs.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Wed, 17 Jan 2018 18:45:49 +0100
++
++giada (0.14.5~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.5~dfsg1
++ * Patches removed/updated.
++ * Set dh/compat 11.
++ * Bump Standards.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Tue, 16 Jan 2018 23:19:27 +0100
++
++giada (0.14.4~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.4~dfsg1
++ * Patch refreshed.
++ * Vcs - use git instead of cgit.
++ * Remove trailing-whitespaces.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Sat, 25 Nov 2017 16:35:14 +0100
++
++giada (0.14.3~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.3~dfsg1
++
++ [ Jaromír Mikeš ]
++ * Introduce postclone.sh script to ignore .pc/ dir.
++ * Patches refreshed.
++
++ [ IOhannes m zmölnig ]
++ * Updated patches
++ * Updated patch headers for use with gbp-pq
++ * Refreshed patches
++ * Updated bundled RtAudio to RtAudio5
++ * Added patch to fix compilation with g++-7 (Closes: #853418)
++ * Added missing files to catch-patch
++ * Dropped unneeded B-D on autotools-dev
++ * Dropped override_dh_autoconf
++ * Calculated BUILD_DATE based on SOURCE_DATE_EPOCH
++ * Switched to https:// where possible
++ * Fixed typo in d/README.source
++ * Bumped standards version to 4.1.1
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Mon, 30 Oct 2017 10:08:45 +0100
++
++giada (0.14.1~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.1~dfsg1
++ * Patch refreshed.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Mon, 24 Jul 2017 01:10:36 +0200
++
++giada (0.14.0~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.14.0~dfsg1
++ * Patch forwarded.
++ * Bump Standards.
++ * Add catch as B-D.
++ * Add patch to test with system-wide catch.
++ * Update copyright file.
++ * Remove not-needed override file.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Mon, 26 Jun 2017 11:43:49 +0200
++
++giada (0.13.2~dfsg1-1) unstable; urgency=medium
++
++ * Remove more files on repack.
++ * New upstream version 0.13.2~dfsg1
++ * Patches deleted/refreshed.
++ * Clean up rules file.
++ * Remove B-D dh_autoreconf.
++ * Update copyright file.
++ * Sign tags.
++ * Install only svg icon.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Sun, 15 Jan 2017 18:51:32 +0100
++
++giada (0.13.1~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.13.1~dfsg1
++ * Patch refreshed.
++ * Set dh/compat 10.
++ * Add patch to fix FTBFS.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Mon, 21 Nov 2016 09:32:55 +0100
++
++giada (0.13.0~dfsg1-1) unstable; urgency=medium
++
++ * New upstream version 0.13.0~dfsg1
++ * Refresh patch.
++ * Drop patches applied upstream.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Fri, 02 Sep 2016 01:35:02 +0200
++
++giada (0.12.2~dfsg1-3) unstable; urgency=medium
++
++ * Add patch to build with gcc6 (Closes: ##831183).
++ * Numbering patches.
++ * Tune .gitignore file.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Mon, 25 Jul 2016 01:09:36 +0200
++
++giada (0.12.2~dfsg1-2) unstable; urgency=medium
++
++ * Add patch to build with new rtmidi lib. (Closes: #828955)
++ Thanks to James Cowgill <jcowgill@debian.org>
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Mon, 04 Jul 2016 16:03:13 +0200
++
++giada (0.12.2~dfsg1-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.12.2~dfsg1
++ * Patch refreshed.
++ * Update copyright file.
++ * Fix hardening.
++ * Add overrides file.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Wed, 22 Jun 2016 14:41:40 +0200
++
++giada (0.12.1~dfsg1-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.12.1~dfsg1
++ * Dropped embedded copy of non-free ASIO SDK in rtaudio-mod
++ that had accidentally crept in with 0.11.0 (Closes: #823318)
++ * Dropped patches applied upstream.
++ * Dropped references to JUCE
++ * Bumped to standards version 3.9.8
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Tue, 17 May 2016 15:54:31 +0200
++
++giada (0.11.2~dfsg-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.11.2~dfsg
++
++ * File-Exclude bundled libraries
++ * Explain repacking in detail
++ * Simplified get-orig-source rule
++ * Added repack-suffix to debian/watch
++ * Refreshed patches
++ * Skip tests that require missing files
++ * Clean up in rtaudio-mod directory
++ * Use https:// in Vcs-Git stanza
++ * Bumped standards to 3.9.7
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Tue, 16 Feb 2016 15:39:16 +0100
++
++giada (0.11.0~dfsg1-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.11.0~dfsg1
++ * Patch applied upstream.
++ * Add libjansson-dev as build dep.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Wed, 02 Dec 2015 09:45:41 +0100
++
++giada (0.10.2~dfsg1-2) unstable; urgency=medium
++
++ * unit-tests
++ * Made tests failing more verbosely
++ * Set ${HOME} to /tmp
++ * debian/README.source
++ * Documented git-tuneclone.sh
++ * Fixed typos
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Mon, 23 Nov 2015 00:15:05 +0100
++
++giada (0.10.2~dfsg1-1) unstable; urgency=medium
++
++ [ Jaromír Mikeš ]
++ * Imported Upstream version 0.10.2~dfsg1
++
++ [ IOhannes m zmölnig ]
++ * Enable C++11 to prevent FTBFS in tests
++ * Made build reproducible
++ * Patch to allow setting of DATE in about-dialog
++ * Set BUILD_DATE to date from debian/changelog
++ * Removed giada.menu
++ (in response to the tech-ctte decision on #741573)
++ * Updated debian/copyright
++ * Updated Vcs-Browser stanza
++ * Added debian/git-tuneclone.sh script
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Fri, 06 Nov 2015 22:28:02 +0100
++
++giada (0.10.1~dfsg1-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.10.1~dfsg1
++ * Remove patch - apllied upstream.
++ * Refresh patch.
++ * Upstream build changed - tune rules file accordingly.
++ * Update copyright file.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Thu, 03 Sep 2015 03:43:59 +0200
++
++giada (0.10.0~dfsg1-1) unstable; urgency=medium
++
++ * Imported Upstream version 0.10.0~dfsg1
++ * Patches refreshed.
++ * Added spelling patch.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Tue, 07 Jul 2015 14:40:16 +0200
++
++giada (0.9.6~dfsg1-3) unstable; urgency=medium
++
++ * Fixed FTBFS due to parenthesization (Closes: #791544)
++
++ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org> Tue, 07 Jul 2015 11:20:10 +0200
++
++giada (0.9.6~dfsg1-2) unstable; urgency=medium
++
++ * Attempt to fix build on arm64 and ppc64el.
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Thu, 18 Jun 2015 09:58:19 +0200
++
++giada (0.9.6~dfsg1-1) unstable; urgency=medium
++
++ * Initial release. (Closes: Bug#786610)
++
++ -- Jaromír Mikeš <mira.mikes@seznam.cz> Wed, 08 Apr 2015 14:59:44 +0200
--- /dev/null
--- /dev/null
++Source: giada
++Section: sound
++Priority: optional
++Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
++Uploaders:
++ Jaromír Mikeš <mira.mikes@seznam.cz>,
++ IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>,
++ Dennis Braun <d_braun@kabelmail.de>
++Build-Depends:
++ debhelper-compat (= 13),
++ catch2,
++ cmake,
++ fst-dev,
++ juce-modules-source (>= 6.0.0~),
++ libfltk1.3-dev,
++ libcurl4-gnutls-dev | libcurl-dev,
++ libjack-dev,
++ libjansson-dev,
++ librtaudio-dev,
++ librtmidi-dev,
++ libsamplerate0-dev,
++ libsndfile1-dev,
++ libxext-dev,
++ libxft2-dev,
++ libxpm-dev,
++ nlohmann-json3-dev,
++ xauth,
++ xvfb,
++Standards-Version: 4.6.1
++Rules-Requires-Root: no
++Vcs-Git: https://salsa.debian.org/multimedia-team/giada.git
++Vcs-Browser: https://salsa.debian.org/multimedia-team/giada
++Homepage: https://www.giadamusic.com
++
++Package: giada
++Architecture: any
++Built-Using: ${juce:BuiltUsing},
++Depends:
++ ${shlibs:Depends},
++ ${misc:Depends},
++Recommends:
++ jackd,
++Description: Hardcore Loop Machine
++ free, minimal, hardcore audio tool for DJs, live performers and electronic
++ musicians. Pick up your channel, fill it with samples or MIDI events and start
++ the show by using this tiny piece of software as a loop machine, drum machine,
++ sequencer, live sampler or yet as a plugin/effect host.
++ .
++ Giada aims to be a compact and portable virtual device for production use and
++ live sets.
--- /dev/null
--- /dev/null
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: Giada
++Upstream-Contact: Giovanni A. Zuliani | Monocasual <giadaloopmachine@gmail.com>
++Source: https://www.giadamusic.com
++
++Files: *
++Copyright:
++ 2010-2022 Giovanni A. Zuliani | Monocasual
++License: GPL-3+
++
++Files: debian/*
++Copyright:
++ 2018-2020 Olivier Humbert <trebmuh@tuxfamily.org>
++ 2015-2017 Jaromír Mikeš <mira.mikes@seznam.cz>
++ 2015-2022 IOhannes m zmölnig <umlaeute@debian.org>
++ 2020-2022 Dennis Braun <d_braun@kabelmail.de>
++License: GPL-3+
++
++Files: debian/missing-sources/mcl-*
++Copyright:
++ 2021 Giovanni A. Zuliani | Monocasual
++License: GPL-3+
++
++Files: extras/com.giadamusic.Giada.metainfo.xml
++Copyright:
++ 2010-2021 Giovanni A. Zuliani | Monocasual
++License: CC0
++ On Debian systems, the complete text of the CC0 license
++ can be found in /usr/share/common-licenses/CC0-1.0.
++
++License: GPL-3+
++ 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 3 of the License, or
++ (at your option) 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.
++Comment: You should have received a copy of the GNU General Public License
++ along with this program. If not, see <https://www.gnu.org/licenses/>.
++ .
++ On Debian systems, the complete text of the GNU General
++ Public License can be found in `/usr/share/common-licenses/GPL-3'.
--- /dev/null
--- /dev/null
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: FIXME
++Upstream-Contact: FIXME
++Source: FIXME
++Disclaimer: Autogenerated by licensecheck
++
++Files: ./src/core/actions/action.h
++ ./src/core/actions/actionRecorder.cpp
++ ./src/core/actions/actionRecorder.h
++ ./src/core/actions/actions.cpp
++ ./src/core/actions/actions.h
++ ./src/core/channels/audioReceiver.cpp
++ ./src/core/channels/audioReceiver.h
++ ./src/core/channels/channel.cpp
++ ./src/core/channels/channel.h
++ ./src/core/channels/channelManager.cpp
++ ./src/core/channels/channelManager.h
++ ./src/core/channels/midiActionRecorder.cpp
++ ./src/core/channels/midiActionRecorder.h
++ ./src/core/channels/midiController.cpp
++ ./src/core/channels/midiController.h
++ ./src/core/channels/midiLearner.cpp
++ ./src/core/channels/midiLearner.h
++ ./src/core/channels/midiLighter.cpp
++ ./src/core/channels/midiLighter.h
++ ./src/core/channels/midiReceiver.cpp
++ ./src/core/channels/midiReceiver.h
++ ./src/core/channels/midiSender.cpp
++ ./src/core/channels/midiSender.h
++ ./src/core/channels/sampleActionRecorder.cpp
++ ./src/core/channels/sampleActionRecorder.h
++ ./src/core/channels/sampleAdvancer.cpp
++ ./src/core/channels/sampleAdvancer.h
++ ./src/core/channels/samplePlayer.cpp
++ ./src/core/channels/samplePlayer.h
++ ./src/core/channels/sampleReactor.cpp
++ ./src/core/channels/sampleReactor.h
++ ./src/core/channels/waveReader.cpp
++ ./src/core/channels/waveReader.h
++ ./src/core/conf.cpp
++ ./src/core/conf.h
++ ./src/core/const.h
++ ./src/core/engine.cpp
++ ./src/core/engine.h
++ ./src/core/eventDispatcher.cpp
++ ./src/core/eventDispatcher.h
++ ./src/core/graphics.cpp
++ ./src/core/graphics.h
++ ./src/core/idManager.cpp
++ ./src/core/idManager.h
++ ./src/core/init.cpp
++ ./src/core/init.h
++ ./src/core/jackTransport.cpp
++ ./src/core/jackTransport.h
++ ./src/core/kernelAudio.cpp
++ ./src/core/kernelAudio.h
++ ./src/core/kernelMidi.cpp
++ ./src/core/kernelMidi.h
++ ./src/core/metronome.cpp
++ ./src/core/metronome.h
++ ./src/core/midiDispatcher.cpp
++ ./src/core/midiDispatcher.h
++ ./src/core/midiEvent.cpp
++ ./src/core/midiEvent.h
++ ./src/core/midiLearnParam.cpp
++ ./src/core/midiLearnParam.h
++ ./src/core/midiMapper.cpp
++ ./src/core/midiMapper.h
++ ./src/core/mixer.cpp
++ ./src/core/mixer.h
++ ./src/core/mixerHandler.cpp
++ ./src/core/mixerHandler.h
++ ./src/core/model/mixer.cpp
++ ./src/core/model/mixer.h
++ ./src/core/model/model.cpp
++ ./src/core/model/model.h
++ ./src/core/model/recorder.cpp
++ ./src/core/model/recorder.h
++ ./src/core/model/sequencer.cpp
++ ./src/core/model/sequencer.h
++ ./src/core/model/storage.cpp
++ ./src/core/model/storage.h
++ ./src/core/patch.cpp
++ ./src/core/patch.h
++ ./src/core/plugins/plugin.cpp
++ ./src/core/plugins/plugin.h
++ ./src/core/plugins/pluginHost.cpp
++ ./src/core/plugins/pluginHost.h
++ ./src/core/plugins/pluginManager.cpp
++ ./src/core/plugins/pluginManager.h
++ ./src/core/plugins/pluginState.cpp
++ ./src/core/plugins/pluginState.h
++ ./src/core/quantizer.cpp
++ ./src/core/quantizer.h
++ ./src/core/queue.h
++ ./src/core/range.h
++ ./src/core/recorder.cpp
++ ./src/core/recorder.h
++ ./src/core/resampler.cpp
++ ./src/core/resampler.h
++ ./src/core/ringBuffer.h
++ ./src/core/sequencer.cpp
++ ./src/core/sequencer.h
++ ./src/core/synchronizer.cpp
++ ./src/core/synchronizer.h
++ ./src/core/types.h
++ ./src/core/wave.cpp
++ ./src/core/wave.h
++ ./src/core/waveFx.cpp
++ ./src/core/waveFx.h
++ ./src/core/waveManager.cpp
++ ./src/core/waveManager.h
++ ./src/core/weakAtomic.h
++ ./src/core/worker.cpp
++ ./src/core/worker.h
++ ./src/glue/actionEditor.cpp
++ ./src/glue/actionEditor.h
++ ./src/glue/channel.cpp
++ ./src/glue/channel.h
++ ./src/glue/config.cpp
++ ./src/glue/config.h
++ ./src/glue/events.cpp
++ ./src/glue/events.h
++ ./src/glue/io.cpp
++ ./src/glue/io.h
++ ./src/glue/layout.cpp
++ ./src/glue/layout.h
++ ./src/glue/main.cpp
++ ./src/glue/main.h
++ ./src/glue/plugin.cpp
++ ./src/glue/plugin.h
++ ./src/glue/recorder.cpp
++ ./src/glue/recorder.h
++ ./src/glue/sampleEditor.cpp
++ ./src/glue/sampleEditor.h
++ ./src/glue/storage.cpp
++ ./src/glue/storage.h
++ ./src/gui/dialogs/about.cpp
++ ./src/gui/dialogs/about.h
++ ./src/gui/dialogs/actionEditor/baseActionEditor.cpp
++ ./src/gui/dialogs/actionEditor/baseActionEditor.h
++ ./src/gui/dialogs/actionEditor/midiActionEditor.cpp
++ ./src/gui/dialogs/actionEditor/midiActionEditor.h
++ ./src/gui/dialogs/actionEditor/sampleActionEditor.cpp
++ ./src/gui/dialogs/actionEditor/sampleActionEditor.h
++ ./src/gui/dialogs/beatsInput.cpp
++ ./src/gui/dialogs/beatsInput.h
++ ./src/gui/dialogs/bpmInput.cpp
++ ./src/gui/dialogs/bpmInput.h
++ ./src/gui/dialogs/browser/browserBase.cpp
++ ./src/gui/dialogs/browser/browserBase.h
++ ./src/gui/dialogs/browser/browserDir.cpp
++ ./src/gui/dialogs/browser/browserDir.h
++ ./src/gui/dialogs/browser/browserLoad.cpp
++ ./src/gui/dialogs/browser/browserLoad.h
++ ./src/gui/dialogs/browser/browserSave.cpp
++ ./src/gui/dialogs/browser/browserSave.h
++ ./src/gui/dialogs/channelNameInput.cpp
++ ./src/gui/dialogs/channelNameInput.h
++ ./src/gui/dialogs/config.cpp
++ ./src/gui/dialogs/config.h
++ ./src/gui/dialogs/keyGrabber.cpp
++ ./src/gui/dialogs/keyGrabber.h
++ ./src/gui/dialogs/mainWindow.cpp
++ ./src/gui/dialogs/mainWindow.h
++ ./src/gui/dialogs/midiIO/midiInputBase.cpp
++ ./src/gui/dialogs/midiIO/midiInputBase.h
++ ./src/gui/dialogs/midiIO/midiInputChannel.cpp
++ ./src/gui/dialogs/midiIO/midiInputChannel.h
++ ./src/gui/dialogs/midiIO/midiInputMaster.cpp
++ ./src/gui/dialogs/midiIO/midiInputMaster.h
++ ./src/gui/dialogs/midiIO/midiOutputBase.cpp
++ ./src/gui/dialogs/midiIO/midiOutputBase.h
++ ./src/gui/dialogs/midiIO/midiOutputMidiCh.cpp
++ ./src/gui/dialogs/midiIO/midiOutputMidiCh.h
++ ./src/gui/dialogs/midiIO/midiOutputSampleCh.cpp
++ ./src/gui/dialogs/midiIO/midiOutputSampleCh.h
++ ./src/gui/dialogs/pluginChooser.cpp
++ ./src/gui/dialogs/pluginChooser.h
++ ./src/gui/dialogs/pluginList.cpp
++ ./src/gui/dialogs/pluginList.h
++ ./src/gui/dialogs/pluginWindow.cpp
++ ./src/gui/dialogs/pluginWindow.h
++ ./src/gui/dialogs/pluginWindowGUI.cpp
++ ./src/gui/dialogs/pluginWindowGUI.h
++ ./src/gui/dialogs/progress.cpp
++ ./src/gui/dialogs/progress.h
++ ./src/gui/dialogs/sampleEditor.cpp
++ ./src/gui/dialogs/sampleEditor.h
++ ./src/gui/dialogs/warnings.cpp
++ ./src/gui/dialogs/warnings.h
++ ./src/gui/dialogs/window.cpp
++ ./src/gui/dialogs/window.h
++ ./src/gui/dispatcher.cpp
++ ./src/gui/dispatcher.h
++ ./src/gui/drawing.cpp
++ ./src/gui/drawing.h
++ ./src/gui/elems/actionEditor/baseAction.cpp
++ ./src/gui/elems/actionEditor/baseAction.h
++ ./src/gui/elems/actionEditor/baseActionEditor.cpp
++ ./src/gui/elems/actionEditor/baseActionEditor.h
++ ./src/gui/elems/actionEditor/envelopeEditor.cpp
++ ./src/gui/elems/actionEditor/envelopeEditor.h
++ ./src/gui/elems/actionEditor/envelopePoint.cpp
++ ./src/gui/elems/actionEditor/envelopePoint.h
++ ./src/gui/elems/actionEditor/gridTool.cpp
++ ./src/gui/elems/actionEditor/gridTool.h
++ ./src/gui/elems/actionEditor/pianoItem.cpp
++ ./src/gui/elems/actionEditor/pianoItem.h
++ ./src/gui/elems/actionEditor/pianoRoll.cpp
++ ./src/gui/elems/actionEditor/pianoRoll.h
++ ./src/gui/elems/actionEditor/sampleAction.cpp
++ ./src/gui/elems/actionEditor/sampleAction.h
++ ./src/gui/elems/actionEditor/sampleActionEditor.cpp
++ ./src/gui/elems/actionEditor/sampleActionEditor.h
++ ./src/gui/elems/actionEditor/splitScroll.cpp
++ ./src/gui/elems/actionEditor/splitScroll.h
++ ./src/gui/elems/actionEditor/velocityEditor.cpp
++ ./src/gui/elems/actionEditor/velocityEditor.h
++ ./src/gui/elems/basics/box.cpp
++ ./src/gui/elems/basics/box.h
++ ./src/gui/elems/basics/boxtypes.cpp
++ ./src/gui/elems/basics/boxtypes.h
++ ./src/gui/elems/basics/button.cpp
++ ./src/gui/elems/basics/button.h
++ ./src/gui/elems/basics/check.cpp
++ ./src/gui/elems/basics/check.h
++ ./src/gui/elems/basics/choice.cpp
++ ./src/gui/elems/basics/choice.h
++ ./src/gui/elems/basics/dial.cpp
++ ./src/gui/elems/basics/dial.h
++ ./src/gui/elems/basics/group.cpp
++ ./src/gui/elems/basics/group.h
++ ./src/gui/elems/basics/input.cpp
++ ./src/gui/elems/basics/input.h
++ ./src/gui/elems/basics/liquidScroll.cpp
++ ./src/gui/elems/basics/liquidScroll.h
++ ./src/gui/elems/basics/pack.cpp
++ ./src/gui/elems/basics/pack.h
++ ./src/gui/elems/basics/progress.cpp
++ ./src/gui/elems/basics/progress.h
++ ./src/gui/elems/basics/resizerBar.cpp
++ ./src/gui/elems/basics/resizerBar.h
++ ./src/gui/elems/basics/scroll.cpp
++ ./src/gui/elems/basics/scroll.h
++ ./src/gui/elems/basics/scrollPack.cpp
++ ./src/gui/elems/basics/scrollPack.h
++ ./src/gui/elems/basics/slider.cpp
++ ./src/gui/elems/basics/slider.h
++ ./src/gui/elems/basics/split.cpp
++ ./src/gui/elems/basics/split.h
++ ./src/gui/elems/basics/statusButton.cpp
++ ./src/gui/elems/basics/statusButton.h
++ ./src/gui/elems/browser.cpp
++ ./src/gui/elems/browser.h
++ ./src/gui/elems/config/tabAudio.cpp
++ ./src/gui/elems/config/tabAudio.h
++ ./src/gui/elems/config/tabBehaviors.cpp
++ ./src/gui/elems/config/tabBehaviors.h
++ ./src/gui/elems/config/tabMidi.cpp
++ ./src/gui/elems/config/tabMidi.h
++ ./src/gui/elems/config/tabMisc.cpp
++ ./src/gui/elems/config/tabMisc.h
++ ./src/gui/elems/config/tabPlugins.cpp
++ ./src/gui/elems/config/tabPlugins.h
++ ./src/gui/elems/mainWindow/keyboard/channel.cpp
++ ./src/gui/elems/mainWindow/keyboard/channel.h
++ ./src/gui/elems/mainWindow/keyboard/channelButton.cpp
++ ./src/gui/elems/mainWindow/keyboard/channelButton.h
++ ./src/gui/elems/mainWindow/keyboard/channelMode.cpp
++ ./src/gui/elems/mainWindow/keyboard/channelMode.h
++ ./src/gui/elems/mainWindow/keyboard/channelStatus.cpp
++ ./src/gui/elems/mainWindow/keyboard/channelStatus.h
++ ./src/gui/elems/mainWindow/keyboard/column.cpp
++ ./src/gui/elems/mainWindow/keyboard/column.h
++ ./src/gui/elems/mainWindow/keyboard/keyboard.cpp
++ ./src/gui/elems/mainWindow/keyboard/keyboard.h
++ ./src/gui/elems/mainWindow/keyboard/midiChannel.h
++ ./src/gui/elems/mainWindow/keyboard/midiChannelButton.cpp
++ ./src/gui/elems/mainWindow/keyboard/midiChannelButton.h
++ ./src/gui/elems/mainWindow/keyboard/sampleChannel.cpp
++ ./src/gui/elems/mainWindow/keyboard/sampleChannel.h
++ ./src/gui/elems/mainWindow/keyboard/sampleChannelButton.cpp
++ ./src/gui/elems/mainWindow/keyboard/sampleChannelButton.h
++ ./src/gui/elems/mainWindow/mainIO.cpp
++ ./src/gui/elems/mainWindow/mainIO.h
++ ./src/gui/elems/mainWindow/mainMenu.cpp
++ ./src/gui/elems/mainWindow/mainMenu.h
++ ./src/gui/elems/mainWindow/mainTimer.cpp
++ ./src/gui/elems/mainWindow/mainTimer.h
++ ./src/gui/elems/mainWindow/mainTransport.cpp
++ ./src/gui/elems/mainWindow/mainTransport.h
++ ./src/gui/elems/mainWindow/sequencer.cpp
++ ./src/gui/elems/mainWindow/sequencer.h
++ ./src/gui/elems/midiIO/midiLearner.cpp
++ ./src/gui/elems/midiIO/midiLearner.h
++ ./src/gui/elems/midiIO/midiLearnerPack.cpp
++ ./src/gui/elems/midiIO/midiLearnerPack.h
++ ./src/gui/elems/plugin/pluginBrowser.cpp
++ ./src/gui/elems/plugin/pluginBrowser.h
++ ./src/gui/elems/plugin/pluginElement.cpp
++ ./src/gui/elems/plugin/pluginElement.h
++ ./src/gui/elems/plugin/pluginParameter.cpp
++ ./src/gui/elems/plugin/pluginParameter.h
++ ./src/gui/elems/sampleEditor/boostTool.cpp
++ ./src/gui/elems/sampleEditor/boostTool.h
++ ./src/gui/elems/sampleEditor/panTool.cpp
++ ./src/gui/elems/sampleEditor/panTool.h
++ ./src/gui/elems/sampleEditor/pitchTool.cpp
++ ./src/gui/elems/sampleEditor/pitchTool.h
++ ./src/gui/elems/sampleEditor/rangeTool.cpp
++ ./src/gui/elems/sampleEditor/rangeTool.h
++ ./src/gui/elems/sampleEditor/shiftTool.cpp
++ ./src/gui/elems/sampleEditor/shiftTool.h
++ ./src/gui/elems/sampleEditor/volumeTool.cpp
++ ./src/gui/elems/sampleEditor/volumeTool.h
++ ./src/gui/elems/sampleEditor/waveTools.cpp
++ ./src/gui/elems/sampleEditor/waveTools.h
++ ./src/gui/elems/sampleEditor/waveform.cpp
++ ./src/gui/elems/sampleEditor/waveform.h
++ ./src/gui/elems/soundMeter.cpp
++ ./src/gui/elems/soundMeter.h
++ ./src/gui/types.h
++ ./src/gui/ui.cpp
++ ./src/gui/ui.h
++ ./src/gui/updater.cpp
++ ./src/gui/updater.h
++ ./src/main.cpp
++ ./src/utils/cocoa.h
++ ./src/utils/cocoa.mm
++ ./src/utils/fs.cpp
++ ./src/utils/fs.h
++ ./src/utils/gui.cpp
++ ./src/utils/gui.h
++ ./src/utils/log.cpp
++ ./src/utils/log.h
++ ./src/utils/math.cpp
++ ./src/utils/math.h
++ ./src/utils/string.cpp
++ ./src/utils/string.h
++ ./src/utils/time.cpp
++ ./src/utils/time.h
++ ./src/utils/vector.h
++ ./src/utils/ver.cpp
++ ./src/utils/ver.h
++Copyright: 2010-2018, Giovanni A. Zuliani | Monocasual
++ 2010-2019, Giovanni A. Zuliani | Monocasual
++ 2010-2020, Giovanni A. Zuliani | Monocasual
++ 2010-2021, Giovanni A. Zuliani | Monocasual
++License: GPL-3+
++ FIXME
++
++Files: ./.clang-format
++ ./CMakeLists.txt
++ ./ChangeLog
++ ./extras/com.giadamusic.Giada.desktop
++ ./extras/giada-logo.svg
++ ./extras/giada.icns
++ ./scripts/create_source_tarball.sh
++ ./src/deps/juce-config.h
++ ./src/ext/giada.ico
++ ./src/ext/resource.h
++ ./src/ext/resource.rc
++ ./tests/actionRecorder.cpp
++ ./tests/main.cpp
++ ./tests/midiLighter.cpp
++ ./tests/mocks/kernelMidiMock.h
++ ./tests/resources/test.wav
++ ./tests/samplePlayer.cpp
++ ./tests/utils.cpp
++ ./tests/wave.cpp
++ ./tests/waveFx.cpp
++ ./tests/waveManager.cpp
++ ./tests/waveReader.cpp
++Copyright: NONE
++License: UNKNOWN
++ FIXME
++
++Files: ./README.md
++Copyright: NONE
++License: GPL
++ FIXME
++
++Files: ./src/gui/elems/mainWindow/keyboard/midiChannel.cpp
++Copyright: G_GUI_UNIT10-G_GUI_UNIT17 Giovanni A. Zuliani | Monocasual
++License: GPL-3+
++ FIXME
++
++Files: ./COPYING
++Copyright: 2007, Free Software Foundation, Inc. <http://fsf.org/>
++License: UNKNOWN
++ FIXME
++
++Files: ./extras/com.giadamusic.Giada.metainfo.xml
++Copyright: 2010-2021, Giovanni A. Zuliani | Monocasual Laboratories -->
++License: UNKNOWN
++ FIXME
++
--- /dev/null
--- /dev/null
++[DEFAULT]
++pristine-tar = True
++sign-tags = True
++
++debian-branch = master
--- /dev/null
--- /dev/null
++#!/bin/sh
++
++## script to initialize a cloned repository
++## with per (local) repository settings.
++
++# - ignore quilt's .pc/ directory
++# - enable the "--follow-tags" mode for pushing
++
++echo "tuning git-repository for ${NAME}"
++git config push.followTags true && echo "enabled push.followTags"
++
++GITEXCLUDE=".git/info/exclude"
++egrep "^/?\.pc/?$" "${GITEXCLUDE}" >/dev/null 2>&1 \
++ || (echo "/.pc/" >> "${GITEXCLUDE}" && echo "ignoring /.pc/")
--- /dev/null
--- /dev/null
++.\" Hey, EMACS: -*- nroff -*-
++.\" First parameter, NAME, should be all caps
++.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
++.\" other parameters are allowed: see man(7), man(1)
++.TH GIADA 1 "May 23, 2015"
++.\" Please adjust this date whenever revising the manpage.
++.\"
++.\" Some roff macros, for reference:
++.\" .nh disable hyphenation
++.\" .hy enable hyphenation
++.\" .ad l left justify
++.\" .ad b justify to both left and right margins
++.\" .nf disable filling
++.\" .fi enable filling
++.\" .br insert line break
++.\" .sp <n> insert n+1 empty lines
++.\" for manpage-specific macros, see man(7)
++.\" .IX Title "GIADA 1"
++.SH "NAME"
++giada \- Hardcore Loop Machine.
++.SH "SYNOPSIS"
++.\" .IX Header "SYNOPSIS"
++giada
++.SH "DESCRIPTION"
++.\" .IX Header "DESCRIPTION"
++Free, minimal, hardcore audio tool for DJs, live performers and electronic musicians.
++Pick up your channel, fill it with samples or MIDI events and start the show by using
++this tiny piece of software as a loop machine, drum machine, sequencer,
++live sampler or yet as a plugin/effect host.
++.LP
++Giada aims to be a compact and portable virtual device for production use and live sets.
++.SH AUTHOR
++This manual page was written by Jaromír Mikeš <mira.mikes@seznam.cz>,
++for the Debian project (but may be used by others).
--- /dev/null
--- /dev/null
++.\" Hey, EMACS: -*- nroff -*-
++.\" First parameter, NAME, should be all caps
++.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
++.\" other parameters are allowed: see man(7), man(1)
++.TH GIADA 1 "May 23, 2015"
++.\" Please adjust this date whenever revising the manpage.
++.\"
++.\" Some roff macros, for reference:
++.\" .nh disable hyphenation
++.\" .hy enable hyphenation
++.\" .ad l left justify
++.\" .ad b justify to both left and right margins
++.\" .nf disable filling
++.\" .fi enable filling
++.\" .br insert line break
++.\" .sp <n> insert n+1 empty lines
++.\" for manpage-specific macros, see man(7)
++.\".IX Title "GIADA 1"
++.SH "NOM"
++giada \- Machine de boucle pure et dure
++.SH "SYNOPSIS"
++.\".IX Header "SYNOPSIS"
++giada
++.SH "DESCRIPTION"
++.\".IX Header "DESCRIPTION"
++Outil audio pur et dur, minimal, libre, pour les DJs, les performeurs live et
++les musiciens électroniques.
++Choisissez votre canal, remplissez-le avec des échantillons ou des événements
++MIDI, et démarrez le spectacle en utilisant ce petit morceau de logiciel en tant
++que boucleur, boîte à rythme, séquenceur, échantillonneur live, ou encore comme
++un hôte de greffon/effet.
++.LP
++Giada se veut être un périphérique virtuel compact et portable pour une
++utilisation en production et un ensemble live.
++.SH AUTEUR
++.PP
++Cette page de manuel (en anglais) a été écrite par Jaromír Mikeš
++<mira.mikes@seznam.cz>, pour le projet Debian (mais peut être utilisée par
++d'autres).
++.PP
++Elle a été traduite en français par Olivier Humbert <trebmuh@tuxfamily.org> pour
++le projet LibraZiK (et peut également être utilisée par d'autres).
--- /dev/null
--- /dev/null
++debian/giada.1
++debian/giada.fr.1
--- /dev/null
--- /dev/null
++missing sources for giada
++=========================
++
++this directory contains sources that are missing from upstream's tarball.
++
++
++mcl-atomic-swapper
++==================
++
++is a tiny (1 source file) module released under the GPLv3+,
++maintained by giada upstream in a separate repository.
++
++mcl-audio-buffer
++================
++
++is a tiny (2 source files) module released under the GPLv3+,
++maintained by giada upstream in a separate repository.
++
--- /dev/null
--- /dev/null
++/* -----------------------------------------------------------------------------
++ *
++ * Atomic Swapper
++ *
++ * -----------------------------------------------------------------------------
++ *
++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
++ *
++ * This file is part of Atomic Swapper.
++ *
++ * Atomic Swapper 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 3 of the License, or (at your option) any later version.
++ *
++ * Atomic Swapper 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.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with Atomic Swapper. If not, see
++ * <http://www.gnu.org/licenses/>.
++ *
++ * -------------------------------------------------------------------------- */
++
++#ifndef MONOCASUAL_ATOMIC_SWAPPER_H
++#define MONOCASUAL_ATOMIC_SWAPPER_H
++
++#include <array>
++#include <atomic>
++
++namespace mcl
++{
++template <typename T>
++class AtomicSwapper
++{
++public:
++ class RtLock
++ {
++ friend AtomicSwapper;
++
++ public:
++ RtLock(AtomicSwapper& s)
++ : m_swapper(s)
++ {
++ m_swapper.rt_lock();
++ }
++
++ ~RtLock()
++ {
++ m_swapper.rt_unlock();
++ }
++
++ const T& get() const
++ {
++ return m_swapper.rt_get();
++ }
++
++ private:
++ AtomicSwapper& m_swapper;
++ };
++
++ AtomicSwapper()
++ {
++ static_assert(std::is_assignable_v<T, T>);
++ }
++
++ /* isLocked
++ Returns true if the busy bit is currently set, that is if the realtime
++ thread is reading its copy of data. */
++
++ bool isLocked() const
++ {
++ return m_bits.load() & BIT_BUSY;
++ }
++
++ /* get (1)
++ Returns local data for non-realtime thread. */
++
++ const T& get() const
++ {
++ return m_data[(m_bits.load() & BIT_INDEX) ^ 1];
++ }
++
++ /* get (2)
++ As above, non-const version. */
++
++ T& get()
++ {
++ return const_cast<T&>(static_cast<const AtomicSwapper&>(*this).get());
++ }
++
++ /* swap
++ Core function: swaps the realtime data with the non-realtime one. Waits for
++ the realtime thread until it has finished reading its own copy of data. Only
++ then the indexes are swapped atomically. */
++
++ void swap()
++ {
++ int bits = m_bits.load();
++
++ /* Wait for the realtime thread to finish, i.e. until the BUSY bit
++ becomes zero. Only then, swap indexes. This will let the realtime thread
++ to pick the updated data on its next cycle. */
++ int desired;
++ do
++ {
++ bits = bits & ~BIT_BUSY; // Expected: current value without busy bit set
++ desired = (bits ^ BIT_INDEX) & BIT_INDEX; // Desired: flipped (xor) index
++ } while (!m_bits.compare_exchange_weak(bits, desired));
++
++ bits = desired;
++
++ /* After the swap above, m_data[(bits & BIT_INDEX) ^ 1] has become the
++ non-realtime slot and it points to the data previously read by the
++ realtime thread. That data is old, so update it: overwrite it with the
++ realtime data in the realtime slot (m_data[bits & BIT_INDEX]) that is
++ currently being read by the realtime thread. */
++ m_data[(bits & BIT_INDEX) ^ 1] = m_data[bits & BIT_INDEX];
++ }
++
++private:
++ static constexpr int BIT_INDEX = (1 << 0); // 0001
++ static constexpr int BIT_BUSY = (1 << 1); // 0010
++
++ /* [realtime] lock
++ Marks the data as busy. Used when the realtime thread starts reading its own
++ copy of data. Can't call this directly (it's private), use the scoped lock
++ RtLock class above. */
++
++ void rt_lock()
++ {
++ /* Set the busy bit and also get the current index. */
++ m_index = m_bits.fetch_or(BIT_BUSY) & BIT_INDEX;
++ }
++
++ /* [realtime] unlock
++ Marks the data as free. Used when the realtime thread is done with reading
++ its own copy of data. Can't call this directly (it's private), use the
++ scoped lock RtLock class above. */
++
++ void rt_unlock()
++ {
++ m_bits.store(m_index & BIT_INDEX);
++ }
++
++ /* [realtime] get
++ Get data currently being ready by the realtime thread. Can't call this
++ directly (it's private), use the scoped lock RtLock class above.*/
++
++ const T& rt_get() const
++ {
++ return m_data[m_bits.load() & BIT_INDEX];
++ }
++
++ std::array<T, 2> m_data;
++ std::atomic<int> m_bits{0};
++ int m_index{0};
++};
++} // namespace mcl
++
++#endif
--- /dev/null
--- /dev/null
++/* -----------------------------------------------------------------------------
++ *
++ * AudioBuffer
++ *
++ * -----------------------------------------------------------------------------
++ *
++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual
++ *
++ * This file is part of AudioBuffer.
++ *
++ * AudioBuffer 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 3 of the License, or (at your option) any later
++ * version.
++ *
++ * AudioBuffer 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.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * AudioBuffer. If not, see
++ * <http://www.gnu.org/licenses/>.
++ *
++ * -------------------------------------------------------------------------- */
++
++#include "audioBuffer.hpp"
++#include <algorithm>
++#include <cassert>
++
++namespace mcl
++{
++AudioBuffer::AudioBuffer()
++: m_data(nullptr)
++, m_size(0)
++, m_channels(0)
++, m_viewing(false)
++{
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer::AudioBuffer(int size, int channels)
++: AudioBuffer()
++{
++ alloc(size, channels);
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer::AudioBuffer(float* data, int size, int channels)
++: m_data(data)
++, m_size(size)
++, m_channels(channels)
++, m_viewing(true)
++{
++ assert(channels <= NUM_CHANS);
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer::AudioBuffer(const AudioBuffer& o)
++{
++ copy(o);
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer::AudioBuffer(AudioBuffer&& o)
++{
++ move(std::move(o));
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer::~AudioBuffer()
++{
++ if (!m_viewing)
++ free();
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer& AudioBuffer::operator=(const AudioBuffer& o)
++{
++ if (this == &o)
++ return *this;
++ copy(o);
++ return *this;
++}
++
++/* -------------------------------------------------------------------------- */
++
++AudioBuffer& AudioBuffer::operator=(AudioBuffer&& o)
++{
++ if (this == &o)
++ return *this;
++ move(std::move(o));
++ return *this;
++}
++
++/* -------------------------------------------------------------------------- */
++
++float* AudioBuffer::operator[](int offset) const
++{
++ assert(m_data != nullptr);
++ assert(offset < m_size);
++ return m_data + (offset * m_channels);
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::clear(int a, int b)
++{
++ if (m_data == nullptr)
++ return;
++ if (b == -1)
++ b = m_size;
++ std::fill_n(m_data + (a * m_channels), (b - a) * m_channels, 0.0);
++}
++
++/* -------------------------------------------------------------------------- */
++
++int AudioBuffer::countFrames() const { return m_size; }
++int AudioBuffer::countSamples() const { return m_size * m_channels; }
++int AudioBuffer::countChannels() const { return m_channels; }
++bool AudioBuffer::isAllocd() const { return m_data != nullptr; }
++
++/* -------------------------------------------------------------------------- */
++
++float AudioBuffer::getPeak(int channel) const
++{
++ assert(channel < m_channels);
++
++ float peak = 0.0f;
++ for (int i = 0; i < countFrames(); i++)
++ peak = std::max(peak, (*this)[i][channel]);
++ return peak;
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::alloc(int size, int channels)
++{
++ assert(channels <= NUM_CHANS);
++
++ free();
++ m_size = size;
++ m_channels = channels;
++ m_data = new float[m_size * m_channels];
++ clear();
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::free()
++{
++ if (m_data == nullptr)
++ return;
++ delete[] m_data;
++ m_data = nullptr;
++ m_size = 0;
++ m_channels = 0;
++ m_viewing = false;
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::sum(const AudioBuffer& b, int framesToCopy, int srcOffset,
++ int destOffset, float gain, Pan pan)
++{
++ copyData<Operation::SUM>(b, framesToCopy, srcOffset, destOffset, gain, pan);
++}
++
++void AudioBuffer::set(const AudioBuffer& b, int framesToCopy, int srcOffset,
++ int destOffset, float gain, Pan pan)
++{
++ copyData<Operation::SET>(b, framesToCopy, srcOffset, destOffset, gain, pan);
++}
++
++void AudioBuffer::sum(const AudioBuffer& b, float gain, Pan pan)
++{
++ copyData<Operation::SUM>(b, -1, 0, 0, gain, pan);
++}
++
++void AudioBuffer::set(const AudioBuffer& b, float gain, Pan pan)
++{
++ copyData<Operation::SET>(b, -1, 0, 0, gain, pan);
++}
++
++/* -------------------------------------------------------------------------- */
++
++template <AudioBuffer::Operation O>
++void AudioBuffer::copyData(const AudioBuffer& b, int framesToCopy,
++ int srcOffset, int destOffset, float gain, Pan pan)
++{
++ const int srcChannels = b.countChannels();
++ const int destChannels = countChannels();
++ const bool sameChannels = srcChannels == destChannels;
++
++ assert(m_data != nullptr);
++ assert(destOffset >= 0 && destOffset < m_size);
++ assert(srcChannels <= destChannels);
++
++ /* Make sure the amount of frames to copy lies within the current buffer
++ size. */
++
++ framesToCopy = framesToCopy == -1 ? b.countFrames() : framesToCopy;
++ framesToCopy = std::min(framesToCopy, m_size - destOffset);
++
++ /* Case 1) source has less channels than this one: brutally spread source's
++ channel 0 over this one (TODO - maybe mixdown source channels first?)
++ Case 2) source has same amount of channels: copy them 1:1. */
++
++ for (int destF = 0, srcF = srcOffset; destF < framesToCopy && destF < b.countFrames(); destF++, srcF++)
++ {
++ for (int ch = 0; ch < destChannels; ch++)
++ {
++ if constexpr (O == Operation::SUM)
++ sum(destF + destOffset, ch, b[srcF][sameChannels ? ch : 0] * gain * pan[ch]);
++ else
++ set(destF + destOffset, ch, b[srcF][sameChannels ? ch : 0] * gain * pan[ch]);
++ }
++ }
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::applyGain(float g)
++{
++ for (int i = 0; i < countSamples(); i++)
++ m_data[i] *= g;
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::sum(int f, int channel, float val) { (*this)[f][channel] += val; }
++void AudioBuffer::set(int f, int channel, float val) { (*this)[f][channel] = val; }
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::move(AudioBuffer&& o)
++{
++ assert(o.countChannels() <= NUM_CHANS);
++
++ m_data = o.m_data;
++ m_size = o.m_size;
++ m_channels = o.m_channels;
++ m_viewing = o.m_viewing;
++
++ o.m_data = nullptr;
++ o.m_size = 0;
++ o.m_channels = 0;
++ o.m_viewing = false;
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::copy(const AudioBuffer& o)
++{
++ m_data = new float[o.m_size * o.m_channels];
++ m_size = o.m_size;
++ m_channels = o.m_channels;
++ m_viewing = o.m_viewing;
++
++ std::copy(o.m_data, o.m_data + (o.m_size * o.m_channels), m_data);
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::forEachFrame(std::function<void(float*, int)> f)
++{
++ for (int i = 0; i < countFrames(); i++)
++ f((*this)[i], i);
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::forEachChannel(int frame, std::function<void(float&, int)> f)
++{
++ assert(frame < m_size);
++
++ for (int i = 0; i < countChannels(); i++)
++ f((*this)[frame][i], i);
++}
++
++/* -------------------------------------------------------------------------- */
++
++void AudioBuffer::forEachSample(std::function<void(float&, int)> f)
++{
++ for (int i = 0; i < countSamples(); i++)
++ f(m_data[i], i);
++}
++
++/* -------------------------------------------------------------------------- */
++
++template void AudioBuffer::copyData<AudioBuffer::Operation::SUM>(const AudioBuffer&, int, int, int, float, Pan);
++template void AudioBuffer::copyData<AudioBuffer::Operation::SET>(const AudioBuffer&, int, int, int, float, Pan);
++} // namespace mcl
--- /dev/null
--- /dev/null
++/* -----------------------------------------------------------------------------
++ *
++ * AudioBuffer
++ *
++ * -----------------------------------------------------------------------------
++ *
++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual
++ *
++ * This file is part of AudioBuffer.
++ *
++ * AudioBuffer 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 3 of the License, or (at your option) any later
++ * version.
++ *
++ * AudioBuffer 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.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * AudioBuffer. If not, see
++ * <http://www.gnu.org/licenses/>.
++ *
++ * -------------------------------------------------------------------------- */
++
++#ifndef MONOCASUAL_AUDIO_BUFFER_H
++#define MONOCASUAL_AUDIO_BUFFER_H
++
++#include <array>
++#include <functional>
++
++namespace mcl
++{
++/* AudioBuffer
++A class that holds a buffer filled with audio data. NOTE: currently it only
++supports 2 channels (stereo). Give it a mono stream and it will convert it to
++stereo. Give it a multichannel stream and it will throw an assertion. */
++
++class AudioBuffer
++{
++public:
++ static constexpr int NUM_CHANS = 2;
++
++ using Pan = std::array<float, NUM_CHANS>;
++
++ /* AudioBuffer (1)
++ Creates an empty (and invalid) audio buffer. */
++
++ AudioBuffer();
++
++ /* AudioBuffer (2)
++ Creates an audio buffer and allocates memory for size * channels frames. */
++
++ AudioBuffer(int size, int channels);
++
++ /* AudioBuffer (3)
++ Creates an audio buffer out of a raw pointer. AudioBuffer created this way
++ is instructed not to free the owned data on destruction. */
++
++ AudioBuffer(float* data, int size, int channels);
++
++ /* AudioBuffer(const AudioBuffer&)
++ Copy constructor. */
++
++ AudioBuffer(const AudioBuffer& o);
++
++ /* AudioBuffer(AudioBuffer&&)
++ Move constructor. */
++
++ AudioBuffer(AudioBuffer&& o);
++
++ /* ~AudioBuffer
++ Destructor. */
++
++ ~AudioBuffer();
++
++ /* operator = (const AudioBuffer& o)
++ Copy assignment operator. */
++
++ AudioBuffer& operator=(const AudioBuffer& o);
++
++ /* operator = (AudioBuffer&& o)
++ Move assignment operator. */
++
++ AudioBuffer& operator=(AudioBuffer&& o);
++
++ /* operator []
++ Given a frame 'offset', returns a pointer to it. This is useful for digging
++ inside a frame, i.e. parsing each channel. How to use it:
++
++ for (int k=0; k<buffer->countFrames(), k++)
++ for (int i=0; i<buffer->countChannels(); i++)
++ ... buffer[k][i] ...
++
++ Also note that buffer[0] will give you a pointer to the whole internal data
++ array. */
++
++ float* operator[](int offset) const;
++
++ int countFrames() const;
++ int countSamples() const;
++ int countChannels() const;
++ bool isAllocd() const;
++
++ /* getPeak
++ Returns the highest value from the specified channel. */
++
++ float getPeak(int channel) const;
++
++ void alloc(int size, int channels);
++ void free();
++
++ /* sum, set (1)
++ Merges (sum) or copies (set) 'framesToCopy' frames of buffer 'b' onto this
++ one. If 'framesToCopy' is -1 the whole buffer will be copied. If 'b' has
++ less channels than this one, they will be spread over the current ones.
++ Buffer 'b' MUST NOT contain more channels than this one. */
++
++ void sum(const AudioBuffer& b, int framesToCopy = -1, int srcOffset = 0,
++ int destOffset = 0, float gain = 1.0f, Pan pan = {1.0f, 1.0f});
++ void set(const AudioBuffer& b, int framesToCopy = -1, int srcOffset = 0,
++ int destOffset = 0, float gain = 1.0f, Pan pan = {1.0f, 1.0f});
++
++ /* sum, set (2)
++ Same as sum, set (1) without boundaries or offsets: it just copies as much
++ as possibile. */
++
++ void sum(const AudioBuffer& b, float gain = 1.0f, Pan pan = {1.0f, 1.0f});
++ void set(const AudioBuffer& b, float gain = 1.0f, Pan pan = {1.0f, 1.0f});
++
++ /* clear
++ Clears the internal data by setting all bytes to 0.0f. Optional parameters
++ 'a' and 'b' set the range. */
++
++ void clear(int a = 0, int b = -1);
++
++ void applyGain(float g);
++
++ /* forEachFrame
++ Applies a function to each frame in the audio buffer. */
++
++ void forEachFrame(std::function<void(float* /*channels*/, int /*numFrame*/)>);
++
++ /* forEachChannel
++ Applies a function to each channel in the given frame. */
++
++ void forEachChannel(int frame, std::function<void(float& /*value*/, int /*numChannel*/)>);
++
++ /* forEachSample
++ Applies a function to each sample in the audio buffer. */
++
++ void forEachSample(std::function<void(float& /*value*/, int /*numSample*/)>);
++
++private:
++ enum class Operation
++ {
++ SUM,
++ SET
++ };
++
++ template <Operation O = Operation::SET>
++ void copyData(const AudioBuffer& b, int framesToCopy = -1,
++ int srcOffset = 0, int destOffset = 0, float gain = 1.0f,
++ Pan pan = {1.0f, 1.0f});
++
++ void move(AudioBuffer&& o);
++ void copy(const AudioBuffer& o);
++ void sum(int f, int channel, float val);
++ void set(int f, int channel, float val);
++
++ float* m_data;
++ int m_size;
++ int m_channels;
++ bool m_viewing;
++};
++} // namespace mcl
++
++#endif
--- /dev/null
--- /dev/null
++From: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
++Date: Fri, 17 Dec 2021 10:37:21 +0100
++Subject: Patch-in dependency library 'geompp'
++
++Origin: upstream
++Forwarded: not-needed
++Last-Update: 2021-08-30
++
++'geompp' is a GPL-3 licensed header-only helper-library by giada-upstream
++that is only referenced via a gitmodule; we include it via quilt
++Last-Update: 2021-08-30
++---
++ src/deps/geompp/src/line.hpp | 81 +++++++++++++++
++ src/deps/geompp/src/point.hpp | 80 ++++++++++++++
++ src/deps/geompp/src/range.hpp | 61 +++++++++++
++ src/deps/geompp/src/rect.hpp | 236 ++++++++++++++++++++++++++++++++++++++++++
++ 4 files changed, 458 insertions(+)
++ create mode 100644 src/deps/geompp/src/line.hpp
++ create mode 100644 src/deps/geompp/src/point.hpp
++ create mode 100644 src/deps/geompp/src/range.hpp
++ create mode 100644 src/deps/geompp/src/rect.hpp
++
++--- /dev/null
+++++ giada/src/deps/geompp/src/line.hpp
++@@ -0,0 +1,81 @@
+++/* -----------------------------------------------------------------------------
+++ *
+++ * geompp - Basic geometrical utilities for C++.
+++ *
+++ * -----------------------------------------------------------------------------
+++ *
+++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
+++ *
+++ * This file is part of geompp - Basic geometrical utilities for C++.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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 3 of the License, or (at your option) any later version.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with geompp - Basic geometrical utilities for C++. If not, see
+++ * <http://www.gnu.org/licenses/>.
+++ *
+++ * -------------------------------------------------------------------------- */
+++
+++#ifndef GEOMPP_LINE_HH
+++#define GEOMPP_LINE_HH
+++
+++namespace geompp
+++{
+++template <typename T>
+++class Line
+++{
+++public:
+++ /* Line (1) - invalid. */
+++
+++ constexpr Line()
+++ : Line(0, 0, 0, 0)
+++ {
+++ }
+++
+++ /* Line (2) - normal. */
+++
+++ constexpr Line(T x1, T y1, T x2, T y2)
+++ : x1(x1)
+++ , y1(y1)
+++ , x2(x2)
+++ , y2(y2)
+++ {
+++ }
+++
+++ /* shiftX
+++ Horizontally shifts the line of a certain amount. */
+++
+++ void shiftX(T amount)
+++ {
+++ x1 += amount;
+++ x2 += amount;
+++ }
+++
+++ /* with[...]
+++ Returns a copy of this Line with new coordintates. */
+++
+++ Line withX1(T v) const { return {v, y1, x2, y2}; }
+++ Line withY1(T v) const { return {x1, v, x2, y2}; }
+++ Line withX2(T v) const { return {x1, y1, v, y2}; }
+++ Line withY2(T v) const { return {x1, y1, x2, v}; }
+++ Line withX(T v) const { return {v, y1, v, y2}; }
+++ Line withY(T v) const { return {x1, v, x2, v}; }
+++
+++ /* withShiftedX
+++ Returns a new Line horizontally shifted by a certain amount. */
+++
+++ Line withShiftedX(T amount) const { return {x1 + amount, y1, x2 + amount, y2}; }
+++
+++ T x1, y1, x2, y2;
+++};
+++} // namespace geompp
+++
+++#endif
++\ No newline at end of file
++--- /dev/null
+++++ giada/src/deps/geompp/src/point.hpp
++@@ -0,0 +1,80 @@
+++/* -----------------------------------------------------------------------------
+++ *
+++ * geompp - Basic geometrical utilities for C++.
+++ *
+++ * -----------------------------------------------------------------------------
+++ *
+++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
+++ *
+++ * This file is part of geompp - Basic geometrical utilities for C++.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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 3 of the License, or (at your option) any later version.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with geompp - Basic geometrical utilities for C++. If not, see
+++ * <http://www.gnu.org/licenses/>.
+++ *
+++ * -------------------------------------------------------------------------- */
+++
+++#ifndef GEOMPP_POINT_HH
+++#define GEOMPP_POINT_HH
+++
+++#include <cassert>
+++
+++namespace geompp
+++{
+++template <typename T>
+++class Point
+++{
+++public:
+++ constexpr Point()
+++ : Point(0, 0)
+++ {
+++ }
+++
+++ constexpr Point(T x, T y)
+++ : x(x)
+++ , y(y)
+++ {
+++ }
+++
+++ bool operator==(const Point<T>& o) const
+++ {
+++ return x == o.x && y == o.y;
+++ }
+++
+++ bool operator!=(const Point<T>& o) const
+++ {
+++ return !(*this == o);
+++ }
+++
+++ Point<T> operator+(const Point<T>& o) const
+++ {
+++ return {x + o.x, y + o.y};
+++ }
+++
+++ Point<T> operator-(const Point<T>& o) const
+++ {
+++ return {x - o.x, y - o.y};
+++ }
+++
+++ /* with[...]
+++ Returns a copy of this Point with a new coordinate. */
+++
+++ Point<T> withX(T v) const { return {v, y}; }
+++ Point<T> withY(T v) const { return {x, v}; }
+++
+++ T x;
+++ T y;
+++};
+++} // namespace geompp
+++
+++#endif
++--- /dev/null
+++++ giada/src/deps/geompp/src/range.hpp
++@@ -0,0 +1,76 @@
+++/* -----------------------------------------------------------------------------
+++ *
+++ * geompp - Basic geometrical utilities for C++.
+++ *
+++ * -----------------------------------------------------------------------------
+++ *
+++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
+++ *
+++ * This file is part of geompp - Basic geometrical utilities for C++.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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 3 of the License, or (at your option) any later version.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with geompp - Basic geometrical utilities for C++. If not, see
+++ * <http://www.gnu.org/licenses/>.
+++ *
+++ * -------------------------------------------------------------------------- */
+++
+++#ifndef GEOMPP_RANGE_HH
+++#define GEOMPP_RANGE_HH
+++
+++#include <cassert>
+++
+++namespace geompp
+++{
+++template <typename T>
+++class Range
+++{
+++public:
+++ constexpr Range() // Invalid default range
+++ : a(0)
+++ , b(0)
+++ {
+++ }
+++
+++ constexpr Range(T a, T b)
+++ : a(a)
+++ , b(b)
+++ {
+++ assert(a < b);
+++ }
+++
+++ Range<T> operator*(const T m) const { return {a * m, b * m}; }
+++ Range<T> operator*=(const T m) const { return {a * m, b * m}; }
+++ Range<T> operator/(const T m) const { return {a / m, b / m}; }
+++ Range<T> operator/=(const T m) const { return {a / m, b / m}; }
+++ Range<T> operator+(const T m) const { return {a + m, b + m}; }
+++ Range<T> operator+=(const T m) const { return {a + m, b + m}; }
+++ Range<T> operator-(const T m) const { return {a - m, b - m}; }
+++ Range<T> operator-=(const T m) const { return {a - m, b - m}; }
+++
+++ T getLength() const { return b - a; }
+++
+++ bool isValid() const
+++ {
+++ return a < b;
+++ }
+++
+++ bool contains(T t) const
+++ {
+++ return t >= a && t < b;
+++ }
+++
+++ T a, b;
+++};
+++} // namespace geompp
+++
+++#endif
++--- /dev/null
+++++ giada/src/deps/geompp/src/rect.hpp
++@@ -0,0 +1,234 @@
+++/* -----------------------------------------------------------------------------
+++ *
+++ * geompp - Basic geometrical utilities for C++.
+++ *
+++ * -----------------------------------------------------------------------------
+++ *
+++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
+++ *
+++ * This file is part of geompp - Basic geometrical utilities for C++.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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 3 of the License, or (at your option) any later version.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with geompp - Basic geometrical utilities for C++. If not, see
+++ * <http://www.gnu.org/licenses/>.
+++ *
+++ * -------------------------------------------------------------------------- */
+++
+++#ifndef GEOMPP_RECT_HH
+++#define GEOMPP_RECT_HH
+++
+++#include "border.hpp"
+++#include "line.hpp"
+++#include "point.hpp"
+++#include "range.hpp"
+++
+++namespace geompp
+++{
+++template <typename T>
+++class Rect
+++{
+++public:
+++ /* Rect (1)
+++ Invalid rectangle. */
+++
+++ constexpr Rect()
+++ : Rect(0, 0, 0, 0)
+++ {
+++ }
+++
+++ /* Rect (2)
+++ Normal rectangle. */
+++
+++ constexpr Rect(T x, T y, T w, T h)
+++ : x(x)
+++ , y(y)
+++ , w(w)
+++ , h(h)
+++ , xw(x + w)
+++ , yh(y + h)
+++ {
+++ }
+++
+++ void setX(T v)
+++ {
+++ x = v;
+++ xw = x + w;
+++ }
+++
+++ void setY(T v)
+++ {
+++ y = v;
+++ yh = y + h;
+++ }
+++
+++ void setW(T v)
+++ {
+++ w = v;
+++ xw = x + w;
+++ }
+++
+++ void setH(T v)
+++ {
+++ h = v;
+++ yh = y + h;
+++ }
+++
+++ /* setPosition
+++ Sets the top-left corner to Point 'p'. */
+++
+++ void setPosition(Point<T> p)
+++ {
+++ setX(p.x);
+++ setY(p.y);
+++ }
+++
+++ /* shift[...]
+++ Shifts the rectangle by a certain amount. */
+++
+++ void shiftX(T amount)
+++ {
+++ x += amount;
+++ xw = x + w;
+++ }
+++
+++ void shiftY(T amount)
+++ {
+++ y += amount;
+++ yh = y + h;
+++ }
+++
+++ /* trim[..]
+++ Removes 'amount' from the one of the edges. */
+++
+++ void trimLeft(T amount)
+++ {
+++ x += amount;
+++ w -= amount;
+++ }
+++
+++ void trimRight(T amount)
+++ {
+++ w -= amount;
+++ xw = x + w;
+++ }
+++
+++ void trimTop(T amount)
+++ {
+++ y += amount;
+++ h -= amount;
+++ }
+++
+++ void trimBottom(T amount)
+++ {
+++ h -= amount;
+++ yh = y + h;
+++ }
+++
+++ /* reduce
+++ Reduces all four sides by a certain Border. */
+++
+++ void reduce(Border<T> b)
+++ {
+++ x += b.left;
+++ y += b.top;
+++ w -= b.left + b.right;
+++ h -= b.top + b.bottom;
+++ xw = x + w;
+++ yh = y + h;
+++ }
+++
+++ /* isValid
+++ True if this Rect has size greater than zero. */
+++
+++ bool isValid() const { return w > 0 && h > 0; }
+++
+++ /* expand (1), (2)
+++ The opposite of reduce (1), (2). */
+++
+++ void expand(T amountX, T amountY) { reduce(-amountX, -amountY); }
+++ void expand(T amount) { reduce(-amount); }
+++
+++ /* with[...]
+++ Returns a copy of this Rect with a new position/size. */
+++
+++ Rect<T> withX(T v) const { return {v, y, w, h}; }
+++ Rect<T> withY(T v) const { return {x, v, w, h}; }
+++ Rect<T> withW(T v) const { return {x, y, v, h}; }
+++ Rect<T> withH(T v) const { return {x, y, w, v}; }
+++
+++ /* withPosition
+++ Returns a copy of this Rect with a new top-left corner given by Point 'p'. */
+++
+++ Rect<T> withPosition(Point<T> p) const { return {p.x, p.y, w, h}; }
+++
+++ /* withShifted[...]
+++ Returns a copy of this Rect shifted by a certain amount. */
+++
+++ Rect<T> withShiftedX(T amount) const { return {x + amount, y, w, h}; }
+++ Rect<T> withShiftedY(T amount) const { return {x, y + amount, w, h}; }
+++
+++ /* withTrimmed[...]
+++ Returns a copy of this Rect with 'amount' removed from the one of the
+++ edges. */
+++
+++ Rect<T> withTrimmedLeft(T amount) const { return {x + amount, y, w - amount, h}; }
+++ Rect<T> withTrimmedRight(T amount) const { return {x, y, w - amount, h}; }
+++ Rect<T> withTrimmedTop(T amount) const { return {x, y + amount, w, h - amount}; }
+++ Rect<T> withTrimmedBottom(T amount) const { return {x, y, w, h - amount}; }
+++
+++ /* get[Width|Height]AsLine
+++ Returns width or height as a new Line object. */
+++
+++ Line<T> getWidthAsLine() const { return Line(x, y, xw - 1, y); }
+++ Line<T> getHeightAsLine() const { return Line(x, y, x, yh - 1); }
+++
+++ Point<T> getPosition() const { return Point(x, y); }
+++
+++ /* reduced
+++ Returns a copy of this Rect with all four sides reduced by a certain Border. */
+++
+++ Rect<T> reduced(Border<T> b) const
+++ {
+++ Rect r = *this;
+++ r.reduce(b);
+++ return r;
+++ }
+++
+++ /* expanded (1), (2)
+++ The opposite of reduced (1), (2). */
+++
+++ Rect<T> expanded(T amountX, T amountY) const { return reduced(-amountX, -amountY); }
+++ Rect<T> expanded(T amount) const { return reduced(-amount); }
+++
+++ /* contains (1)
+++ Returns true if Point p is inside this Rect. */
+++
+++ bool contains(Point<T> p) const
+++ {
+++ return p.x >= x && p.y >= y && p.x < xw && p.y < yh;
+++ }
+++
+++ /* contains (2)
+++ Returns true if Line l is inside this Rect. */
+++
+++ bool contains(Line<T> l) const
+++ {
+++ return l.x1 >= x && l.x1 < xw && l.x2 >= x && l.x2 < xw &&
+++ l.y1 >= y && l.y1 < yh && l.y2 >= y && l.y2 < yh;
+++ }
+++
+++ T x, y, w, h, xw, yh;
+++};
+++} // namespace geompp
+++
+++#endif
++\ No newline at end of file
++--- /dev/null
+++++ giada/src/deps/geompp/src/border.hpp
++@@ -0,0 +1,75 @@
+++/* -----------------------------------------------------------------------------
+++ *
+++ * geompp - Basic geometrical utilities for C++.
+++ *
+++ * -----------------------------------------------------------------------------
+++ *
+++ * Copyright (C) 2021 Giovanni A. Zuliani | Monocasual Laboratories
+++ *
+++ * This file is part of geompp - Basic geometrical utilities for C++.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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 3 of the License, or (at your option) any later version.
+++ *
+++ * geompp - Basic geometrical utilities for C++ 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.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with geompp - Basic geometrical utilities for C++. If not, see
+++ * <http://www.gnu.org/licenses/>.
+++ *
+++ * -------------------------------------------------------------------------- */
+++
+++#ifndef GEOMPP_BORDER_HH
+++#define GEOMPP_BORDER_HH
+++
+++namespace geompp
+++{
+++template <typename T>
+++class Border
+++{
+++public:
+++ /* Border (1)
+++ Empty border. */
+++
+++ constexpr Border()
+++ : Border(0, 0, 0, 0)
+++ {
+++ }
+++
+++ /* Border (2)
+++ Normal border. */
+++
+++ constexpr Border(T t, T r, T b, T l)
+++ : top(t)
+++ , right(r)
+++ , bottom(b)
+++ , left(l)
+++ {
+++ }
+++
+++ /* Border (3)
+++ Normal border, all sides equal. */
+++
+++ constexpr Border(T v)
+++ : Border(v, v, v, v)
+++ {
+++ }
+++
+++ /* Border (4)
+++ Normal border, horizontal and vertical sides equal. */
+++
+++ constexpr Border(T x, T y)
+++ : Border(y, x, y, x)
+++ {
+++ }
+++
+++ T top, right, bottom, left;
+++};
+++} // namespace geompp
+++
+++#endif
++\ No newline at end of file
--- /dev/null
--- /dev/null
++From: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
++Date: Fri, 17 Dec 2021 10:37:21 +0100
++Subject: Use system-provided RtAudio
++
++Origin: Debian
++Forwarded: not-needed
++Last-Update: 2022-05-04
++
++Index: giada/CMakeLists.txt
++===================================================================
++--- giada.orig/CMakeLists.txt
+++++ giada/CMakeLists.txt
++@@ -204,7 +204,6 @@ list(APPEND SOURCES
++ src/utils/fs.cpp
++ src/utils/ver.cpp
++ src/utils/string.cpp
++- src/deps/rtaudio/RtAudio.cpp
++ src/deps/mcl-audio-buffer/src/audioBuffer.cpp)
++
++ list(APPEND PREPROCESSOR_DEFS)
++@@ -294,6 +293,15 @@ elseif (PkgConfig_FOUND)
++ endif()
++ endif()
++
+++if (PkgConfig_FOUND)
+++ pkg_check_modules(RtAudio IMPORTED_TARGET rtaudio)
+++ if (RtAudio_FOUND)
+++ list(APPEND LIBRARIES PkgConfig::RtAudio)
+++ message("RtAudio library found")
+++ endif()
+++endif()
+++
+++
++ if (NOT RtMidi_FOUND)
++ # Fallback to find_library mode (in case rtmidi is too old).
++ find_library(LIBRARY_RTMIDI NAMES rtmidi)
++Index: giada/src/core/kernelAudio.h
++===================================================================
++--- giada.orig/src/core/kernelAudio.h
+++++ giada/src/core/kernelAudio.h
++@@ -28,7 +28,7 @@
++ #define G_KERNELAUDIO_H
++
++ #include "core/conf.h"
++-#include "deps/rtaudio/RtAudio.h"
+++#include "rtaudio/RtAudio.h"
++ #include <cstddef>
++ #include <functional>
++ #include <memory>
++Index: giada/src/glue/config.cpp
++===================================================================
++--- giada.orig/src/glue/config.cpp
+++++ giada/src/glue/config.cpp
++@@ -32,7 +32,7 @@
++ #include "core/kernelMidi.h"
++ #include "core/midiMapper.h"
++ #include "core/plugins/pluginManager.h"
++-#include "deps/rtaudio/RtAudio.h"
+++#include "rtaudio/RtAudio.h"
++ #include "gui/dialogs/browser/browserDir.h"
++ #include "gui/dialogs/config.h"
++ #include "gui/dialogs/warnings.h"
++Index: giada/src/gui/elems/config/tabAudio.cpp
++===================================================================
++--- giada.orig/src/gui/elems/config/tabAudio.cpp
+++++ giada/src/gui/elems/config/tabAudio.cpp
++@@ -27,7 +27,7 @@
++ #include "tabAudio.h"
++ #include "core/const.h"
++ #include "core/kernelAudio.h"
++-#include "deps/rtaudio/RtAudio.h"
+++#include "rtaudio/RtAudio.h"
++ #include "gui/elems/basics/box.h"
++ #include "gui/elems/basics/check.h"
++ #include "gui/elems/basics/choice.h"
++Index: giada/src/utils/ver.cpp
++===================================================================
++--- giada.orig/src/utils/ver.cpp
+++++ giada/src/utils/ver.cpp
++@@ -26,7 +26,7 @@
++
++ #include "ver.h"
++ #include "core/const.h"
++-#include "deps/rtaudio/RtAudio.h"
+++#include "rtaudio/RtAudio.h"
++ #include <RtMidi.h>
++ #include <sndfile.h>
++
++Index: giada/src/core/kernelAudio.cpp
++===================================================================
++--- giada.orig/src/core/kernelAudio.cpp
+++++ giada/src/core/kernelAudio.cpp
++@@ -263,7 +263,7 @@ const std::vector<m::KernelAudio::Device
++ #ifdef WITH_AUDIO_JACK
++ jack_client_t* KernelAudio::getJackHandle() const
++ {
++- return static_cast<jack_client_t*>(m_rtAudio->HACK__getJackClient());
+++ return nullptr;
++ }
++ #endif
++
--- /dev/null
--- /dev/null
++From: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
++Date: Fri, 17 Dec 2021 10:37:21 +0100
++Subject: Build against system-provided nlohmann/json
++
++Origin: Debian
++Forwarded: no
++Last-Update: 2020-04-02
++
++Last-Update: 2020-04-02
++---
++ src/core/conf.cpp | 2 +-
++ src/core/midiMapper.h | 2 +-
++ src/core/patch.cpp | 2 +-
++ 3 files changed, 3 insertions(+), 3 deletions(-)
++
++--- giada.orig/src/core/conf.cpp
+++++ giada/src/core/conf.cpp
++@@ -27,7 +27,7 @@
++ #include "core/conf.h"
++ #include "core/const.h"
++ #include "core/types.h"
++-#include "deps/json/single_include/nlohmann/json.hpp"
+++#include "nlohmann/json.hpp"
++ #include "utils/fs.h"
++ #include "utils/log.h"
++ #include <FL/Fl.H>
++--- giada.orig/src/core/midiMapper.h
+++++ giada/src/core/midiMapper.h
++@@ -27,7 +27,7 @@
++ #ifndef G_MIDIMAPPER_H
++ #define G_MIDIMAPPER_H
++
++-#include "deps/json/single_include/nlohmann/json.hpp"
+++#include "nlohmann/json.hpp"
++ #include <string>
++ #include <vector>
++
++--- giada.orig/src/core/patch.cpp
+++++ giada/src/core/patch.cpp
++@@ -26,7 +26,7 @@
++
++ #include "patch.h"
++ #include "core/mixer.h"
++-#include "deps/json/single_include/nlohmann/json.hpp"
+++#include "nlohmann/json.hpp"
++ #include "utils/log.h"
++ #include "utils/math.h"
++ #include <fstream>
--- /dev/null
--- /dev/null
++Description: link against system libpng/libjpeg
++Author: IOhannes m zmölnig <umlaeute@debian.org>
++Forwarded: not-needed
++Last-Update: 2021-12-20
++---
++This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
++Index: giada/CMakeLists.txt
++===================================================================
++--- giada.orig/CMakeLists.txt
+++++ giada/CMakeLists.txt
++@@ -394,6 +394,9 @@ else()
++ message("Libsamplerate library found in " ${LIBRARY_SAMPLERATE})
++ endif()
++
+++pkg_check_modules(JpegPng IMPORTED_TARGET libjpeg libpng)
+++list(APPEND LIBRARIES PkgConfig::JpegPng)
+++
++ # Catch (if tests enabled)
++
++ if (WITH_TESTS)
--- /dev/null
--- /dev/null
++From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <zmoelnig@iem.at>
++Date: Fri, 17 Dec 2021 10:35:28 +0100
++Subject: RtAudio-5.2.0 support
++
++Upstream vendored in a RtAudio-6 git snapshot and called it 5.2.0
++---
++ src/core/kernelAudio.cpp | 107 ++++++++++++++++++++++++++---------------------
++ 1 file changed, 60 insertions(+), 47 deletions(-)
++
++Index: giada/src/core/kernelAudio.cpp
++===================================================================
++--- giada.orig/src/core/kernelAudio.cpp
+++++ giada/src/core/kernelAudio.cpp
++@@ -95,10 +95,6 @@ int KernelAudio::openDevice(const Conf::
++ return 0;
++ }
++
++- m_rtAudio->setErrorCallback([](RtAudioErrorType type, const std::string& msg) {
++- u::log::print("[KA] RtAudio error %d: %s\n", type, msg.c_str());
++- });
++-
++ u::log::print("[KA] Opening device out=%d, in=%d, samplerate=%d\n",
++ conf.soundDeviceOut, conf.soundDeviceIn, conf.samplerate);
++
++@@ -159,33 +155,33 @@ int KernelAudio::openDevice(const Conf::
++
++ #endif
++
++- m_callbackInfo = {
++- /* kernelAudio = */ this,
++- /* ready = */ true,
++- /* withJack = */ getAPI() == G_SYS_API_JACK,
++- /* outBuf = */ nullptr, // filled later on in audio callback
++- /* inBuf = */ nullptr, // filled later on in audio callback
++- /* bufferSize = */ 0, // filled later on in audio callback
++- /* channelsOutCount = */ m_channelsOutCount,
++- /* channelsInCount = */ m_channelsInCount};
++-
++- RtAudioErrorType res = m_rtAudio->openStream(
++- &outParams, // output params
++- conf.soundDeviceIn != -1 ? &inParams : nullptr, // input params if inDevice is selected
++- RTAUDIO_FLOAT32, // audio format
++- m_realSampleRate, // sample rate
++- &m_realBufferSize, // buffer size in byte
++- &audioCallback, // audio callback
++- &m_callbackInfo, // user data passed to callback
++- &options);
++-
++- if (res == RtAudioErrorType::RTAUDIO_NO_ERROR)
+++ try
++ {
+++ m_callbackInfo = {
+++ /* kernelAudio = */ this,
+++ /* ready = */ true,
+++ /* withJack = */ getAPI() == G_SYS_API_JACK,
+++ /* outBuf = */ nullptr, // filled later on in audio callback
+++ /* inBuf = */ nullptr, // filled later on in audio callback
+++ /* bufferSize = */ 0, // filled later on in audio callback
+++ /* channelsOutCount = */ m_channelsOutCount,
+++ /* channelsInCount = */ m_channelsInCount};
+++
+++ m_rtAudio->openStream(
+++ &outParams, // output params
+++ conf.soundDeviceIn != -1 ? &inParams : nullptr, // input params if inDevice is selected
+++ RTAUDIO_FLOAT32, // audio format
+++ m_realSampleRate, // sample rate
+++ &m_realBufferSize, // buffer size in byte
+++ &audioCallback, // audio callback
+++ &m_callbackInfo, // user data passed to callback
+++ &options);
++ m_ready = true;
++ return 1;
++ }
++- else
+++ catch (RtAudioError& e)
++ {
+++ u::log::print("[KA] RtAudio init error: %s\n", e.getMessage());
++ closeDevice();
++ return 0;
++ }
++@@ -195,24 +191,33 @@ int KernelAudio::openDevice(const Conf::
++
++ int KernelAudio::startStream()
++ {
++- if (m_rtAudio->startStream() == RtAudioErrorType::RTAUDIO_NO_ERROR)
+++ try
++ {
++- u::log::print("[KA] Start stream - latency = %lu\n", m_rtAudio->getStreamLatency());
+++ m_rtAudio->startStream();
+++ u::log::print("[KA] latency = %lu\n", m_rtAudio->getStreamLatency());
++ return 1;
++ }
++- return 0;
+++ catch (RtAudioError& e)
+++ {
+++ u::log::print("[KA] Start stream error: %s\n", e.getMessage());
+++ return 0;
+++ }
++ }
++
++ /* -------------------------------------------------------------------------- */
++
++ int KernelAudio::stopStream()
++ {
++- if (m_rtAudio->stopStream() == RtAudioErrorType::RTAUDIO_NO_ERROR)
+++ try
++ {
++- u::log::print("[KA] Stop stream\n");
+++ m_rtAudio->stopStream();
++ return 1;
++ }
++- return 0;
+++ catch (RtAudioError& /*e*/)
+++ {
+++ u::log::print("[KA] Stop stream error\n");
+++ return 0;
+++ }
++ }
++
++ /* -------------------------------------------------------------------------- */
++@@ -329,24 +334,32 @@ void KernelAudio::logCompiledAPIs()
++
++ m::KernelAudio::Device KernelAudio::fetchDevice(size_t deviceIndex) const
++ {
++- RtAudio::DeviceInfo info = m_rtAudio->getDeviceInfo(deviceIndex);
+++ try
+++ {
+++ RtAudio::DeviceInfo info = m_rtAudio->getDeviceInfo(deviceIndex);
++
++- if (!info.probed)
+++ if (!info.probed)
+++ {
+++ u::log::print("[KA] Can't probe device %d\n", deviceIndex);
+++ return {deviceIndex};
+++ }
+++
+++ return {
+++ deviceIndex,
+++ true,
+++ info.name,
+++ static_cast<int>(info.outputChannels),
+++ static_cast<int>(info.inputChannels),
+++ static_cast<int>(info.duplexChannels),
+++ info.isDefaultOutput,
+++ info.isDefaultInput,
+++ u::vector::cast<int>(info.sampleRates)};
+++ }
+++ catch (RtAudioError& e)
++ {
++- u::log::print("[KA] Can't probe device %d\n", deviceIndex);
++- return {deviceIndex};
+++ u::log::print("[KA] Error fetching device %d: %s\n", deviceIndex, e.getMessage());
+++ return {0};
++ }
++-
++- return {
++- deviceIndex,
++- true,
++- info.name,
++- static_cast<int>(info.outputChannels),
++- static_cast<int>(info.inputChannels),
++- static_cast<int>(info.duplexChannels),
++- info.isDefaultOutput,
++- info.isDefaultInput,
++- u::vector::cast<int>(info.sampleRates)};
++ }
++
++ /* -------------------------------------------------------------------------- */
--- /dev/null
--- /dev/null
++Description: Add keywords and translations from old debian desktop file
++ and add german translation
++Author: Dennis Braun <d_braun@kabelmail.de>
++Forwarded: yes
++
++Index: giada/extras/com.giadamusic.Giada.desktop
++===================================================================
++--- giada.orig/extras/com.giadamusic.Giada.desktop
+++++ giada/extras/com.giadamusic.Giada.desktop
++@@ -2,11 +2,17 @@
++ Version=1.0
++ Type=Application
++ Name=Giada
++-Name[es]=Giada
++ GenericName=Drum machine and loop sequencer
+++Comment=Drum machine and loop sequencer
+++GenericName[de]=Drum Maschine und Loop Sequenzer
++ GenericName[es]=Caja de ritmos y secuenciador de loops
+++GenericName[fr]=Boîte à rythme et séquenceur de boucle
+++Comment=Drum machine and loop sequencer
+++Comment[de]=Drum Maschine und Loop Sequenzer
+++Comment[es]=Caja de ritmos y secuenciador de loops
+++Comment[fr]=Boîte à rythme et séquenceur de boucle
++ Exec=giada %f
++ Terminal=false
++ Icon=com.giadamusic.Giada
++ Categories=Music;AudioVideo;Audio;Midi;X-Digital_Processing;X-Jack;X-MIDI;
++-Keywords=Giada;
+++Keywords=midi;jackd;alsa;pulse;audio;sound;loop;
--- /dev/null
--- /dev/null
++desktop_improvements.patch
++02-geompp.patch
++03-system-rtaudio.patch
++04-system-json.patch
++RtAudio52.patch
++06-system-jpg+png.patch
--- /dev/null
--- /dev/null
++#!/usr/bin/make -f
++
++export DEB_BUILD_MAINT_OPTIONS = hardening=+all
++# see ENVIRONMENT in dpkg-buildflags(1)
++export DEB_CPPFLAGS_MAINT_APPEND =
++export DEB_CXXFLAGS_MAINT_APPEND =
++export DEB_LDFLAGS_MAINT_APPEND =
++
++# workaround for an FST bug
++DEB_CPPFLAGS_MAINT_APPEND += -D_fstEffect=AEffect
++
++DATE_FMT = %Y-%m-%d
++ifdef SOURCE_DATE_EPOCH
++ BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
++else
++ BUILD_DATE ?= $(shell date "+$(DATE_FMT)")
++endif
++
++JUCE_VERSION := $(shell dpkg-query --show --showformat='$${source:Version}' juce-modules-source)
++
++DEB_CPPFLAGS_MAINT_APPEND += -DBUILD_DATE='"$(BUILD_DATE)"' -DTEST_RESOURCES_DIR='"tests/resources/"'
++DEB_CXXFLAGS_MAINT_APPEND += -std=c++17 -Wno-error -Wno-error=format-security
++LIBS=$(shell pkg-config --libs libjpeg libpng libcurl rtaudio)
++DEB_CXXFLAGS_MAINT_APPEND += $(shell pkg-config --cflags libjpeg libpng libcurl rtaudio)
++
++# JUCE (used by giada) uses some c++11 features requiring atomic_store_8 and
++# atomic_load_8, so we need to link with libatomic on
++# armel, powerpc, powerpcspe, m68k, mips, mipsel, sh4, ...
++# see also:
++# - https://gcc.gnu.org/wiki/Atomic
++# - https://gcc.gnu.org/wiki/Atomic/GCCMM/LIbrary
++# - the 'clasp' packaging
++noatomicarch = $(shell dpkg-architecture -qDEB_HOST_ARCH | egrep -x "(armel|powerpc|powerpcspe|m68k|mips|mipsel|sh4|riscv64)")
++# link with libatomic on architectures without built-in atomic
++ifeq ($(if $(noatomicarch),atomic), atomic)
++ LIBS += -latomic
++endif
++
++DEB_LDFLAGS_MAINT_APPEND += $(LIBS)
++
++%:
++ dh $@
++
++execute_before_dh_auto_configure:
++ for d in $(notdir $(patsubst %/,%,$(wildcard debian/missing-sources/mcl-*/))); do \
++ mkdir -p src/deps/$$d/src/; \
++ cp debian/missing-sources/$$d/* src/deps/$$d/src/; \
++ done
++ cp -ra /usr/share/juce src/deps/
++ # patch around some bugs in FST
++ sed -e 's|\(.*t_fstTimeInfo.smpteFrameRate.*\)|};\ntypedef enum {\1|' -e 's|\(.*SmpteFilm35mm.*\)|\1 } VstSmpteFrameRate;\nenum {dummy_enum|' /usr/include/pluginterfaces/fst/fst.h > src/deps/juce/modules/juce_audio_processors/format_types/fst.h
++ sed -e 's|<pluginterfaces/fst/fst.h>|"fst.h"|' -i src/deps/juce/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
++override_dh_auto_configure:
++ dh_auto_configure -- \
++ -DWITH_VST2=ON \
++ $(empty)
++
++override_dh_auto_test:
++ HOME=/tmp xvfb-run -a dh_auto_test -a || (grep . test-suite.log giada_test.log; false)
++
++execute_after_dh_clean:
++ test -e src/deps/rtaudio-mode/Makefile && make -C src/deps/rtaudio-mod/ distclean || true
++ for d in $(notdir $(patsubst %/,%,$(wildcard debian/missing-sources/mcl-*/))); do \
++ rm -rf src/deps/$$d; \
++ done
++ rm -rf src/deps/juce/
++
++override_dh_installchangelogs:
++ dh_installchangelogs ChangeLog
++
++override_dh_gencontrol:
++ dh_gencontrol -- \
++ -Vjuce:BuiltUsing="juce ( = $(JUCE_VERSION) )"
++
++
++DEB_COPYRIGHT_CHECK_IGNORE_REGEX = \
++ \.pc/.*|\.git/.*|debian/.*|.*\.png
++
++licensecheck:
++ licensecheck -i "^\./($(DEB_COPYRIGHT_CHECK_IGNORE_REGEX))$$" --deb-machine -r . \
++ > debian/copyright_newhints
++ cmp debian/copyright_hints debian/copyright_newhints \
++ && rm debian/copyright_newhints
--- /dev/null
--- /dev/null
++---
++include:
++ - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
++ - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
--- /dev/null
--- /dev/null
++3.0 (quilt)
--- /dev/null
--- /dev/null
++Archive: github
++Bug-Database: https://github.com/monocasual/giada/issues
++Bug-Submit: https://github.com/monocasual/giada/issues/new
++Repository: https://github.com/monocasual/giada.git
++Repository-Browse: https://github.com/monocasual/giada
--- /dev/null
--- /dev/null
++version=4
++opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/giada-$1\.tar\.gz/ \
++ https://github.com/monocasual/giada/tags .*/v?(\d\S*)\.tar\.gz