summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2013-01-26 08:49:35 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2013-01-26 08:49:35 +0100
commitbe628876b0515ceee40946e923771e1b40d6641b (patch)
tree71fd3b3ccdc543ede0ae78ebb565a494242a6a7a
parent838ca69e4b226fa11ce04247148559bef3370959 (diff)
Lots of integration work with GUI, as well as config storage.
-rw-r--r--vst/Makefile.mingw3267
-rw-r--r--vst/drumgizmo_vst.cc113
-rw-r--r--vst/drumgizmo_vst.h7
-rw-r--r--vst/input_vst.cc31
-rw-r--r--vst/input_vst.h3
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 <time.h>
+#include <drumgizmo.h>
+
+#include <hugin.hpp>
#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 <midimapparser.h>
+#include <hugin.hpp>
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__*/