summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac16
-rw-r--r--drumgizmo/drumgizmoc.cc37
-rw-r--r--man/drumgizmo.155
-rw-r--r--src/Makefile.am1
-rw-r--r--src/drumgizmo.cc10
-rw-r--r--src/drumgizmo.h2
-rw-r--r--src/instrumentparser.cc8
-rw-r--r--src/nolocale.h78
9 files changed, 172 insertions, 39 deletions
diff --git a/Makefile.am b/Makefile.am
index c2579ee..84bcaa7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
AUTOMAKE_OPTIONS = gnu
-SUBDIRS = plugingui tools include src vst lv2 drumgizmo man
-DISTDIRS = plugingui tools include src vst lv2 drumgizmo man
+SUBDIRS = plugingui tools include src vst lv2 drumgizmo man test
+DISTDIRS = plugingui tools include src vst lv2 drumgizmo man test
EXTRA_DIST = \
version.h \
diff --git a/configure.ac b/configure.ac
index 070677c..03a8c31 100644
--- a/configure.ac
+++ b/configure.ac
@@ -87,8 +87,7 @@ AC_ARG_WITH([test],
AS_IF([test x$with_test == xyes],
[AC_MSG_WARN([*** Building unittests!])
- AM_PATH_CPPUNIT(1.9.6)
- AC_CONFIG_FILES(test/Makefile)]
+ AM_PATH_CPPUNIT(1.9.6)]
)
dnl ======================
@@ -390,16 +389,20 @@ AS_IF([test x$enable_resampler == xauto],
AS_IF([test x$enable_resampler == xzita],
[AS_IF([test x$has_zita == xyes],
- [AC_DEFINE(USE_ZITA, [], [zita-resampler is present])],
-
+ [AC_DEFINE(USE_ZITA, [], [zita-resampler is present])
+ SAMPLERATE_CFLAGS=""
+ SAMPLERATE_LIBS=""
+ ],
[AC_MSG_ERROR([*** zita-resampler library or headers not found. Set ZITA_LDFLAGS or ZITA_CPPFLAGS to add searchpath.])]
)]
)
AS_IF([test x$enable_resampler == xsrc],
[AS_IF([test x$has_src == xyes],
- [AC_DEFINE(USE_SRC, [], [libsamplerate is present])],
-
+ [AC_DEFINE(USE_SRC, [], [libsamplerate is present])
+ ZITA_CPPFLAGS=""
+ ZITA_LIBS=""
+ ],
[AC_MSG_ERROR([*** Missing libsamplerate.])]
)]
)
@@ -538,6 +541,7 @@ AC_CONFIG_FILES(
plugingui/Makefile
include/Makefile
man/Makefile
+ test/Makefile
drumgizmo/Makefile
drumgizmo/input/Makefile
drumgizmo/input/dummy/Makefile
diff --git a/drumgizmo/drumgizmoc.cc b/drumgizmo/drumgizmoc.cc
index 4bfd608..6315491 100644
--- a/drumgizmo/drumgizmoc.cc
+++ b/drumgizmo/drumgizmoc.cc
@@ -56,10 +56,10 @@ static const char copyright_str[] =
static const char usage_str[] =
"Usage: %s [options] drumkitfile\n"
"Options:\n"
-" -p, --preload Load entire kit audio files into memory (uses ALOT of memory).\n"
+" -a, --async-load Load drumkit in the background and start the engine immediately.\n"
" -i, --inputengine dummy|test|jackmidi|midifile Use said event input engine.\n"
" -I, --inputparms parmlist Set input engine parameters.\n"
-" -o, --outputengine dummy|alsa|jack|sndfile Use said audio output engine.\n"
+" -o, --outputengine dummy|alsa|jackaudio|sndfile Use said audio output engine.\n"
" -O, --outputparms parmlist Set output engine parameters.\n"
" -e, --endpos Number of samples to process, -1: infinite.\n"
" -v, --version Print version information and exit.\n"
@@ -84,11 +84,14 @@ static const char usage_str[] =
"\n"
;
-CliMain::CliMain() : MessageReceiver(MSGRCV_UI), loading(false)
-{}
+CliMain::CliMain() : MessageReceiver(MSGRCV_UI)
+{
+ loading = true; // Block by default
+}
CliMain::~CliMain()
-{}
+{
+}
void CliMain::handleMessage(Message *msg)
{
@@ -114,13 +117,13 @@ int CliMain::run(int argc, char *argv[])
std::string inputengine;
std::string iparms;
std::string oparms;
- bool preload = false;
+ bool async = false;
int endpos = -1;
int option_index = 0;
while(1) {
static struct option long_options[] = {
- {"preload", no_argument, 0, 'p'},
+ {"async-load", no_argument, 0, 'a'},
{"inputengine", required_argument, 0, 'i'},
{"inputparms", required_argument, 0, 'I'},
{"outputengine", required_argument, 0, 'o'},
@@ -152,7 +155,7 @@ int CliMain::run(int argc, char *argv[])
case 'o':
outputengine = optarg;
if(outputengine == "help") {
- printf("Available output engines: alsa, jack, sndfile.\n");
+ printf("Available output engines: alsa, jackaudio, wavfile.\n");
return 0;
}
break;
@@ -161,8 +164,8 @@ int CliMain::run(int argc, char *argv[])
oparms = optarg;
break;
- case 'p':
- preload = true;
+ case 'a':
+ async = true;
break;
case 'e':
@@ -294,7 +297,7 @@ int CliMain::run(int argc, char *argv[])
printf("Loading drumkit, this may take a while...");
fflush(stdout);
loading = true;
- while (loading) {
+ while(async == false && loading) {
#ifdef WIN32
SleepEx(500, FALSE);
#else
@@ -308,7 +311,7 @@ int CliMain::run(int argc, char *argv[])
gizmo.setSamplerate(oe->samplerate());
- if(!gizmo.init(preload)) {
+ if(!gizmo.init()) {
printf("Failed init engine.\n");
return 1;
}
@@ -325,15 +328,9 @@ int CliMain::run(int argc, char *argv[])
int main(int argc, char *argv[])
{
+ CliMain cli;
- CliMain* cli = new CliMain();
- if (cli == NULL) {
- printf("Could not initialize command line client\n");
- return 1;
- }
-
- cli->run(argc, argv);
- delete cli;
+ cli.run(argc, argv);
return 0;
diff --git a/man/drumgizmo.1 b/man/drumgizmo.1
index 36968fd..3472ddc 100644
--- a/man/drumgizmo.1
+++ b/man/drumgizmo.1
@@ -15,7 +15,7 @@ DrumGizmo uses an open drumkit file format, allowing the community to create the
.SH "OPTIONS"
.TP
\fB-p, --preload
-Load entire kit audio files into memory (uses ALOT of memory).
+Load entire kit audio files into memory (uses A LOT of memory).
.TP
\fB-i, --inputengine \fR{dummy|test|jackmidi|midifile}
Use said event input engine.
@@ -23,12 +23,55 @@ Use said event input engine.
\fB-I, --inputparms parmlist
Set input engine parameters.
.TP
-\fB-o, --outputengine \fR{dummy|alsa|jack|sndfile}
+.SS
+\fBjackmidi:
+midimap=<midimapfile>
+.TP
+.SS
+\fBmidifile:
+file=<midifile>, speed=<tempo> (default 1.0)
+.br
+track=<miditrack> (default -1, all tracks)
+.br
+midimap=<midimapfile>, loop=<true|false>
+.TP
+.SS
+\fBtest:
+p=<hit_propability> (default 0.1)
+.br
+instr=<instrument> (default -1, random instrument)
+.br
+len=<seconds> (default -1, forever)
+.TP
+.SS
+\fBdummy:
+.TP
+\fB-o, --outputengine \fR{dummy|alsa|jackaudio|wavfile}
Use said audio output engine.
.TP
\fB-O, --outputparms parmlist
Set output engine parameters.
.TP
+.SS
+\fBalsa:
+dev=<device> (default 'default')
+.br
+frames=<frames> (default 32)
+.br
+srate=<samplerate> (default 441000)
+.TP
+.SS
+\fBwavfile:
+file=<filename> (default 'output')
+.br
+srate=<samplerate> (default 44100)
+.TP
+.SS
+\fBjackaudio:
+.TP
+.SS
+\fBdummy:
+.TP
\fB-e, --endpos
Number of samples to process, -1: infinite.
.TP
@@ -40,6 +83,14 @@ Print command line help and exit.
.TP
\fB\fIdrumkitfile
Load the drumkitfile.
+.El
+.Sh "EXAMPLES"
+Render midifile to wav files:
+.Bb -literal -offset indent -compact
+drumgizmo -p -i midifile -I file=file.mid,midimap=midimap.xml -o wavfile -O file=file.wav drumkit.xml
+.Ed
+Recieve midi from Jack and send audio output to speakers:
+drumgizmo -p -i jackmidi -I midimap=midimap.xml -o jackaudio drumkit.xml
.SH "BUGS"
Report bugs to http://www.drumgizmo.org/wiki/doku.php?id=bugs.
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 7fded57..2f2232c 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)
@@ -85,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;
@@ -468,7 +468,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;
}
@@ -480,7 +480,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 403b43e..f8d45f5 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -56,7 +56,7 @@ public:
bool loadkit(std::string kitfile);
- bool init(bool preload = true);
+ bool init();
/**
* @param endpos number of samples to process, -1 := never stop.
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__*/