From: Dennis Braun Date: Sun, 15 May 2022 16:50:55 +0000 (+0200) Subject: Import giada_0.21.0-1.debian.tar.xz X-Git-Tag: archive/raspbian/0.22.0-1+rpi1~1^2^2^2~6^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=047d2d67d9ef0442af749b4a68900f49dc8ab11b;p=giada.git Import giada_0.21.0-1.debian.tar.xz [dgit import tarball giada 0.21.0-1 giada_0.21.0-1.debian.tar.xz] --- 047d2d67d9ef0442af749b4a68900f49dc8ab11b diff --git a/README.source b/README.source new file mode 100644 index 0000000..6b617bb --- /dev/null +++ b/README.source @@ -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 < Mon, 1 Aug 2016 12:15:50 +0200 diff --git a/changelog b/changelog new file mode 100644 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 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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š 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š 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š 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) 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š 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š 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š 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š 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š 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š 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 + + -- Jaromír Mikeš 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š 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) 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) 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š 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) 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) 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š 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š 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) 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š 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š Wed, 08 Apr 2015 14:59:44 +0200 diff --git a/control b/control new file mode 100644 index 0000000..d4c746b --- /dev/null +++ b/control @@ -0,0 +1,50 @@ +Source: giada +Section: sound +Priority: optional +Maintainer: Debian Multimedia Maintainers +Uploaders: + Jaromír Mikeš , + IOhannes m zmölnig (Debian/GNU) , + Dennis Braun +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 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 +Source: https://www.giadamusic.com + +Files: * +Copyright: + 2010-2022 Giovanni A. Zuliani | Monocasual +License: GPL-3+ + +Files: debian/* +Copyright: + 2018-2020 Olivier Humbert + 2015-2017 Jaromír Mikeš + 2015-2022 IOhannes m zmölnig + 2020-2022 Dennis Braun +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 . + . + 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 index 0000000..16f4461 --- /dev/null +++ b/copyright_hints @@ -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. +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 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 index 0000000..5790ec6 --- /dev/null +++ b/gbp/postclone.sh @@ -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 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 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š , +for the Debian project (but may be used by others). diff --git a/giada.fr.1 b/giada.fr.1 new file mode 100644 index 0000000..a6e6882 --- /dev/null +++ b/giada.fr.1 @@ -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 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š +, pour le projet Debian (mais peut être utilisée par +d'autres). +.PP +Elle a été traduite en français par Olivier Humbert 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 index 0000000..c014cc7 --- /dev/null +++ b/giada.manpages @@ -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 index 0000000..cc45e02 --- /dev/null +++ b/missing-sources/README.md @@ -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 index 0000000..e3ca0d5 --- /dev/null +++ b/missing-sources/mcl-atomic-swapper/atomic-swapper.hpp @@ -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 + * . + * + * -------------------------------------------------------------------------- */ + +#ifndef MONOCASUAL_ATOMIC_SWAPPER_H +#define MONOCASUAL_ATOMIC_SWAPPER_H + +#include +#include + +namespace mcl +{ +template +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); + } + + /* 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(static_cast(*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 m_data; + std::atomic 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 index 0000000..1edc2ab --- /dev/null +++ b/missing-sources/mcl-audio-buffer/audioBuffer.cpp @@ -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 + * . + * + * -------------------------------------------------------------------------- */ + +#include "audioBuffer.hpp" +#include +#include + +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(b, framesToCopy, srcOffset, destOffset, gain, pan); +} + +void AudioBuffer::set(const AudioBuffer& b, int framesToCopy, int srcOffset, + int destOffset, float gain, Pan pan) +{ + copyData(b, framesToCopy, srcOffset, destOffset, gain, pan); +} + +void AudioBuffer::sum(const AudioBuffer& b, float gain, Pan pan) +{ + copyData(b, -1, 0, 0, gain, pan); +} + +void AudioBuffer::set(const AudioBuffer& b, float gain, Pan pan) +{ + copyData(b, -1, 0, 0, gain, pan); +} + +/* -------------------------------------------------------------------------- */ + +template +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 f) +{ + for (int i = 0; i < countFrames(); i++) + f((*this)[i], i); +} + +/* -------------------------------------------------------------------------- */ + +void AudioBuffer::forEachChannel(int frame, std::function f) +{ + assert(frame < m_size); + + for (int i = 0; i < countChannels(); i++) + f((*this)[frame][i], i); +} + +/* -------------------------------------------------------------------------- */ + +void AudioBuffer::forEachSample(std::function f) +{ + for (int i = 0; i < countSamples(); i++) + f(m_data[i], i); +} + +/* -------------------------------------------------------------------------- */ + +template void AudioBuffer::copyData(const AudioBuffer&, int, int, int, float, Pan); +template void AudioBuffer::copyData(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 index 0000000..d77cde0 --- /dev/null +++ b/missing-sources/mcl-audio-buffer/audioBuffer.hpp @@ -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 + * . + * + * -------------------------------------------------------------------------- */ + +#ifndef MONOCASUAL_AUDIO_BUFFER_H +#define MONOCASUAL_AUDIO_BUFFER_H + +#include +#include + +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; + + /* 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; kcountFrames(), k++) + for (int i=0; icountChannels(); 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); + + /* forEachChannel + Applies a function to each channel in the given frame. */ + + void forEachChannel(int frame, std::function); + + /* forEachSample + Applies a function to each sample in the audio buffer. */ + + void forEachSample(std::function); + +private: + enum class Operation + { + SUM, + SET + }; + + template + 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 index 0000000..4b5f32c --- /dev/null +++ b/patches/02-geompp.patch @@ -0,0 +1,586 @@ +From: Debian Multimedia Maintainers +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 ++ * . ++ * ++ * -------------------------------------------------------------------------- */ ++ ++#ifndef GEOMPP_LINE_HH ++#define GEOMPP_LINE_HH ++ ++namespace geompp ++{ ++template ++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 ++ * . ++ * ++ * -------------------------------------------------------------------------- */ ++ ++#ifndef GEOMPP_POINT_HH ++#define GEOMPP_POINT_HH ++ ++#include ++ ++namespace geompp ++{ ++template ++class Point ++{ ++public: ++ constexpr Point() ++ : Point(0, 0) ++ { ++ } ++ ++ constexpr Point(T x, T y) ++ : x(x) ++ , y(y) ++ { ++ } ++ ++ bool operator==(const Point& o) const ++ { ++ return x == o.x && y == o.y; ++ } ++ ++ bool operator!=(const Point& o) const ++ { ++ return !(*this == o); ++ } ++ ++ Point operator+(const Point& o) const ++ { ++ return {x + o.x, y + o.y}; ++ } ++ ++ Point operator-(const Point& o) const ++ { ++ return {x - o.x, y - o.y}; ++ } ++ ++ /* with[...] ++ Returns a copy of this Point with a new coordinate. */ ++ ++ Point withX(T v) const { return {v, y}; } ++ Point 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 ++ * . ++ * ++ * -------------------------------------------------------------------------- */ ++ ++#ifndef GEOMPP_RANGE_HH ++#define GEOMPP_RANGE_HH ++ ++#include ++ ++namespace geompp ++{ ++template ++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 operator*(const T m) const { return {a * m, b * m}; } ++ Range operator*=(const T m) const { return {a * m, b * m}; } ++ Range operator/(const T m) const { return {a / m, b / m}; } ++ Range operator/=(const T m) const { return {a / m, b / m}; } ++ Range operator+(const T m) const { return {a + m, b + m}; } ++ Range operator+=(const T m) const { return {a + m, b + m}; } ++ Range operator-(const T m) const { return {a - m, b - m}; } ++ Range 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 ++ * . ++ * ++ * -------------------------------------------------------------------------- */ ++ ++#ifndef GEOMPP_RECT_HH ++#define GEOMPP_RECT_HH ++ ++#include "border.hpp" ++#include "line.hpp" ++#include "point.hpp" ++#include "range.hpp" ++ ++namespace geompp ++{ ++template ++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 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 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 withX(T v) const { return {v, y, w, h}; } ++ Rect withY(T v) const { return {x, v, w, h}; } ++ Rect withW(T v) const { return {x, y, v, h}; } ++ Rect 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 withPosition(Point p) const { return {p.x, p.y, w, h}; } ++ ++ /* withShifted[...] ++ Returns a copy of this Rect shifted by a certain amount. */ ++ ++ Rect withShiftedX(T amount) const { return {x + amount, y, w, h}; } ++ Rect 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 withTrimmedLeft(T amount) const { return {x + amount, y, w - amount, h}; } ++ Rect withTrimmedRight(T amount) const { return {x, y, w - amount, h}; } ++ Rect withTrimmedTop(T amount) const { return {x, y + amount, w, h - amount}; } ++ Rect withTrimmedBottom(T amount) const { return {x, y, w, h - amount}; } ++ ++ /* get[Width|Height]AsLine ++ Returns width or height as a new Line object. */ ++ ++ Line getWidthAsLine() const { return Line(x, y, xw - 1, y); } ++ Line getHeightAsLine() const { return Line(x, y, x, yh - 1); } ++ ++ Point getPosition() const { return Point(x, y); } ++ ++ /* reduced ++ Returns a copy of this Rect with all four sides reduced by a certain Border. */ ++ ++ Rect reduced(Border b) const ++ { ++ Rect r = *this; ++ r.reduce(b); ++ return r; ++ } ++ ++ /* expanded (1), (2) ++ The opposite of reduced (1), (2). */ ++ ++ Rect expanded(T amountX, T amountY) const { return reduced(-amountX, -amountY); } ++ Rect expanded(T amount) const { return reduced(-amount); } ++ ++ /* contains (1) ++ Returns true if Point p is inside this Rect. */ ++ ++ bool contains(Point 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 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 ++ * . ++ * ++ * -------------------------------------------------------------------------- */ ++ ++#ifndef GEOMPP_BORDER_HH ++#define GEOMPP_BORDER_HH ++ ++namespace geompp ++{ ++template ++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 index 0000000..4d06c21 --- /dev/null +++ b/patches/03-system-rtaudio.patch @@ -0,0 +1,101 @@ +From: Debian Multimedia Maintainers +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 + #include + #include +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 + #include + +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_rtAudio->HACK__getJackClient()); ++ return nullptr; + } + #endif + diff --git a/patches/04-system-json.patch b/patches/04-system-json.patch new file mode 100644 index 0000000..6f94946 --- /dev/null +++ b/patches/04-system-json.patch @@ -0,0 +1,48 @@ +From: Debian Multimedia Maintainers +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 +--- 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 + #include + +--- 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 diff --git a/patches/06-system-jpg+png.patch b/patches/06-system-jpg+png.patch new file mode 100644 index 0000000..0437243 --- /dev/null +++ b/patches/06-system-jpg+png.patch @@ -0,0 +1,20 @@ +Description: link against system libpng/libjpeg +Author: IOhannes m zmölnig +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 index 0000000..b1fc3fb --- /dev/null +++ b/patches/RtAudio52.patch @@ -0,0 +1,168 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +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(info.outputChannels), ++ static_cast(info.inputChannels), ++ static_cast(info.duplexChannels), ++ info.isDefaultOutput, ++ info.isDefaultInput, ++ u::vector::cast(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(info.outputChannels), +- static_cast(info.inputChannels), +- static_cast(info.duplexChannels), +- info.isDefaultOutput, +- info.isDefaultInput, +- u::vector::cast(info.sampleRates)}; + } + + /* -------------------------------------------------------------------------- */ diff --git a/patches/desktop_improvements.patch b/patches/desktop_improvements.patch new file mode 100644 index 0000000..b5c104f --- /dev/null +++ b/patches/desktop_improvements.patch @@ -0,0 +1,29 @@ +Description: Add keywords and translations from old debian desktop file + and add german translation +Author: Dennis Braun +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 index 0000000..4ea11b6 --- /dev/null +++ b/patches/series @@ -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 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||"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 index 0000000..33c3a64 --- /dev/null +++ b/salsa-ci.yml @@ -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 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/upstream/metadata b/upstream/metadata new file mode 100644 index 0000000..a562349 --- /dev/null +++ b/upstream/metadata @@ -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 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