diff options
-rw-r--r-- | src/Makefile.am.drumgizmo | 1 | ||||
-rw-r--r-- | src/drumgizmo.cc | 128 | ||||
-rw-r--r-- | src/drumgizmo.h | 3 | ||||
-rw-r--r-- | src/inputprocessor.cc | 165 | ||||
-rw-r--r-- | src/inputprocessor.h | 44 |
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. +}; |