summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2015-02-19 18:05:53 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2015-02-19 18:05:53 +0100
commit7bdc1773013b90d8bf7adcf5907f7e096dd7be6f (patch)
tree3db301f8f33833226d8d4d732efbcbecb4717881 /src
parentd38c843e13d411ab822b939a477dc6d6bc7fe5b2 (diff)
parentb16f9d793d6e3e4ab88efff112f2fca30ed87be5 (diff)
Merge branch 'master' into lv2opt
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/drumgizmo.cc34
-rw-r--r--src/drumgizmo.h13
-rw-r--r--src/instrumentparser.cc8
-rw-r--r--src/nolocale.h78
5 files changed, 115 insertions, 19 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index b9b0aae..df9f4ca 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -23,6 +23,7 @@ EXTRA_DIST = \
midimapparser.h \
midimapper.h \
mutex.h \
+ nolocale.h \
path.h \
powerlist.h \
rangemap.h \
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index 71043af..6fd454e 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -43,10 +43,13 @@
#include "configuration.h"
#include "configparser.h"
+#include "nolocale.h"
+
DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i)
: MessageReceiver(MSGRCV_ENGINE),
loader(), oe(o), ie(i)
{
+ is_stopping = false;
}
DrumGizmo::~DrumGizmo()
@@ -84,10 +87,8 @@ bool DrumGizmo::loadkit(std::string file)
return true;
}
-bool DrumGizmo::init(bool preload)
+bool DrumGizmo::init()
{
- (void)preload;
-
if(!ie->init(kit.instruments)) return false;
if(!oe->init(kit.channels)) return false;
@@ -255,7 +256,23 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
}
if(evs[e].type == TYPE_STOP) {
- return false;
+ 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;
+ }
}
}
@@ -409,12 +426,13 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t *s, size_t sz)
evt->rampdown--;
}
+ if(evt->rampdown == 0) {
+ removeevent = true; // Down ramp done. Remove event.
+ }
}
if(evt->t >= af->size) {
removeevent = true;
-// LAZYLOAD:
-// loader.reset(af);
}
}
@@ -455,7 +473,7 @@ void DrumGizmo::setSamplerate(int samplerate)
std::string float2str(float a)
{
char buf[256];
- sprintf(buf, "%f", a);
+ snprintf_nol(buf, sizeof(buf) - 1, "%f", a);
return buf;
}
@@ -467,7 +485,7 @@ std::string bool2str(bool a)
float str2float(std::string a)
{
if(a == "") return 0.0;
- return atof(a.c_str());
+ return atof_nol(a.c_str());
}
std::string DrumGizmo::configString()
diff --git a/src/drumgizmo.h b/src/drumgizmo.h
index 138e61c..f8d45f5 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -51,14 +51,13 @@
class DrumGizmo : public MessageReceiver {
public:
- DrumGizmo(AudioOutputEngine *outputengine,
- AudioInputEngine *inputengine);
+ DrumGizmo(AudioOutputEngine *outputengine, AudioInputEngine *inputengine);
virtual ~DrumGizmo();
bool loadkit(std::string kitfile);
- bool init(bool preload = true);
-
+ bool init();
+
/**
* @param endpos number of samples to process, -1 := never stop.
*/
@@ -68,8 +67,6 @@ public:
void getSamples(int ch, int pos, sample_t *s, size_t sz);
- bool isRunning() { return is_running; }
-
std::string configString();
bool setConfigString(std::string cfg);
@@ -77,12 +74,12 @@ public:
int samplerate();
void setSamplerate(int samplerate);
-
+
private:
DrumKitLoader loader;
Mutex mutex;
- bool is_running;
+ bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen.
AudioOutputEngine *oe;
AudioInputEngine *ie;
diff --git a/src/instrumentparser.cc b/src/instrumentparser.cc
index 0889d74..1f25bc7 100644
--- a/src/instrumentparser.cc
+++ b/src/instrumentparser.cc
@@ -33,6 +33,8 @@
#include "path.h"
+#include "nolocale.h"
+
InstrumentParser::InstrumentParser(const std::string &file, Instrument &i)
: instrument(i)
{
@@ -84,7 +86,7 @@ void InstrumentParser::startTag(std::string name,
if(attr.find("power") == attr.end()) {
power = -1;
} else {
- power = atof(attr["power"].c_str());
+ power = atof_nol(attr["power"].c_str());
DEBUG(instrparser, "Instrument power set to %f\n", power);
}
@@ -136,8 +138,8 @@ void InstrumentParser::startTag(std::string name,
return;
}
- lower = atof(attr["lower"].c_str());
- upper = atof(attr["upper"].c_str());
+ lower = atof_nol(attr["lower"].c_str());
+ upper = atof_nol(attr["upper"].c_str());
}
if(name == "sampleref") {
diff --git a/src/nolocale.h b/src/nolocale.h
new file mode 100644
index 0000000..816dd9c
--- /dev/null
+++ b/src/nolocale.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nolocale.h
+ *
+ * Fri Feb 13 12:48:10 CET 2015
+ * Copyright 2015 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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 2 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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.
+ */
+#ifndef __DRUMGIZMO_NOLOCALE_H__
+#define __DRUMGIZMO_NOLOCALE_H__
+
+#include <locale.h>
+#include <stdarg.h>
+
+static inline double atof_nol(const char *nptr)
+{
+ double res;
+
+ const char *locale = setlocale(LC_NUMERIC, "C");
+
+ res = atof(nptr);
+
+ setlocale(LC_NUMERIC, locale);
+
+ return res;
+}
+
+static inline int sprintf_nol(char *str, const char *format, ...)
+{
+ int ret;
+
+ const char *locale = setlocale(LC_NUMERIC, "C");
+
+ va_list vl;
+ va_start(vl, format);
+ ret = vsprintf(str, format, vl);
+ va_end(vl);
+
+ setlocale(LC_NUMERIC, locale);
+
+ return ret;
+}
+
+static inline int snprintf_nol(char *str, size_t size, const char *format, ...)
+{
+ int ret;
+
+ const char *locale = setlocale(LC_NUMERIC, "C");
+
+ va_list vl;
+ va_start(vl, format);
+ ret = vsnprintf(str, size, format, vl);
+ va_end(vl);
+
+ setlocale(LC_NUMERIC, locale);
+
+ return ret;
+}
+
+#endif/*__DRUMGIZMO_NOLOCALE_H__*/