[SCM] calf/master: + Initial DSSI support, somewhat works but no programs or GUI support
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:36:44 UTC 2013
The following commit has been merged in the master branch:
commit 8dcc046367cd8ae7c057af1c955ef782e8867c82
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date: Thu Dec 13 23:16:15 2007 +0000
+ Initial DSSI support, somewhat works but no programs or GUI support
git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@17 78b06b96-2940-0410-b7fc-879d825d01d8
diff --git a/config.h.in b/config.h.in
index 645552c..bd49e05 100644
--- a/config.h.in
+++ b/config.h.in
@@ -12,9 +12,6 @@
/* Define to 1 if you have the <jack/jack.h> header file. */
#undef HAVE_JACK_JACK_H
-/* Define to 1 if you have the <ladspa.h> header file. */
-#undef HAVE_LADSPA_H
-
/* Define to 1 if you have the <math.h> header file. */
#undef HAVE_MATH_H
diff --git a/configure.in b/configure.in
index a920179..32ddb2c 100644
--- a/configure.in
+++ b/configure.in
@@ -24,10 +24,12 @@ PKG_PROG_PKG_CONFIG
# Checks for header files.
AC_HEADER_STDC
-AC_CHECK_HEADERS([memory.h stdint.h stdlib.h ladspa.h time.h math.h])
+AC_CHECK_HEADERS([memory.h stdint.h stdlib.h time.h math.h])
AC_CHECK_HEADER(ladspa.h, LADSPA_FOUND="yes", LADSPA_FOUND="no")
+AC_CHECK_HEADER(dssi.h, DSSI_FOUND="yes", DSSI_FOUND="no")
+
AC_CHECK_HEADERS([jack/jack.h], have_jack_header=yes, have_jack_header=no)
if test "$have_jack_header" = "yes"; then
@@ -80,6 +82,7 @@ AC_ARG_ENABLE(experimental,
AC_MSG_RESULT($set_enable_experimental)
+AM_CONDITIONAL(USE_DSSI, test "$DSSI_FOUND" = "yes")
AM_CONDITIONAL(USE_LADSPA, test "$LADSPA_FOUND" = "yes")
AM_CONDITIONAL(USE_JACK, test "$JACK_ENABLED" = "yes")
AM_CONDITIONAL(USE_PHAT, test "$PHAT_ENABLED" = "yes")
@@ -125,6 +128,7 @@ AC_MSG_RESULT([
Calf configured
LADSPA enabled: $LADSPA_FOUND
+ DSSI enabeld: $DSSI_FOUND
JACK host enabled: $JACK_ENABLED
Old-style JACK MIDI: $OLD_JACK
PHAT library enabled: $PHAT_ENABLED
diff --git a/src/Makefile.am b/src/Makefile.am
index 6fa73c2..0813300 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -36,6 +36,9 @@ bin_PROGRAMS += calfmakerdf
calfmakerdf_SOURCES = makerdf.cpp
calfmakerdf_LDADD = libcalfstatic.la
endif
+if USE_DSSI
+AM_CXXFLAGS += -DUSE_DSSI=1
+endif
calfbenchmark_SOURCES = benchmark.cpp
calfbenchmark_LDADD =
diff --git a/src/calf/giface.h b/src/calf/giface.h
index 99706d8..7b34593 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -27,6 +27,9 @@
#if USE_LADSPA
#include <ladspa.h>
#endif
+#if USE_DSSI
+#include <dssi.h>
+#endif
#if USE_JACK
#include <jack/jack.h>
#include <jack/midiport.h>
@@ -129,6 +132,9 @@ template<class Module>
struct ladspa_wrapper
{
LADSPA_Descriptor descriptor;
+#if USE_DSSI
+ DSSI_Descriptor dssi_descriptor;
+#endif
ladspa_info &info;
ladspa_wrapper(ladspa_info &i)
@@ -190,6 +196,15 @@ struct ladspa_wrapper
descriptor.set_run_adding_gain = NULL;
descriptor.deactivate = cb_deactivate;
descriptor.cleanup = cb_cleanup;
+#if USE_DSSI
+ memset(&dssi_descriptor, 0, sizeof(dssi_descriptor));
+ dssi_descriptor.DSSI_API_Version = 1;
+ dssi_descriptor.LADSPA_Plugin = &descriptor;
+ dssi_descriptor.configure = cb_configure;
+ // XXXKF make one default program
+ dssi_descriptor.run_synth = cb_run_synth;
+
+#endif
}
static LADSPA_Handle cb_instantiate(const struct _LADSPA_Descriptor * Descriptor, unsigned long sample_rate)
@@ -226,18 +241,81 @@ struct ladspa_wrapper
mod->set_sample_rate(mod->srate);
mod->activate();
}
+
+ static inline void zero_by_mask(Module *module, uint32_t mask, uint32_t offset, uint32_t nsamples)
+ {
+ for (int i=0; i<Module::out_count; i++) {
+ if ((mask & (1 << i)) == 0) {
+ dsp::zero(module->outs[i] + offset, nsamples);
+ }
+ }
+ }
static void cb_run(LADSPA_Handle Instance, unsigned long SampleCount) {
Module *const mod = (Module *)Instance;
mod->params_changed();
uint32_t out_mask = mod->process(0, SampleCount, -1, -1);
- for (int i=0; i<Module::out_count; i++) {
- if ((out_mask & (1 << i)) == 0) {
- if (mod->outs[i])
- memset(mod->outs[i], 0, sizeof(float) * SampleCount);
- }
+ zero_by_mask(mod, out_mask, 0, SampleCount);
+ }
+
+#if USE_DSSI
+ static void cb_run_synth(LADSPA_Handle Instance, unsigned long SampleCount,
+ snd_seq_event_t *Events, unsigned long EventCount) {
+ Module *const mod = (Module *)Instance;
+ mod->params_changed();
+
+ uint32_t offset = 0;
+ for (uint32_t e = 0; e < EventCount; e++)
+ {
+ uint32_t timestamp = Events[e].time.tick;
+ if (timestamp != offset) {
+ uint32_t out_mask = mod->process(offset, timestamp - offset, -1, -1);
+ zero_by_mask(mod, out_mask, offset, timestamp - offset);
+ }
+ process_dssi_event(mod, Events[e]);
+ offset = timestamp;
+ }
+ if (offset != SampleCount)
+ {
+ uint32_t out_mask = mod->process(offset, SampleCount - offset, -1, -1);
+ zero_by_mask(mod, out_mask, offset, SampleCount - offset);
}
}
+
+ static char *cb_configure(LADSPA_Handle Instance,
+ const char *Key,
+ const char *Value)
+ {
+ // XXXKF some day...
+ // Module *const mod = (Module *)Instance;
+ // return mod->configure(Key, Value);
+ return NULL;
+ }
+
+ char *configure(const char *key, const char *value)
+ {
+ return NULL;
+ }
+
+ static void process_dssi_event(Module *module, snd_seq_event_t &event)
+ {
+ uint8_t data[4];
+ switch(event.type) {
+ case SND_SEQ_EVENT_NOTEON:
+ data[0] = 0x90 + event.data.note.channel;
+ data[1] = event.data.note.note;
+ data[2] = event.data.note.velocity;
+ module->handle_event(data, 3);
+ break;
+ case SND_SEQ_EVENT_NOTEOFF:
+ data[0] = 0x80 + event.data.note.channel;
+ data[1] = event.data.note.note;
+ data[2] = event.data.note.velocity;
+ module->handle_event(data, 3);
+ break;
+ }
+ }
+#endif
static void cb_deactivate(LADSPA_Handle Instance) {
Module *const mod = (Module *)Instance;
@@ -254,6 +332,7 @@ struct ladspa_wrapper
};
};
+
#endif
struct audio_exception: public std::exception
diff --git a/src/calf/modules.h b/src/calf/modules.h
index eb9e8cf..ea8d813 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -30,6 +30,15 @@ namespace synth {
using namespace dsp;
+inline void default_handle_event(uint8_t *data, int len, float *params[], unsigned int param_count)
+{
+ if (data[0] == 0x7F && len >= 8) {
+ midi_event *p = (midi_event *)data;
+ if (p->param2 < param_count)
+ *params[p->param2] = p->param3;
+ }
+}
+
class amp_audio_module
{
public:
@@ -42,8 +51,9 @@ public:
static parameter_properties param_props[];
void set_sample_rate(uint32_t sr) {
}
- void handle_midi_event_now(synth::midi_event event);
- void handle_param_event_now(uint32_t param, float value);
+ void handle_event(uint8_t *data, int len) {
+ default_handle_event(data, len, params, param_count);
+ }
void params_changed() {
}
void activate() {
@@ -63,15 +73,6 @@ public:
}
};
-inline void default_handle_event(uint8_t *data, int len, float *params[], unsigned int param_count)
-{
- if (data[0] == 0x7F && len >= 8) {
- midi_event *p = (midi_event *)data;
- if (p->param2 < param_count)
- *params[p->param2] = p->param3;
- }
-}
-
class flanger_audio_module
{
public:
diff --git a/src/modules.cpp b/src/modules.cpp
index 14e317d..dc82e88 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -201,6 +201,21 @@ const LADSPA_Descriptor *ladspa_descriptor(unsigned long Index)
};
+#if USE_DSSI && ENABLE_EXPERIMENTAL
+extern "C" {
+
+const DSSI_Descriptor *dssi_descriptor(unsigned long Index)
+{
+ switch (Index) {
+ case 0: return &::monosynth.dssi_descriptor;
+ case 1: return &::organ.dssi_descriptor;
+ default: return NULL;
+ }
+}
+
+};
+#endif
+
std::string synth::get_builtin_modules_rdf()
{
std::string rdf;
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list