summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am.drumgizmo1
-rw-r--r--src/drumgizmo.cc128
-rw-r--r--src/drumgizmo.h3
-rw-r--r--src/inputprocessor.cc165
-rw-r--r--src/inputprocessor.h44
5 files changed, 219 insertions, 122 deletions
diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo
index 6fddded..818c1ce 100644
--- a/src/Makefile.am.drumgizmo
+++ b/src/Makefile.am.drumgizmo
@@ -17,6 +17,7 @@ DRUMGIZMO_SOURCES = \
$(top_srcdir)/src/drumkitloader.cc \
$(top_srcdir)/src/drumkitparser.cc \
$(top_srcdir)/src/events.cc \
+ $(top_srcdir)/src/inputprocessor.cc \
$(top_srcdir)/src/instrument.cc \
$(top_srcdir)/src/instrumentparser.cc \
$(top_srcdir)/src/memchecker.cc \
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index 85f251b..63eda7b 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -51,14 +51,14 @@ DrumGizmo::DrumGizmo(Settings& settings,
: loader(settings)
, oe(o)
, ie(i)
+ , kit()
+ , input_processor(kit)
, framesize(0)
, freewheel(false)
, events{}
, settings(settings)
{
- is_stopping = false;
audioCache.init(10000); // start thread
-
events.reserve(1000);
}
@@ -227,129 +227,15 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
// Read new events
//
- //DEBUG(engine, "Number of active events: %d\n", activeevents[0].size());
-
ie->run(pos, nsamples, events);
- for(const auto& event: events)
- {
- if(event.type == TYPE_ONSET)
- {
- Instrument *i = nullptr;
- int d = event.instrument;
- /*
- Instruments::iterator it = kit.instruments.begin();
- while(d-- && it != kit.instruments.end())
- {
- i = &(it->second);
- ++it;
- }
- */
-
- if(!kit.isValid())
- {
- continue;
- }
-
- if(d < (int)kit.instruments.size())
- {
- i = kit.instruments[d];
- }
-
- if(i == nullptr || !i->isValid())
- {
- ERR(drumgizmo, "Missing Instrument %d.\n", (int)event.instrument);
- continue;
- }
-
- if(i->getGroup() != "")
- {
- // Add event to ramp down all existing events with the same groupname.
- Channels::iterator j = kit.channels.begin();
- while(j != kit.channels.end())
- {
- Channel &ch = *j;
- std::list< Event* >::iterator evs = activeevents[ch.num].begin();
- while(evs != activeevents[ch.num].end())
- {
- Event *ev = *evs;
- if(ev->getType() == Event::sample)
- {
- EventSample *sev = (EventSample*)ev;
- if(sev->group == i->getGroup() && sev->instrument != i)
- {
- sev->rampdown = 3000; // Ramp down 3000 samples
- // TODO: This must be configurable at some point...
- // ... perhaps even by instrument (ie. in the xml file)
- sev->ramp_start = sev->rampdown;
- }
- }
- ++evs;
- }
- ++j;
- }
- }
-
- Sample *s = i->sample(event.velocity, event.offset + pos);
-
- if(s == nullptr)
- {
- ERR(drumgizmo, "Missing Sample.\n");
- continue;
- }
-
- Channels::iterator j = kit.channels.begin();
- while(j != kit.channels.end())
- {
- Channel &ch = *j;
- AudioFile *af = s->getAudioFile(&ch);
- if(af)
- {
- // LAZYLOAD:
- // DEBUG(drumgizmo,"Requesting preparing of audio file\n");
- // loader.prepare(af);
- }
- if(af == nullptr || !af->isValid())
- {
- //DEBUG(drumgizmo,"Missing AudioFile.\n");
- }
- else
- {
- //DEBUG(drumgizmo, "Adding event %d.\n", event.offset);
- Event *evt = new EventSample(ch.num, 1.0, af, i->getGroup(), i);
- evt->offset = (event.offset + pos) * resampler[0].getRatio();
- activeevents[ch.num].push_back(evt);
- }
- ++j;
- }
- }
-
- if(event.type == TYPE_STOP)
- {
- is_stopping = true;
- }
-
- if(is_stopping)
- {
- // Count the number of active events.
- int num_active_events = 0;
- Channels::iterator j = kit.channels.begin();
- while(j != kit.channels.end())
- {
- Channel &ch = *j;
- num_active_events += activeevents[ch.num].size();
- ++j;
- }
-
- if(num_active_events == 0)
- {
- // No more active events - now we can stop the engine.
- return false;
- }
- }
+ double resample_ratio = resampler[0].getRatio();
+ bool active_events_left = input_processor.process(events, activeevents, pos, resample_ratio);
+ if(!active_events_left)
+ {
+ return false;
}
-
events.clear();
//
diff --git a/src/drumgizmo.h b/src/drumgizmo.h
index 13c657d..3e734b5 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -41,6 +41,7 @@
#include "chresampler.h"
#include "configfile.h"
#include "settings.h"
+#include "inputprocessor.h"
#define REFSFILE "refs.conf"
@@ -80,7 +81,6 @@ protected:
DrumKitLoader loader;
Mutex mutex;
- bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen.
AudioOutputEngine *oe;
AudioInputEngine *ie;
@@ -96,6 +96,7 @@ protected:
AudioCache audioCache;
DrumKit kit;
MemChecker memchecker;
+ InputProcessor input_processor;
size_t framesize;
bool freewheel;
diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc
new file mode 100644
index 0000000..789334b
--- /dev/null
+++ b/src/inputprocessor.cc
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * inputprocessor.cc
+ *
+ * Sat Apr 23 20:39:30 CEST 2016
+ * Copyright 2016 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "inputprocessor.h"
+
+#include <list>
+
+#include "hugin.hpp"
+
+#include "instrument.h"
+
+InputProcessor::InputProcessor(DrumKit& kit)
+ : kit(kit)
+ , is_stopping(false)
+{
+
+}
+
+bool InputProcessor::process(const std::vector<event_t>& events, std::list<Event*>* activeevents, size_t pos, double resample_ratio)
+{
+ for(const auto& event: events)
+ {
+ if(event.type == TYPE_ONSET)
+ {
+ Instrument *i = nullptr;
+ int d = event.instrument;
+ /*
+ Instruments::iterator it = kit.instruments.begin();
+ while(d-- && it != kit.instruments.end())
+ {
+ i = &(it->second);
+ ++it;
+ }
+ */
+
+ // TODO can this be removed?
+ if(!kit.isValid())
+ {
+ continue;
+ }
+
+ if(d < (int)kit.instruments.size())
+ {
+ i = kit.instruments[d];
+ }
+
+ if(i == nullptr || !i->isValid())
+ {
+ ERR(inputprocessor, "Missing Instrument %d.\n", (int)event.instrument);
+ continue;
+ }
+
+ if(i->getGroup() != "")
+ {
+ // Add event to ramp down all existing events with the same groupname.
+ Channels::iterator j = kit.channels.begin();
+ while(j != kit.channels.end())
+ {
+ Channel &ch = *j;
+ std::list< Event* >::iterator evs = activeevents[ch.num].begin();
+ while(evs != activeevents[ch.num].end())
+ {
+ Event *ev = *evs;
+ if(ev->getType() == Event::sample)
+ {
+ EventSample *sev = (EventSample*)ev;
+ if(sev->group == i->getGroup() && sev->instrument != i)
+ {
+ sev->rampdown = 3000; // Ramp down 3000 samples
+ // TODO: This must be configurable at some point...
+ // ... perhaps even by instrument (ie. in the xml file)
+ sev->ramp_start = sev->rampdown;
+ }
+ }
+ ++evs;
+ }
+ ++j;
+ }
+ }
+
+ Sample *s = i->sample(event.velocity, event.offset + pos);
+
+ if(s == nullptr)
+ {
+ ERR(drumgizmo, "Missing Sample.\n");
+ continue;
+ }
+
+ Channels::iterator j = kit.channels.begin();
+ while(j != kit.channels.end())
+ {
+ Channel &ch = *j;
+ AudioFile *af = s->getAudioFile(&ch);
+ if(af)
+ {
+ // LAZYLOAD:
+ // DEBUG(drumgizmo,"Requesting preparing of audio file\n");
+ // loader.prepare(af);
+ }
+ if(af == nullptr || !af->isValid())
+ {
+ //DEBUG(drumgizmo,"Missing AudioFile.\n");
+ }
+ else
+ {
+ //DEBUG(drumgizmo, "Adding event %d.\n", event.offset);
+ Event *evt = new EventSample(ch.num, 1.0, af, i->getGroup(), i);
+ evt->offset = (event.offset + pos) * resample_ratio;
+ activeevents[ch.num].push_back(evt);
+ }
+ ++j;
+ }
+ }
+
+ if(event.type == TYPE_STOP)
+ {
+ is_stopping = true;
+ }
+
+ if(is_stopping)
+ {
+ // Count the number of active events.
+ int num_active_events = 0;
+ Channels::iterator j = kit.channels.begin();
+ while(j != kit.channels.end())
+ {
+ Channel &ch = *j;
+ num_active_events += activeevents[ch.num].size();
+ ++j;
+ }
+
+ if(num_active_events == 0)
+ {
+ // No more active events - now we can stop the engine.
+ return false;
+ }
+ }
+
+ }
+
+ return true;
+}
diff --git a/src/inputprocessor.h b/src/inputprocessor.h
new file mode 100644
index 0000000..24685be
--- /dev/null
+++ b/src/inputprocessor.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * inputprocessor.h
+ *
+ * Sat Apr 23 20:39:30 CEST 2016
+ * Copyright 2016 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#pragma once
+
+#include <vector>
+#include <list>
+
+#include "drumkit.h"
+#include "events.h"
+#include <event.h>
+
+class InputProcessor
+{
+public:
+ InputProcessor(DrumKit& kit);
+ bool process(const std::vector<event_t>& events, std::list<Event*>* activeevents, size_t pos, double resample_ratio);
+private:
+ DrumKit& kit;
+ bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen.
+};