summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorlieven moors2015-06-11 21:47:48 +0200
committerlieven moors2015-06-11 21:47:48 +0200
commitb578ab0c0ff9ac16a084abf0523cecc2941fe1ca (patch)
treea9f9ba19535fae3400f93c84b07c1b7717ee33a8
downloadaur-b578ab0c0ff9ac16a084abf0523cecc2941fe1ca.tar.gz
initial import
-rw-r--r--.SRCINFO20
-rw-r--r--PKGBUILD32
-rw-r--r--rev_21_to_25.diff459
3 files changed, 511 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..b2ab3d34e738
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,20 @@
+pkgbase = softwerk
+ pkgdesc = A software analogue MIDI sequencer, modelled on hardware analogue sequencers like Doepfer's Schaltwerk
+ pkgver = 3.0
+ pkgrel = 6
+ url = http://softwerk.linuxaudiosystems.com/softwerk/softwerk/trunk/softwerk/
+ arch = i686
+ arch = x86_64
+ license = GPL2
+ makedepends = scons
+ makedepends = boost
+ depends = libxslt
+ depends = alsa-lib
+ depends = gtkmm
+ source = http://ardour.org/files/softwerk-3.0.tar.bz2
+ source = rev_21_to_25.diff
+ md5sums = a58a0854927ca46eff10ce6af123f35c
+ md5sums = 86849b739c057d680e955e3192326ffc
+
+pkgname = softwerk
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..3d315d1683ab
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,32 @@
+# Maintainer: Lieven Moors <lievenmoors at gmail dot com>
+# Contributor: Philipp Überbacher <murks at lavabit dot com>
+
+pkgname=softwerk
+pkgver=3.0
+pkgrel=6
+pkgdesc="A software analogue MIDI sequencer, modelled on hardware
+analogue sequencers like Doepfer's Schaltwerk"
+arch=(i686 x86_64)
+url="http://softwerk.linuxaudiosystems.com/softwerk/softwerk/trunk/softwerk/"
+license=('GPL2')
+depends=('libxslt' 'alsa-lib' 'gtkmm')
+makedepends=('scons' 'boost')
+source=(http://ardour.org/files/${pkgname}-${pkgver}.tar.bz2
+rev_21_to_25.diff)
+md5sums=('a58a0854927ca46eff10ce6af123f35c'
+ '86849b739c057d680e955e3192326ffc')
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ patch -p3 < ${srcdir}/rev_21_to_25.diff
+ sed -i 's/lib64/lib/' SConstruct
+ sed -i '/#include <cerrno>/a#include <unistd.h>' libs/pbd/path.cc
+ sed -i 's|#include <glib/gfileutils.h>|#include <glib.h>|' src/configuration.cc
+ scons PREFIX=/usr
+}
+
+package(){
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ scons PREFIX=/usr DESTDIR="${pkgdir}" install
+}
+# vim:set ts=2 sw=2 et:
diff --git a/rev_21_to_25.diff b/rev_21_to_25.diff
new file mode 100644
index 000000000000..5c589d2d94aa
--- /dev/null
+++ b/rev_21_to_25.diff
@@ -0,0 +1,459 @@
+Index: softwerk/trunk/softwerk/SConstruct
+===================================================================
+--- softwerk/trunk/softwerk/SConstruct (revision 21)
++++ softwerk/trunk/softwerk/SConstruct (revision 25)
+@@ -32,7 +32,6 @@
+ EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
+ BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic. Might break compilation. For pedants', 0),
+ BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
+- BoolOption('LIBLO', 'Compile with support for liblo library', 1),
+ BoolOption('NLS', 'Set to turn on i18n support', 1),
+ PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
+ BoolOption('SYSLIBS', 'DEPRECATED, DO NOT USE THIS OPTION', 1),
+@@ -630,10 +629,6 @@
+ env.Append(CXXFLAGS="-ansi")
+ # env.Append(CFLAGS="-iso")
+
+-if env['LIBLO']:
+- env.Append(CCFLAGS="-DHAVE_LIBLO")
+-
+-
+ #
+ # fix scons nitpickiness on APPLE
+ #
+@@ -672,17 +667,6 @@
+ #
+ # Check for liblo
+
+-if env['LIBLO']:
+- libraries['lo'] = LibraryInfo ()
+- prep_libcheck(env, libraries['lo'])
+-
+- conf = Configure (libraries['lo'])
+- if conf.CheckLib ('lo', 'lo_server_new') == False:
+- print "liblo does not appear to be installed."
+- sys.exit (1)
+-
+- libraries['lo'] = conf.Finish ()
+-
+ #
+ # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
+ #
+Index: softwerk/trunk/softwerk/src/sequencer.h
+===================================================================
+--- softwerk/trunk/softwerk/src/sequencer.h (revision 21)
++++ softwerk/trunk/softwerk/src/sequencer.h (revision 25)
+@@ -213,7 +213,7 @@
+
+ static void* _sequencer_thread (void*);
+ void* sequencer_thread ();
+- int midi_read (MIDI::Port&);
++ int midi_read ();
+ int thread_pipe[2];
+ bool thread_running;
+ void stop ();
+Index: softwerk/trunk/softwerk/src/step_ui.cc
+===================================================================
+--- softwerk/trunk/softwerk/src/step_ui.cc (revision 21)
++++ softwerk/trunk/softwerk/src/step_ui.cc (revision 25)
+@@ -348,10 +348,10 @@
+ "f",
+ "f#",
+ "g",
++ "g#",
+ "a",
+ "a#",
+- "b",
+- "b#"
++ "b"
+ };
+
+ int octave = val/12;
+Index: softwerk/trunk/softwerk/src/sequencer.cc
+===================================================================
+--- softwerk/trunk/softwerk/src/sequencer.cc (revision 21)
++++ softwerk/trunk/softwerk/src/sequencer.cc (revision 25)
+@@ -19,6 +19,7 @@
+ */
+
+ #include <cstring>
++#include <set>
+
+ #include <stdio.h>
+ #include <sys/time.h>
+@@ -46,6 +47,7 @@
+ #include <midi++/channel.h>
+ #include <midi++/parser.h>
+ #include <midi++/manager.h>
++#include <midi++/alsa_sequencer.h>
+
+ #include "step.h"
+ #include "sequence.h"
+@@ -69,11 +71,12 @@
+
+ using namespace PBD;
+ using namespace sigc;
++using std::set;
+
+ Sequencer *Sequencer::theSequencer = 0;
+
+ int
+-Sequencer::midi_read (MIDI::Port& port)
++Sequencer::midi_read ()
+ {
+ MIDI::byte buf[512];
+
+@@ -85,12 +88,8 @@
+
+ while (1) {
+
+- // cerr << "+++ READ ON " << port.name() << endl;
+-
+- int nread = port.read (buf, sizeof (buf));
++ int nread = MIDI::ALSA_SequencerMidiPort::read_all_ports (buf, sizeof (buf));
+
+- // cerr << "-- READ (" << nread << " ON " << port.name() << endl;
+-
+ if (nread > 0) {
+ if ((size_t) nread < sizeof (buf)) {
+ break;
+@@ -102,7 +101,6 @@
+ } else if (errno == EAGAIN) {
+ break;
+ } else {
+- fatal << "Error reading from MIDI port " << port.name() << endmsg;
+ /*NOTREACHED*/
+ }
+ }
+@@ -125,6 +123,8 @@
+ struct sched_param rtparam;
+ list<MIDI::Port*> ports;
+ ticks_t next_wakeup = TICK_MAX;
++ set<int> fds_used;
++ bool read_done = false;
+
+ PBD::ThreadCreated (pthread_self(), "sequencer");
+
+@@ -157,7 +157,7 @@
+ pfd_size = ports.size() + 1;
+ pfd = new pollfd[pfd_size];
+
+- while (1) {
++ while (1) {
+
+ int n;
+
+@@ -165,6 +165,8 @@
+
+ /* Always poll the thread pipe */
+
++ fds_used.clear ();
++
+ pfd[0].fd = thread_pipe[0];
+ pfd[0].events = POLLIN|POLLHUP|POLLERR;
+ nfds = 1;
+@@ -174,7 +176,16 @@
+ /* only poll ports if we're meant to be busy */
+
+ for (i = ports.begin(), n = 1; i != ports.end() && n < pfd_size; ++n, ++i) {
+- pfd[n].fd = (*i)->selectable();
++
++ int fd = (*i)->selectable();
++
++ if (fds_used.find (fd) != fds_used.end()) {
++ continue;
++ }
++
++ fds_used.insert (fd);
++
++ pfd[n].fd = fd;
+ pfd[n].events = POLLIN|POLLHUP|POLLERR;
+ nfds++;
+ }
+@@ -235,23 +246,28 @@
+ continue;
+ }
+
+- for (i = ports.begin(), n = 1; i != ports.end() && n < nfds; ++n) {
++ /* now check all sequencer related fds, and do port i/o if any data is necessary.
++ */
+
+- list<MIDI::Port*>::iterator tmp;
++ read_done = false;
+
+- tmp = i;
+- ++tmp;
++ for (n = 1; n < nfds; ++n) {
+
+ if (pfd[n].revents & ~POLLIN) {
+- ports.erase (i);
+- } else if (pfd[n].revents & POLLIN) {
+- midi_read (**i);
++
++ ports.clear ();
++
++ } else if (pfd[n].revents & POLLIN & !read_done) {
++
++ /* data ready on a sequencer-related port, but we can't
++ know which one, so read them all.
++ */
++
++ midi_read ();
++ read_done = true;
+ }
+-
+- i = tmp;
+ }
+
+-
+ tick:
+ next_wakeup = clock_tick ();
+
+@@ -282,6 +298,9 @@
+ use_rtc = with_rtc;
+ thread_running = false;
+ poll_timeout = -1;
++ midi_ticks = 0;
++ carry_usecs = 0;
++ last_tick_usecs = 0;
+
+ if (pipe (thread_pipe)) {
+ error << "could not create thread pipe ("
+@@ -315,9 +334,6 @@
+ theSequencer = this;
+ }
+
+- carry_usecs = 0;
+- last_tick_usecs = 0;
+-
+ default_steps = num_steps;
+
+ for (size_t i = 0; i < num_seqs; i++) {
+@@ -480,7 +496,11 @@
+ gettimeofday (&tcurrent_tick, &tz);
+
+ current_usecs = (tcurrent_tick.tv_sec * 1000000) + tcurrent_tick.tv_usec;
+- elapsed_usecs = carry_usecs + (current_usecs - last_tick_usecs);
++ if (last_tick_usecs) {
++ elapsed_usecs = carry_usecs + (current_usecs - last_tick_usecs);
++ } else {
++ elapsed_usecs = 0;
++ }
+
+ if (usecs_per_tick > CLOCK_INTERVAL) {
+
+@@ -520,10 +540,13 @@
+
+ if (inc > 0) {
+ midi_ticks += inc;
+- last_tick_usecs = current_usecs;
+ carry_usecs = elapsed_usecs - (inc * usecs_per_tick);
+ carry_usecs = carry_usecs > 0 ? carry_usecs : 0;
+ }
++
++ if (inc > 0 || last_tick_usecs == 0) {
++ last_tick_usecs = current_usecs;
++ }
+ }
+
+ void
+Index: softwerk/trunk/softwerk/src/actions.cc
+===================================================================
+--- softwerk/trunk/softwerk/src/actions.cc (revision 21)
++++ softwerk/trunk/softwerk/src/actions.cc (revision 25)
+@@ -215,7 +215,7 @@
+ void
+ ActionManager::uncheck_toggleaction (const char * name)
+ {
+- char *last_slash = strrchr (name, '/');
++ char *last_slash = strrchr ( const_cast<char*>(name), '/');
+
+ if (last_slash == 0) {
+ fatal << string_compose (_("programmer error: %1 %2"), X_("illegal toggle action name"), name) << endmsg;
+Index: softwerk/trunk/softwerk/libs/pbd/convert.cc
+===================================================================
+--- softwerk/trunk/softwerk/libs/pbd/convert.cc (revision 21)
++++ softwerk/trunk/softwerk/libs/pbd/convert.cc (revision 25)
+@@ -17,6 +17,8 @@
+
+ */
+
++#include <cstdio>
++
+ #include <cmath>
+ #include <locale>
+ #include <algorithm>
+@@ -27,6 +29,7 @@
+ #include <inttypes.h>
+ #include <glibmm/ustring.h>
+
++
+ #include "pbd/convert.h"
+
+ #include "i18n.h"
+Index: softwerk/trunk/softwerk/libs/pbd/stacktrace.cc
+===================================================================
+--- softwerk/trunk/softwerk/libs/pbd/stacktrace.cc (revision 21)
++++ softwerk/trunk/softwerk/libs/pbd/stacktrace.cc (revision 25)
+@@ -17,6 +17,8 @@
+
+ */
+
++#include <cstdio>
++
+ #include <pbd/stacktrace.h>
+ #include <iostream>
+
+Index: softwerk/trunk/softwerk/libs/midi++2/alsa_sequencer_midiport.cc
+===================================================================
+--- softwerk/trunk/softwerk/libs/midi++2/alsa_sequencer_midiport.cc (revision 21)
++++ softwerk/trunk/softwerk/libs/midi++2/alsa_sequencer_midiport.cc (revision 25)
+@@ -45,6 +45,7 @@
+ using namespace PBD;
+
+ snd_seq_t* ALSA_SequencerMidiPort::seq = 0;
++ALSA_SequencerMidiPort::AllPorts ALSA_SequencerMidiPort::_all_ports;
+
+ ALSA_SequencerMidiPort::ALSA_SequencerMidiPort (const XMLNode& node)
+ : Port (node)
+@@ -75,6 +76,8 @@
+
+ ALSA_SequencerMidiPort::~ALSA_SequencerMidiPort ()
+ {
++ _all_ports.erase (port_id);
++
+ if (decoder) {
+ snd_midi_event_free (decoder);
+ }
+@@ -90,6 +93,7 @@
+ ALSA_SequencerMidiPort::selectable () const
+ {
+ struct pollfd pfd[1];
++
+ if (0 <= snd_seq_poll_descriptors (seq, pfd, 1, POLLIN | POLLOUT)) {
+ return pfd[0].fd;
+ }
+@@ -139,28 +143,55 @@
+ int
+ ALSA_SequencerMidiPort::read (byte *buf, size_t max)
+ {
++ /* does nothing. ALSA MIDI ports must be read
++ using the ::read_all_ports() static method.
++ */
++ return 0;
++}
++
++int
++ALSA_SequencerMidiPort::read_all_ports (byte *buf, size_t max)
++{
+ TR_FN();
+ int err;
+ snd_seq_event_t *ev;
+- if (0 <= (err = snd_seq_event_input (seq, &ev))) {
+- TR_VAL(err);
+- err = snd_midi_event_decode (decoder, buf, max, ev);
+- }
+
++ err = snd_seq_event_input (seq, &ev);
++
+ if (err > 0) {
+- bytes_read += err;
+
+- if (input_parser) {
+- input_parser->raw_preparse (*input_parser, buf, err);
+- for (int i = 0; i < err; i++) {
+- input_parser->scanner (buf[i]);
+- }
+- input_parser->raw_postparse (*input_parser, buf, err);
+- }
+- }
++ AllPorts::iterator p = _all_ports.find (ev->dest.port);
++
++ if (p == _all_ports.end()) {
++ /* no error reading but port does not exist */
++ return 0;
++ }
++
++ return p->second->read_self (buf, max, ev);
++ }
++
+ return -ENOENT == err ? 0 : err;
+ }
+
++int
++ALSA_SequencerMidiPort::read_self (byte* buf, size_t max, snd_seq_event_t* ev)
++{
++ int evsize = snd_midi_event_decode (decoder, buf, max, ev);
++
++ bytes_read += evsize;
++
++ if (input_parser) {
++ input_parser->raw_preparse (*input_parser, buf, evsize);
++
++ for (int i = 0; i < evsize; i++) {
++ input_parser->scanner (buf[i]);
++ }
++ input_parser->raw_postparse (*input_parser, buf, evsize);
++ }
++
++ return 0;
++}
++
+ int
+ ALSA_SequencerMidiPort::create_ports (const Port::Descriptor& desc)
+ {
+@@ -183,6 +214,8 @@
+ snd_seq_ev_set_source (&SEv, port_id);
+ snd_seq_ev_set_subs (&SEv);
+ snd_seq_ev_set_direct (&SEv);
++
++ _all_ports.insert (make_pair (port_id, this));
+
+ return 0;
+ }
+Index: softwerk/trunk/softwerk/libs/midi++2/midi.cc
+===================================================================
+--- softwerk/trunk/softwerk/libs/midi++2/midi.cc (revision 21)
++++ softwerk/trunk/softwerk/libs/midi++2/midi.cc (revision 25)
+@@ -161,7 +161,7 @@
+ char *lparen;
+ size_t len;
+
+- if ((lparen = strrchr (name, '(')) != 0) {
++ if ((lparen = strrchr (const_cast<char*>(name), '(')) != 0) {
+ return atoi (lparen+1);
+ } else {
+ len = strcspn (name, "0123456789");
+Index: softwerk/trunk/softwerk/libs/midi++2/midi++/alsa_sequencer.h
+===================================================================
+--- softwerk/trunk/softwerk/libs/midi++2/midi++/alsa_sequencer.h (revision 21)
++++ softwerk/trunk/softwerk/libs/midi++2/midi++/alsa_sequencer.h (revision 25)
+@@ -21,6 +21,7 @@
+
+ #include <vector>
+ #include <string>
++#include <map>
+
+ #include <fcntl.h>
+ #include <unistd.h>
+@@ -47,6 +48,10 @@
+ XMLNode& get_state() const;
+ void set_state (const XMLNode&);
+
++ static int read_all_ports (byte* buf, size_t max);
++
++ int read_self (byte* buf, size_t max, snd_seq_event_t* ev);
++
+ protected:
+ /* Direct I/O */
+
+@@ -64,6 +69,9 @@
+
+ int create_ports (const Port::Descriptor&);
+
++ typedef std::map<int,ALSA_SequencerMidiPort*> AllPorts;
++ static AllPorts _all_ports;
++
+ static int init_client (std::string name);
+ static snd_seq_t* seq;
+