--- /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
+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
+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
+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
+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
+[DEFAULT]
+pristine-tar = True
+sign-tags = True
+
+debian-branch = master
--- /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
+.\" 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
+.\" 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
+debian/giada.1
+debian/giada.fr.1
--- /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
+/* -----------------------------------------------------------------------------
+ *
+ * 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
+/* -----------------------------------------------------------------------------
+ *
+ * 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
+/* -----------------------------------------------------------------------------
+ *
+ * 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
+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
+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
+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
+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
+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
+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
+desktop_improvements.patch
+02-geompp.patch
+03-system-rtaudio.patch
+04-system-json.patch
+RtAudio52.patch
+06-system-jpg+png.patch
--- /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
+---
+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
+3.0 (quilt)
--- /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
+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