From cdbae7738c35268fd9a208be0618c4ea11475935 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Mon, 23 Jan 2012 20:33:17 +0100 Subject: New config interface (xml). Instruments now contains pointers (fix memleak). --- src/.gitignore | 3 ++- src/Makefile.am.drumgizmo | 20 ++++++++++++++++++++ src/audiooutputengine.h | 3 +++ src/drumgizmo.cc | 30 +++++++++++------------------- src/drumgizmo.h | 8 ++++++++ src/instrumentparser.cc | 2 +- src/saxparser.cc | 12 ++++++++++++ src/saxparser.h | 3 ++- 8 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 src/Makefile.am.drumgizmo (limited to 'src') diff --git a/src/.gitignore b/src/.gitignore index 195bd0f..f3a3feb 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1 +1,2 @@ -Makefile.am.test \ No newline at end of file +Makefile.am.test +*.log \ No newline at end of file diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo new file mode 100644 index 0000000..98f1b82 --- /dev/null +++ b/src/Makefile.am.drumgizmo @@ -0,0 +1,20 @@ +DRUMGIZMO_SOURCES = \ + $(top_srcdir)/src/audiofile.cc \ + $(top_srcdir)/src/channel.cc \ + $(top_srcdir)/src/channelmixer.cc \ + $(top_srcdir)/src/configuration.cc \ + $(top_srcdir)/src/drumgizmo.cc \ + $(top_srcdir)/src/drumkit.cc \ + $(top_srcdir)/src/drumkitparser.cc \ + $(top_srcdir)/src/events.cc \ + $(top_srcdir)/src/instrument.cc \ + $(top_srcdir)/src/instrumentparser.cc \ + $(top_srcdir)/src/midimapparser.cc \ + $(top_srcdir)/src/midimapper.cc \ + $(top_srcdir)/src/mutex.cc \ + $(top_srcdir)/src/path.cc \ + $(top_srcdir)/src/sample.cc \ + $(top_srcdir)/src/saxparser.cc \ + $(top_srcdir)/src/velocity.cc + +DRUMGIZMO_LIBS = $(SNDFILE_LIBS) $(EXPAT_LIBS) \ No newline at end of file diff --git a/src/audiooutputengine.h b/src/audiooutputengine.h index 864ecc5..d2d2310 100644 --- a/src/audiooutputengine.h +++ b/src/audiooutputengine.h @@ -45,6 +45,9 @@ public: virtual void pre(size_t nsamples) = 0; virtual void run(int ch, sample_t *samples, size_t nsamples) = 0; virtual void post(size_t nsamples) = 0; + + // Reimplement this if you wish to use internal buffer directly. + virtual sample_t *getBuffer(int ch) { return NULL; } }; #endif/*__DRUMGIZMO_AUDIOOUTPUTENGINE_H__*/ diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 5b48e0c..7af13d2 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -121,7 +121,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples) */ if(d < (int)kit.instruments.size()) { - i = &kit.instruments[d]; + i = kit.instruments[d]; } if(i == NULL) { @@ -203,16 +203,8 @@ void DrumGizmo::run() } #ifdef SSE -#define SZ 16 -typedef float v4sf __attribute__ ((vector_size (sizeof(float)*SZ))); - -union f4vector -{ - v4sf v; - float f[SZ]; -}; -#else/*SSE*/ -#define SZ 0 +#define N 8 +typedef float vNsf __attribute__ ((vector_size(sizeof(float)*N))); #endif/*SSE*/ void DrumGizmo::getSamples(int ch, int pos, sample_t *s, size_t sz) @@ -238,13 +230,13 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t *s, size_t sz) if(evt->t + end - n > af->size) end = af->size - evt->t + n; #ifdef SSE - size_t optend = ((end - n) / SZ) * SZ; - for(; n < optend; n+=SZ) { - *(v4sf*)&(s[n]) += *(v4sf*)&(af->data[evt->t]); - evt->t += SZ; + size_t optend = ((end - n) / N) * N + n; + for(; n < optend; n += N) { + *(vNsf*)&(s[n]) += *(vNsf*)&(af->data[evt->t]); + evt->t += N; } #endif - + //printf("n: %d end: %d, diff: %d", n, end, end - n); fflush(stdout); for(; n < end; n++) { s[n] += af->data[evt->t]; evt->t++; @@ -386,7 +378,7 @@ void DrumGizmo::setConfigString(std::string cfg) } #ifdef TEST_DRUMGIZMO -//deps: instrument.cc sample.cc channel.cc audiofile.cc drumkitparser.cc configuration.cc saxparser.cc instrumentparser.cc path.cc +//deps: instrument.cc sample.cc channel.cc audiofile.cc drumkit.cc drumkitparser.cc configuration.cc saxparser.cc instrumentparser.cc path.cc //cflags: $(SNDFILE_CFLAGS) $(EXPAT_CFLAGS) -I../include -DSSE -msse -msse2 -msse3 //libs: $(SNDFILE_LIBS) $(EXPAT_LIBS) #include "test.h" @@ -511,8 +503,8 @@ TEST_BEGIN; createTestKit(); size_t size = PCM_SIZE; -for(size_t chunksz = 1; chunksz < offset + size + padding + 1; chunksz++) { - +//for(size_t chunksz = 1; chunksz < size + 1; chunksz++) { +size_t chunksz = 16; { sample_t samples[chunksz]; for(size_t offset = 0; offset < chunksz + size + 1; offset++) { diff --git a/src/drumgizmo.h b/src/drumgizmo.h index 2f85d51..a3ad3ca 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -46,6 +46,7 @@ public: ~DrumGizmo(); bool loadkit(const std::string &kitfile); + std::string drumkitfile(); bool init(bool preload = true); @@ -57,6 +58,11 @@ public: bool isRunning() { return is_running; } + std::string configString(); + void setConfigString(std::string cfg); + + std::string midimapfile; + private: bool is_running; @@ -71,6 +77,8 @@ private: public: #endif DrumKit kit; + + std::string kitfile; }; diff --git a/src/instrumentparser.cc b/src/instrumentparser.cc index 5198959..fdeb934 100644 --- a/src/instrumentparser.cc +++ b/src/instrumentparser.cc @@ -35,7 +35,7 @@ InstrumentParser::InstrumentParser(const std::string &file, Instrument &i) : instrument(i) { s = NULL; - printf("Parsing instrument in %s\n", file.c_str()); + // printf("Parsing instrument in %s\n", file.c_str()); path = getPath(file); fd = fopen(file.c_str(), "r"); if(!fd) return; diff --git a/src/saxparser.cc b/src/saxparser.cc index 1090ef3..b6bfa7c 100644 --- a/src/saxparser.cc +++ b/src/saxparser.cc @@ -108,6 +108,18 @@ int SAXParser::parse() return 0; } +int SAXParser::parse(std::string buffer) +{ + if(!XML_Parse(p, buffer.c_str(), buffer.length(), true)) { + parseError((char*)buffer.c_str(), buffer.length(), + XML_ErrorString(XML_GetErrorCode(p)), + (int)XML_GetCurrentLineNumber(p)); + return 1; + } + + return 0; +} + void SAXParser::parseError(char *buf, size_t len, std::string error, int lineno) { fprintf(stderr, "SAXParser error at line %d: %s\n", lineno, error.c_str()); diff --git a/src/saxparser.h b/src/saxparser.h index c3700bf..aff90d7 100644 --- a/src/saxparser.h +++ b/src/saxparser.h @@ -39,7 +39,8 @@ public: virtual ~SAXParser(); int parse(); - + int parse(std::string buffer); + virtual void characterData(std::string &data) {} virtual void startTag(std::string name, attr_t attr) {} virtual void endTag(std::string name) {} -- cgit v1.2.3