From 4e216965d026c7db0af5626d07657db3c5421351 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 8 Feb 2015 10:44:33 +0100 Subject: Delay TYPE_STOP event until the last active samples are done playing. --- src/drumgizmo.cc | 19 ++++++++++++++++++- src/drumgizmo.h | 11 ++++------- 2 files changed, 22 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 6b48cda..7fded57 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -47,6 +47,7 @@ DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i) : MessageReceiver(MSGRCV_ENGINE), loader(), oe(o), ie(i) { + is_stopping = false; } DrumGizmo::~DrumGizmo() @@ -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; + } } } diff --git a/src/drumgizmo.h b/src/drumgizmo.h index 138e61c..403b43e 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); - + /** * @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; -- cgit v1.2.3 From aec6b3361b3de8391177261469da6edafd39a080 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 12:56:43 +0100 Subject: Fix locale sensitive float parsing/printing. --- src/Makefile.am | 1 + src/drumgizmo.cc | 6 ++-- src/instrumentparser.cc | 8 +++-- src/nolocale.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 src/nolocale.h (limited to 'src') 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 6b48cda..5d7de70 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -43,6 +43,8 @@ #include "configuration.h" #include "configparser.h" +#include "nolocale.h" + DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i) : MessageReceiver(MSGRCV_ENGINE), loader(), oe(o), ie(i) @@ -451,7 +453,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; } @@ -463,7 +465,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/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..ac83dda --- /dev/null +++ b/src/nolocale.h @@ -0,0 +1,85 @@ +/* -*- 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 +#include + +static inline double atof_nol(const char *nptr) +{ + double res; + locale_t new_locale, prev_locale; + + new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); + prev_locale = uselocale(new_locale); + + res = atof(nptr); + + uselocale(prev_locale); + freelocale(new_locale); + + return res; +} + +static inline int sprintf_nol(char *str, const char *format, ...) +{ + locale_t new_locale, prev_locale; + + new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); + prev_locale = uselocale(new_locale); + + va_list vl; + va_start(vl, format); + int ret = vsprintf(str, format, vl); + va_end(vl); + + uselocale(prev_locale); + freelocale(new_locale); + + return ret; +} + +static inline int snprintf_nol(char *str, size_t size, const char *format, ...) +{ + locale_t new_locale, prev_locale; + + new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); + prev_locale = uselocale(new_locale); + + va_list vl; + va_start(vl, format); + int ret = vsnprintf(str, size, format, vl); + va_end(vl); + + uselocale(prev_locale); + freelocale(new_locale); + + return ret; +} + +#endif/*__DRUMGIZMO_NOLOCALE_H__*/ -- cgit v1.2.3 From 5be85a677f8f228614d8e449674c8fe3161b3d71 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 13:54:14 +0100 Subject: Possible win32 fix for missing locale_t type. --- src/nolocale.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index ac83dda..f8a5303 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -30,6 +30,10 @@ #include #include +#ifdef WIN32 +typedef _locale_t locale_t; +#endif + static inline double atof_nol(const char *nptr) { double res; -- cgit v1.2.3 From da2d01a87c911f0db602e8e4376bb485fdfc31f1 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 14:59:09 +0100 Subject: Possible win32 fix for missing locale_t type - part2. --- src/nolocale.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index f8a5303..1b71ef2 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -30,13 +30,20 @@ #include #include -#ifdef WIN32 -typedef _locale_t locale_t; -#endif - static inline double atof_nol(const char *nptr) { double res; + +#ifdef WIN32 + + _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + + res = _atof_l(nptr, l); + + _free_locale(l); + +#else/*WIN32*/ + locale_t new_locale, prev_locale; new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); @@ -47,11 +54,28 @@ static inline double atof_nol(const char *nptr) uselocale(prev_locale); freelocale(new_locale); +#endif/*WIN32*/ + return res; } static inline int sprintf_nol(char *str, const char *format, ...) { + int ret; + +#ifdef WIN32 + + _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + + va_list vl; + va_start(vl, format); + ret = _vsprintf_l(str, format, vl, l); + va_end(vl); + + _free_locale(l); + +#else/*WIN32*/ + locale_t new_locale, prev_locale; new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); @@ -59,17 +83,34 @@ static inline int sprintf_nol(char *str, const char *format, ...) va_list vl; va_start(vl, format); - int ret = vsprintf(str, format, vl); + ret = vsprintf(str, format, vl); va_end(vl); uselocale(prev_locale); freelocale(new_locale); +#endif/*WIN32*/ + return ret; } static inline int snprintf_nol(char *str, size_t size, const char *format, ...) { + int ret; + +#ifdef WIN32 + + _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + + va_list vl; + va_start(vl, format); + ret = vsnprintf(str, size, format, vl, l); + va_end(vl); + + _free_locale(l); + +#else/*WIN32*/ + locale_t new_locale, prev_locale; new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); @@ -77,12 +118,14 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) va_list vl; va_start(vl, format); - int ret = vsnprintf(str, size, format, vl); + ret = vsnprintf(str, size, format, vl); va_end(vl); uselocale(prev_locale); freelocale(new_locale); +#endif/*WIN32*/ + return ret; } -- cgit v1.2.3 From 92abe7381596a5baaf62eec3e55172678ed1f1dd Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 15:07:25 +0100 Subject: Possible win32 fix for missing locale_t type - part3. --- src/nolocale.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index 1b71ef2..3d8d50d 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -36,7 +36,7 @@ static inline double atof_nol(const char *nptr) #ifdef WIN32 - _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + _locale_t l = _create_locale(LC_NUMERIC, "C"); res = _atof_l(nptr, l); @@ -65,7 +65,7 @@ static inline int sprintf_nol(char *str, const char *format, ...) #ifdef WIN32 - _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + _locale_t l = _create_locale(LC_NUMERIC, "C"); va_list vl; va_start(vl, format); @@ -100,7 +100,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) #ifdef WIN32 - _locale_t l = _create_locale(LC_NUMERIC_MASK, "C"); + _locale_t l = _create_locale(LC_NUMERIC, "C"); va_list vl; va_start(vl, format); -- cgit v1.2.3 From cc4205dd6d9b6024d4bedf7e58abb1b73f276def Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 15:11:34 +0100 Subject: Possible win32 fix for missing locale_t type - part4. --- src/nolocale.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index 3d8d50d..18ae03f 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) va_list vl; va_start(vl, format); - ret = vsnprintf(str, size, format, vl, l); + ret = vsnprintf_l(str, size, format, vl, l); va_end(vl); _free_locale(l); -- cgit v1.2.3 From 7a1136d0efdc71251104dd2f4cbbda03887e0e9d Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 15:14:27 +0100 Subject: Possible win32 fix for missing locale_t type - part5. --- src/nolocale.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index 18ae03f..59489cd 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) va_list vl; va_start(vl, format); - ret = vsnprintf_l(str, size, format, vl, l); + ret = _vsnprintf_l(str, size, format, vl, l); va_end(vl); _free_locale(l); -- cgit v1.2.3 From f28bf71b7c105da7cd0a7db67e21bbceb5df8a1b Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 15:21:07 +0100 Subject: Possible win32 fix for missing locale_t type - part6 (this is getting a bit embarrasing...). --- src/nolocale.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index 59489cd..d61abbb 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -69,7 +69,7 @@ static inline int sprintf_nol(char *str, const char *format, ...) va_list vl; va_start(vl, format); - ret = _vsprintf_l(str, format, vl, l); + ret = _vsprintf_l(str, format, l, vl); va_end(vl); _free_locale(l); @@ -104,7 +104,7 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) va_list vl; va_start(vl, format); - ret = _vsnprintf_l(str, size, format, vl, l); + ret = _vsnprintf_l(str, size, format, l, vl); va_end(vl); _free_locale(l); -- cgit v1.2.3 From 3d695f697e7230f3b4fa8922847b20eae632226f Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 13 Feb 2015 18:22:45 +0100 Subject: More portable way of switching locale. --- src/nolocale.h | 68 ++++++---------------------------------------------------- 1 file changed, 7 insertions(+), 61 deletions(-) (limited to 'src') diff --git a/src/nolocale.h b/src/nolocale.h index d61abbb..816dd9c 100644 --- a/src/nolocale.h +++ b/src/nolocale.h @@ -34,27 +34,11 @@ static inline double atof_nol(const char *nptr) { double res; -#ifdef WIN32 + const char *locale = setlocale(LC_NUMERIC, "C"); - _locale_t l = _create_locale(LC_NUMERIC, "C"); + res = atof(nptr); - res = _atof_l(nptr, l); - - _free_locale(l); - -#else/*WIN32*/ - - locale_t new_locale, prev_locale; - - new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); - prev_locale = uselocale(new_locale); - - res = atof(nptr); - - uselocale(prev_locale); - freelocale(new_locale); - -#endif/*WIN32*/ + setlocale(LC_NUMERIC, locale); return res; } @@ -63,33 +47,14 @@ static inline int sprintf_nol(char *str, const char *format, ...) { int ret; -#ifdef WIN32 - - _locale_t l = _create_locale(LC_NUMERIC, "C"); - - va_list vl; - va_start(vl, format); - ret = _vsprintf_l(str, format, l, vl); - va_end(vl); - - _free_locale(l); - -#else/*WIN32*/ - - locale_t new_locale, prev_locale; - - new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); - prev_locale = uselocale(new_locale); + const char *locale = setlocale(LC_NUMERIC, "C"); va_list vl; va_start(vl, format); ret = vsprintf(str, format, vl); va_end(vl); - uselocale(prev_locale); - freelocale(new_locale); - -#endif/*WIN32*/ + setlocale(LC_NUMERIC, locale); return ret; } @@ -98,33 +63,14 @@ static inline int snprintf_nol(char *str, size_t size, const char *format, ...) { int ret; -#ifdef WIN32 - - _locale_t l = _create_locale(LC_NUMERIC, "C"); - - va_list vl; - va_start(vl, format); - ret = _vsnprintf_l(str, size, format, l, vl); - va_end(vl); - - _free_locale(l); - -#else/*WIN32*/ - - locale_t new_locale, prev_locale; - - new_locale = newlocale(LC_NUMERIC_MASK, "C", NULL); - prev_locale = uselocale(new_locale); + const char *locale = setlocale(LC_NUMERIC, "C"); va_list vl; va_start(vl, format); ret = vsnprintf(str, size, format, vl); va_end(vl); - uselocale(prev_locale); - freelocale(new_locale); - -#endif/*WIN32*/ + setlocale(LC_NUMERIC, locale); return ret; } -- cgit v1.2.3 From b16f9d793d6e3e4ab88efff112f2fca30ed87be5 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Tue, 17 Feb 2015 19:29:11 +0100 Subject: Remove events from activeevents when ramped down. --- src/drumgizmo.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 2f2232c..ddb6358 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -422,12 +422,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); } } -- cgit v1.2.3