Import giada_0.21.0-1.debian.tar.xz
authorDennis Braun <d_braun@kabelmail.de>
Sun, 15 May 2022 16:50:55 +0000 (17:50 +0100)
committerDennis Braun <d_braun@kabelmail.de>
Sun, 15 May 2022 16:50:55 +0000 (17:50 +0100)
[dgit import tarball giada 0.21.0-1 giada_0.21.0-1.debian.tar.xz]

26 files changed:
README.source [new file with mode: 0644]
changelog [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
copyright_hints [new file with mode: 0644]
gbp.conf [new file with mode: 0644]
gbp/postclone.sh [new file with mode: 0755]
giada.1 [new file with mode: 0644]
giada.fr.1 [new file with mode: 0644]
giada.manpages [new file with mode: 0644]
missing-sources/README.md [new file with mode: 0644]
missing-sources/mcl-atomic-swapper/atomic-swapper.hpp [new file with mode: 0644]
missing-sources/mcl-audio-buffer/audioBuffer.cpp [new file with mode: 0644]
missing-sources/mcl-audio-buffer/audioBuffer.hpp [new file with mode: 0644]
patches/02-geompp.patch [new file with mode: 0644]
patches/03-system-rtaudio.patch [new file with mode: 0644]
patches/04-system-json.patch [new file with mode: 0644]
patches/06-system-jpg+png.patch [new file with mode: 0644]
patches/RtAudio52.patch [new file with mode: 0644]
patches/desktop_improvements.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
rules [new file with mode: 0755]
salsa-ci.yml [new file with mode: 0644]
source/format [new file with mode: 0644]
upstream/metadata [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/README.source b/README.source
new file mode 100644 (file)
index 0000000..6b617bb
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..0ee96e9
--- /dev/null
+++ b/changelog
@@ -0,0 +1,454 @@
+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
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..d4c746b
--- /dev/null
+++ b/control
@@ -0,0 +1,50 @@
+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.
diff --git a/copyright b/copyright
new file mode 100644 (file)
index 0000000..e1f9f17
--- /dev/null
+++ b/copyright
@@ -0,0 +1,45 @@
+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'.
diff --git a/copyright_hints b/copyright_hints
new file mode 100644 (file)
index 0000000..16f4461
--- /dev/null
@@ -0,0 +1,398 @@
+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
+
diff --git a/gbp.conf b/gbp.conf
new file mode 100644 (file)
index 0000000..4a6c371
--- /dev/null
+++ b/gbp.conf
@@ -0,0 +1,5 @@
+[DEFAULT]
+pristine-tar = True
+sign-tags = True
+
+debian-branch = master
diff --git a/gbp/postclone.sh b/gbp/postclone.sh
new file mode 100755 (executable)
index 0000000..5790ec6
--- /dev/null
@@ -0,0 +1,14 @@
+#!/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/")
diff --git a/giada.1 b/giada.1
new file mode 100644 (file)
index 0000000..606f901
--- /dev/null
+++ b/giada.1
@@ -0,0 +1,34 @@
+.\"                                      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).
diff --git a/giada.fr.1 b/giada.fr.1
new file mode 100644 (file)
index 0000000..a6e6882
--- /dev/null
@@ -0,0 +1,42 @@
+.\"                                      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).
diff --git a/giada.manpages b/giada.manpages
new file mode 100644 (file)
index 0000000..c014cc7
--- /dev/null
@@ -0,0 +1,2 @@
+debian/giada.1
+debian/giada.fr.1
diff --git a/missing-sources/README.md b/missing-sources/README.md
new file mode 100644 (file)
index 0000000..cc45e02
--- /dev/null
@@ -0,0 +1,18 @@
+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.
+
diff --git a/missing-sources/mcl-atomic-swapper/atomic-swapper.hpp b/missing-sources/mcl-atomic-swapper/atomic-swapper.hpp
new file mode 100644 (file)
index 0000000..e3ca0d5
--- /dev/null
@@ -0,0 +1,163 @@
+/* -----------------------------------------------------------------------------
+ *
+ * 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
diff --git a/missing-sources/mcl-audio-buffer/audioBuffer.cpp b/missing-sources/mcl-audio-buffer/audioBuffer.cpp
new file mode 100644 (file)
index 0000000..1edc2ab
--- /dev/null
@@ -0,0 +1,299 @@
+/* -----------------------------------------------------------------------------
+ *
+ * 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
diff --git a/missing-sources/mcl-audio-buffer/audioBuffer.hpp b/missing-sources/mcl-audio-buffer/audioBuffer.hpp
new file mode 100644 (file)
index 0000000..d77cde0
--- /dev/null
@@ -0,0 +1,179 @@
+/* -----------------------------------------------------------------------------
+ *
+ * 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
diff --git a/patches/02-geompp.patch b/patches/02-geompp.patch
new file mode 100644 (file)
index 0000000..4b5f32c
--- /dev/null
@@ -0,0 +1,586 @@
+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
diff --git a/patches/03-system-rtaudio.patch b/patches/03-system-rtaudio.patch
new file mode 100644 (file)
index 0000000..4d06c21
--- /dev/null
@@ -0,0 +1,101 @@
+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
diff --git a/patches/04-system-json.patch b/patches/04-system-json.patch
new file mode 100644 (file)
index 0000000..6f94946
--- /dev/null
@@ -0,0 +1,48 @@
+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>
diff --git a/patches/06-system-jpg+png.patch b/patches/06-system-jpg+png.patch
new file mode 100644 (file)
index 0000000..0437243
--- /dev/null
@@ -0,0 +1,20 @@
+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)
diff --git a/patches/RtAudio52.patch b/patches/RtAudio52.patch
new file mode 100644 (file)
index 0000000..b1fc3fb
--- /dev/null
@@ -0,0 +1,168 @@
+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)};
+ }
+ /* -------------------------------------------------------------------------- */
diff --git a/patches/desktop_improvements.patch b/patches/desktop_improvements.patch
new file mode 100644 (file)
index 0000000..b5c104f
--- /dev/null
@@ -0,0 +1,29 @@
+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;
diff --git a/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..4ea11b6
--- /dev/null
@@ -0,0 +1,6 @@
+desktop_improvements.patch
+02-geompp.patch
+03-system-rtaudio.patch
+04-system-json.patch
+RtAudio52.patch
+06-system-jpg+png.patch
diff --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..58ad929
--- /dev/null
+++ b/rules
@@ -0,0 +1,83 @@
+#!/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
diff --git a/salsa-ci.yml b/salsa-ci.yml
new file mode 100644 (file)
index 0000000..33c3a64
--- /dev/null
@@ -0,0 +1,4 @@
+---
+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
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/upstream/metadata b/upstream/metadata
new file mode 100644 (file)
index 0000000..a562349
--- /dev/null
@@ -0,0 +1,5 @@
+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
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..f0fe5af
--- /dev/null
+++ b/watch
@@ -0,0 +1,3 @@
+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