From be628876b0515ceee40946e923771e1b40d6641b Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 26 Jan 2013 08:49:35 +0100 Subject: Lots of integration work with GUI, as well as config storage. --- vst/Makefile.mingw32 | 67 ++++++++++++++++++++++-------- vst/drumgizmo_vst.cc | 113 +++++++++++++++++++++++++++++++++++++++++++++------ vst/drumgizmo_vst.h | 7 +++- vst/input_vst.cc | 31 ++++++++++---- vst/input_vst.h | 3 ++ 5 files changed, 180 insertions(+), 41 deletions(-) diff --git a/vst/Makefile.mingw32 b/vst/Makefile.mingw32 index e4f9127..8fd99b1 100644 --- a/vst/Makefile.mingw32 +++ b/vst/Makefile.mingw32 @@ -4,7 +4,9 @@ VST_SRC = \ ${VST_SRC_BASE}/audioeffectx.cpp \ ${VST_SRC_BASE}/audioeffect.cpp \ ${VST_SRC_BASE}/vstplugmain.cpp +VST_CFLAGS=-I$(VST_BASE) +top_srcdir=.. DG_BASE = .. DG_SRC = \ ${DG_BASE}/src/audiofile.cc \ @@ -13,6 +15,7 @@ DG_SRC = \ ${DG_BASE}/src/channelmixer.cc \ ${DG_BASE}/src/drumgizmo.cc \ ${DG_BASE}/src/drumkit.cc \ + ${DG_BASE}/src/drumkitloader.cc \ ${DG_BASE}/src/drumkitparser.cc \ ${DG_BASE}/src/events.cc \ ${DG_BASE}/src/instrument.cc \ @@ -23,8 +26,10 @@ DG_SRC = \ ${DG_BASE}/src/path.cc \ ${DG_BASE}/src/sample.cc \ ${DG_BASE}/src/saxparser.cc \ + ${DG_BASE}/src/semaphore.cc \ + ${DG_BASE}/src/thread.cc \ ${DG_BASE}/src/velocity.cc -DG_FLAGS = -I../include -I../src -DSSE -msse -msse2 +DG_CFLAGS = -I../include -I../src -DSSE -msse -msse2 GUI_SRC = \ $(DG_BASE)/plugingui/plugingui.cc \ @@ -33,6 +38,7 @@ GUI_SRC = \ $(DG_BASE)/plugingui/eventhandler.cc \ $(DG_BASE)/plugingui/font.cc \ $(DG_BASE)/plugingui/window.cc \ + $(DG_BASE)/plugingui/nativewindow_win32.cc \ $(DG_BASE)/plugingui/widget.cc \ $(DG_BASE)/plugingui/colour.cc \ $(DG_BASE)/plugingui/painter.cc \ @@ -44,42 +50,67 @@ GUI_SRC = \ $(DG_BASE)/plugingui/checkbox.cc \ $(DG_BASE)/plugingui/slider.cc -GUI_FLAGS=-lgdi32 -I../plugingui +GUI_CFLAGS=-I../plugingui -DUSE_THREAD +GUI_LIBS=-lgdi32 -lsetupapi -lws2_32 +DBG_SRC = \ + $(top_srcdir)/hugin/hugin.c \ + $(top_srcdir)/hugin/hugin_syslog.c + +DBG_CFLAGS=-I../hugin -DWITH_HUG_SYSLOG -DWITH_HUG_MUTEX # # http://old.nabble.com/using-VC%2B%2B-.lib-with-mingw-td23151303.html # Given `-lfoo', the win32 build of GNU ld will search for libfoo.a and foo.lib # EXPAT_BASE=c:/expat -EXPAT_FLAGS=-I${EXPAT_BASE}/Source/lib -L${EXPAT_BASE}/Bin -llibexpat +EXPAT_CFLAGS=-I${EXPAT_BASE}/Source/lib +EXPAT_LIBS=-L${EXPAT_BASE}/Bin -llibexpat SNDFILE_BASE=c:/libsndfile -SNDFILE_FLAGS=-I${SNDFILE_BASE}/include -L${SNDFILE_BASE}/lib -llibsndfile-1 +SNDFILE_CFLAGS=-I${SNDFILE_BASE}/include +SNDFILE_LIBS=-L${SNDFILE_BASE}/lib -llibsndfile-1 SRC = \ drumgizmo_vst.cc \ input_vst.cc \ output_vst.cc -all: - g++ -g -Wall -DWIN32 ${DG_FLAGS} -I${VST_BASE} ${DG_SRC} ${VST_SRC} ${SRC} ${GUI_SRC} ${GUI_FLAGS} ${EXPAT_FLAGS} ${SNDFILE_FLAGS} -shared -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a - -clean: - rm -f drumgizmo_vst.dll libdrumgizmo_vst.a - -#LDFLAGS="-g -Wall -DWIN32 ${DG_FLAGS} ${EXPAT_FLAGS} ${SNDFILE_FLAGS} -I${VST_BASE}" -#CFLAGS=$(LDFLAGS) -#SOURCES="$(DG_SRC) $(VST_SRC) $(SRC)" -#OBJECTS=$(SOURCES:.cc=.o) +####################### +# +#CXXFLAGS=-DWIN32 $(EXPAT_CFLAGS) $(SNDFILE_CFLAGS) $(DG_CFLAGS) $(GUI_CFLAGS) $(DBG_CFLAGS) $(VST_CFLAGS) +#CFLAGS=$(CXXFLAGS) +#LDFLAGS=$(EXPAT_LIBS) $(SNDFILE_LIBS) $(GUI_LIBS) $(DBG_LIBS) +# +#C_SOURCES=$(DBG_SRC) +#CXX_SOURCES=$(GUI_SRC) $(DG_SRC) +#CPP_SOURCES=$(VST_SRC) # -#all: drumgizmo_vst.dll +#OBJECTS=$(CXX_SOURCES:.cc=.o) $(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o) +#all: $(CXX_SOURCES) $(CPP_SOURCES) $(C_SOURCES) drumgizmo_vst.dll # #drumgizmo_vst.dll: $(OBJECTS) -# g++ $(OBJECTS) $(LDFLAGS) -shared -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a +# g++ $(CXXFLAGS) $(OBJECTS) $(LDFLAGS) -shared -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a # #%.o: %.cc -# g++ -c $(CFLAGS) $< -o $@ +# g++ -O3 -c $(CXXFLAGS) $(LDFLAGS) $< -o $(notdir $@) +# +#%.o: %.cpp +# g++ -O3 -c $(CXXFLAGS) $(LDFLAGS) $< -o $(notdir $@) +# +#%.o: %.c +# gcc -O3 -c $(CFLAGS) $(LDFLAGS) $< -o $@ # #clean: -# del -rf *.o drumgizmo_vst.dll libdrumgizmo_vst.a +# del -f $(notdir $(OBJECTS)) drumgizmo_vst.dll libdrumgizmo_vst.a +# +######################## + + +all: + gcc $(DBG_CFLAGS) $(top_srcdir)/hugin/hugin.c -c + gcc $(DBG_CFLAGS) $(top_srcdir)/hugin/hugin_syslog.c -c + g++ -g -Wall -DWIN32 $(DBG_CFLAGS) $(DG_CFLAGS) $(DG_LIBS) $(VST_CFLAGS) hugin.o hugin_syslog.o $(DG_SRC) $(VST_SRC) ${SRC} ${GUI_SRC} ${GUI_CFLAGS} $(GUI_LIBS) $(EXPAT_CFLAGS) $(EXPAT_LIBS) $(SNDFILE_CFLAGS) $(SNDFILE_LIBS) -shared -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a + +clean: + del -f drumgizmo_vst.dll libdrumgizmo_vst.a diff --git a/vst/drumgizmo_vst.cc b/vst/drumgizmo_vst.cc index 381f2f9..4d3ce9f 100644 --- a/vst/drumgizmo_vst.cc +++ b/vst/drumgizmo_vst.cc @@ -29,12 +29,26 @@ #include "constants.h" #include +#include + +#include #define NUM_PROGRAMS 0 #define NUM_PARAMS 0 +static void midimapHandler(void *ptr, const char* file) +{ + DEBUG(vst, "midimapHandler\n"); + DrumGizmoVst* effect = (DrumGizmoVst*)ptr; + InputVST *input = effect->input; + DrumGizmo *drumgizmo = effect->drumgizmo; + drumgizmo->midimapfile = file; + input->loadMidiMap(file); +} + DGEditor::DGEditor(AudioEffect* effect) { + DEBUG(dgeditor, "Create DGEditor\n"); dgeff = (DrumGizmoVst*)effect; plugingui = NULL; drumgizmo = dgeff->drumgizmo; @@ -42,44 +56,70 @@ DGEditor::DGEditor(AudioEffect* effect) bool DGEditor::open(void* ptr) { - if(!plugingui) plugingui = new PluginGUI(drumgizmo); - plugingui->show(); + DEBUG(dgeditor, "open GUI (new PluginGUI)\n"); + if(plugingui) delete plugingui; + + plugingui = new PluginGUI(drumgizmo); + plugingui->setChangeMidimapCallback(midimapHandler, dgeff); + + // plugingui->show(); return true; } void DGEditor::close() { - plugingui->hide(); - delete plugingui; + DEBUG(dgeditor, "close GUI (delete PluginGUI)\n"); + // plugingui->hide(); + if(plugingui) delete plugingui; plugingui = NULL; } bool DGEditor::isOpen() { - return plugingui != NULL;; + DEBUG(vst, "isOpen\n"); + return plugingui != NULL; } void DGEditor::idle() { - if(plugingui) plugingui->processEvents(); + DEBUG(vst, "idle\n"); + // if(plugingui) plugingui->processEvents(); } AudioEffect* createEffectInstance(audioMasterCallback audioMaster) { + DEBUG(vst, "createEffectInstance\n"); return new DrumGizmoVst(audioMaster); } DrumGizmoVst::DrumGizmoVst(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, NUM_PROGRAMS, NUM_PARAMS) { + hug_status_t status = hug_init(HUG_FLAG_OUTPUT_TO_SYSLOG | HUG_FLAG_USE_MUTEX, + HUG_OPTION_SYSLOG_HOST, "192.168.0.10", + HUG_OPTION_SYSLOG_PORT, 514, + HUG_OPTION_END); + + if(status != HUG_STATUS_OK) { + printf("Error: %d\n", status); + } + + INFO(example, "We are up and running"); + + DEBUG(vst, "DrumGizmoVst()\n"); + pos = 0; buffer = NULL; buffer_size = 0; + output = NULL; + input = NULL; + drumgizmo = NULL; + output = new OutputVST(); input = new InputVST(); drumgizmo = new DrumGizmo(output, input); - + // initialize programs //programs = new DrumGizmoVstProgram[kNumPrograms]; //for(VstInt32 i = 0; i < 16; i++) channelPrograms[i] = i; @@ -92,7 +132,7 @@ DrumGizmoVst::DrumGizmoVst(audioMasterCallback audioMaster) canProcessReplacing(); isSynth(); - char id[] = "DGV4"; // Four bytes typecasted into an unsigned integer + char id[] = "DGV5"; // Four bytes typecasted into an unsigned integer setUniqueID(*(unsigned int*)id); // setUniqueID((unsigned int)time(NULL)); @@ -104,13 +144,62 @@ DrumGizmoVst::DrumGizmoVst(audioMasterCallback audioMaster) editor = new DGEditor(this); setEditor(editor); + + programsAreChunks(true); + + // getChunk + // file:///home/deva/docs/c/drumgizmo/vst/vstsdk2.4/doc/html/class_audio_effect.html#42883c327783d7d31ed513b10c9204fc + + // setChunk + // file:///home/deva/docs/c/drumgizmo/vst/vstsdk2.4/doc/html/class_audio_effect.html#b6e4c31c1acf8d1fc4046521912787b1 } DrumGizmoVst::~DrumGizmoVst() { - delete drumgizmo; - delete input; - delete output; + DEBUG(vst, "~DrumGizmoVst(1)\n"); + if(drumgizmo) delete drumgizmo; + DEBUG(vst, "~DrumGizmoVst(2)\n"); + if(input) delete input; + DEBUG(vst, "~DrumGizmoVst(3)\n"); + if(output) delete output; + DEBUG(vst, "~DrumGizmoVst(4)\n"); + + hug_close(); +} + +VstInt32 DrumGizmoVst::getChunk(void **data, bool isPreset) +{ + DEBUG(vst, "getChunk(data: %p isPreset: %d)\n", *data, isPreset?1:0); + std::string cfg = drumgizmo->configString(); + DEBUG(vst, "drumgizmo->config := %s\n", cfg.c_str()); + char *config = strdup(cfg.c_str()); + *data = config; + return cfg.length(); +} + +VstInt32 DrumGizmoVst::setChunk(void *data, VstInt32 byteSize, bool isPreset) +{ + std::string config; + config.append((const char*)data, (size_t)byteSize); + DEBUG(vst, "setChunk(isPreset: %d): [%d] %s\n", + isPreset?1:0, byteSize, config.c_str()); + + if(!drumgizmo->setConfigString(config)) { + ERR(vst, "setConfigString failed...\n"); + return 1; + } + DEBUG(vst, "Using Drumkit: %s\n", drumgizmo->kitfile.c_str()); + DEBUG(vst, "Using Midimap: %s\n", drumgizmo->midimapfile.c_str()); + + input->loadMidiMap(drumgizmo->midimapfile); + + /* + drumgizmo->loadkit("z:/c/drumgizmo/kits/test/test.xml"); + drumgizmo->midimapfile = "z:/c/drumgizmo/kits/midimap.xml"; + input->loadMidiMap(drumgizmo->midimapfile); + */ + + return 0; } void DrumGizmoVst::setProgram(VstInt32 program) {} @@ -362,7 +451,7 @@ void DrumGizmoVst::setBlockSize(VstInt32 blockSize) void DrumGizmoVst::initProcess() { - drumgizmo->loadkit(getenv("DRUMGIZMO_DRUMKIT")); + // drumgizmo->loadkit(getenv("DRUMGIZMO_DRUMKIT")); drumgizmo->init(true); } diff --git a/vst/drumgizmo_vst.h b/vst/drumgizmo_vst.h index 5e063ff..4497c48 100644 --- a/vst/drumgizmo_vst.h +++ b/vst/drumgizmo_vst.h @@ -81,7 +81,12 @@ public: bool hasMidiProgramsChanged(VstInt32 channel); bool getMidiKeyName(VstInt32 channel, MidiKeyName* keyName); + VstInt32 getChunk(void **data, bool isPreset); + VstInt32 setChunk(void *data, VstInt32 byteSize, bool isPreset); + DrumGizmo *drumgizmo; + InputVST *input; + OutputVST *output; private: void initProcess(); @@ -89,8 +94,6 @@ private: // void noteOff(); void fillProgram(VstInt32 channel, VstInt32 prg, MidiProgramName* mpn); - InputVST *input; - OutputVST *output; size_t pos; sample_t *buffer; size_t buffer_size; diff --git a/vst/input_vst.cc b/vst/input_vst.cc index 52015ad..5cc73f9 100644 --- a/vst/input_vst.cc +++ b/vst/input_vst.cc @@ -27,6 +27,7 @@ #include "input_vst.h" #include +#include InputVST::InputVST() { @@ -38,16 +39,10 @@ InputVST::~InputVST() { } -bool InputVST::init(Instruments &instruments) +bool InputVST::init(Instruments &i) { - MidiMapParser p(getenv("DRUMGIZMO_MIDIMAP")); - if(p.parse()) {/*return false;*/} - mmap.midimap = p.midimap; - - for(size_t i = 0; i < instruments.size(); i++) { - mmap.instrmap[instruments[i].name()] = i; - } - + DEBUG(inputvst, "init\n"); + instruments = &i; return true; } @@ -98,6 +93,7 @@ void InputVST::processEvents(VstEvents* ev) VstInt32 velocity = midiData[2] & 0x7f; int i = mmap.lookup(note); + DEBUG(inputvst, "Note: %d -> %d\n", note, i); if(velocity && i != -1) { list[listsize].type = TYPE_ONSET; list[listsize].instrument = i; @@ -110,3 +106,20 @@ void InputVST::processEvents(VstEvents* ev) event++; } } + +void InputVST::loadMidiMap(std::string f) +{ + DEBUG(inputvst, "load midi map %s\n", f.c_str()); + + MidiMapParser p(f); + if(p.parse()) { + ERR(inputvst, "Error loading midimap: %s\n", f.c_str()); + return; + } + mmap.midimap = p.midimap; + + for(size_t i = 0; i < instruments->size(); i++) { + DEBUG(inputvst, "Mapping %s to %d\n", (*instruments)[i]->name().c_str(), i); + mmap.instrmap[(*instruments)[i]->name()] = i; + } +} diff --git a/vst/input_vst.h b/vst/input_vst.h index 84df91a..e8378c8 100644 --- a/vst/input_vst.h +++ b/vst/input_vst.h @@ -50,11 +50,14 @@ public: void processEvents(VstEvents* ev); + void loadMidiMap(std::string file); MidiMapper mmap; private: event_t *list; size_t listsize; + + Instruments *instruments; }; #endif/*__DRUMGIZMO_INPUT_VST_H__*/ -- cgit v1.2.3