diff options
Diffstat (limited to 'pluginlv2.cc')
-rw-r--r-- | pluginlv2.cc | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/pluginlv2.cc b/pluginlv2.cc index 7593ff4..fd0bfbf 100644 --- a/pluginlv2.cc +++ b/pluginlv2.cc @@ -27,6 +27,7 @@ #include "pluginlv2.h" #include <iostream> +#include <sstream> #include <assert.h> #include "midievent.h" @@ -121,6 +122,13 @@ LV2_Handle PluginLV2::instantiate(const struct _LV2_Descriptor* descriptor, } #endif +#ifdef DISPLAY_INTERFACE + if(uri == LV2_MIDNAM__update) + { + plugin_lv2->midnam = (LV2_Midnam*)data; + } +#endif + ++features; } @@ -355,6 +363,13 @@ void PluginLV2::run(LV2_Handle instance, uint32_t sample_count) plugin_lv2->pos += sample_count; +#ifdef MIDNAME_INTERFACE + if (0) // XXX drumkit changed + { + plugin_lv2->midnam->update (plugin_lv2->midnam->handle); + } +#endif + #ifdef DISPLAY_INTERFACE if(plugin_lv2->queue_draw) { @@ -470,6 +485,72 @@ LV2_Inline_Display_Image_Surface* PluginLV2::inlineRender(LV2_Handle instance, return &plugin_lv2->surf; } +#ifdef MIDNAME_INTERFACE +char* PluginLV2::MidnamFile (LV2_Handle instance) +{ + PluginLV2* plugin_lv2 = (PluginLV2*)instance; + std::stringstream ss; + ss << + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!DOCTYPE MIDINameDocument PUBLIC \"-//MIDI Manufacturers Association//DTD MIDINameDocument 1.0//EN\" \"http://dev.midi.org/dtds/MIDINameDocument10.dtd\">\n" + "<MIDINameDocument>\n" + " <Author/>\n" + " <MasterDeviceNames>\n" + " <Manufacturer>The Drum Gizmo Foundation</Manufacturer>\n" + " <Model>Drumgizmo:" << ((const void *) instance) << "</Model>\n"; //<< needs to match MidnamModel() + + ss << " <CustomDeviceMode Name=\"Default\">\n"; + ss << " <ChannelNameSetAssignments>\n"; + for (int c = 0; c < 16; ++c) + { + ss << " <ChannelNameSetAssign Channel=\"" << (c + 1) << "\" NameSet=\"Presets\"/>\n"; + } + ss << " </ChannelNameSetAssignments>\n"; + ss << " </CustomDeviceMode>\n"; + + + ss << + " <ChannelNameSet Name=\"Presets\">\n" + " <AvailableForChannels>\n"; + for (int c = 0; c < 16; ++c) { + ss << " <AvailableChannel Channel=\"" << (c + 1) << "\" Available=\"true\"/>\n"; + } + ss << + " </AvailableForChannels>\n" + " <UsesNoteNameList Name=\"Notes\"/>\n" + " <PatchBank Name=\"User Patches\">\n" + " <PatchNameList Name=\"User Patches\"/>\n" + " </PatchBank>\n" + " </ChannelNameSet>\n" + " <NoteNameList Name=\"Notes\">\n"; + + // XXX TODO ask plugin_lv2, iterate over mapped samples + ss << " <Note Number=\"36\" Name=\"KickDrum\"/>\n"; + ss << " <Note Number=\"38\" Name=\"Snare\"/>\n"; + // XXX + + ss << + " </NoteNameList>\n" + " </MasterDeviceNames>\n" + "</MIDINameDocument>"; + + return strdup (ss.str().c_str()); +} + +char* PluginLV2::MidnamModel (LV2_Handle instance) +{ + char* rv = (char*) malloc (64 * sizeof (char)); + snprintf (rv, 64, "Drumgizmo:%p", (void*) instance); + rv[63] = 0; + return rv; +} + +void PluginLV2::MidnamFree (char* v) +{ + free (v); +} +#endif + const void* PluginLV2::extensionData(const char *uri) { if(!strcmp(uri, LV2_STATE__interface)) @@ -485,6 +566,14 @@ const void* PluginLV2::extensionData(const char *uri) } #endif +#ifdef MIDNAME_INTERFACE + static const LV2_Midnam_Interface midnam = { MidnamFile, MidnamModel, MidnamFree }; + if (!strcmp (uri, LV2_MIDNAM__interface)) + { + return &midnam; + } +#endif + return nullptr; } |