summaryrefslogtreecommitdiff
path: root/libs/distrho/src/DistrhoUIDSSI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/distrho/src/DistrhoUIDSSI.cpp')
-rw-r--r--libs/distrho/src/DistrhoUIDSSI.cpp511
1 files changed, 0 insertions, 511 deletions
diff --git a/libs/distrho/src/DistrhoUIDSSI.cpp b/libs/distrho/src/DistrhoUIDSSI.cpp
deleted file mode 100644
index 0a3d6f9..0000000
--- a/libs/distrho/src/DistrhoUIDSSI.cpp
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * DISTRHO Plugin Framework (DPF)
- * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com>
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with
- * or without fee is hereby granted, provided that the above copyright notice and this
- * permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
- * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "DistrhoUIInternal.hpp"
-
-#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
-# error DSSI UIs do not support direct access!
-#endif
-
-#include "../extra/d_sleep.hpp"
-
-#include <lo/lo.h>
-
-START_NAMESPACE_DISTRHO
-
-// -----------------------------------------------------------------------
-
-struct OscData {
- lo_address addr;
- const char* path;
- lo_server server;
-
- OscData()
- : addr(nullptr),
- path(nullptr),
- server(nullptr) {}
-
- void idle() const
- {
- if (server == nullptr)
- return;
-
- while (lo_server_recv_noblock(server, 0) != 0) {}
- }
-
- void send_configure(const char* const key, const char* const value) const
- {
- char targetPath[std::strlen(path)+11];
- std::strcpy(targetPath, path);
- std::strcat(targetPath, "/configure");
- lo_send(addr, targetPath, "ss", key, value);
- }
-
- void send_control(const int32_t index, const float value) const
- {
- char targetPath[std::strlen(path)+9];
- std::strcpy(targetPath, path);
- std::strcat(targetPath, "/control");
- lo_send(addr, targetPath, "if", index, value);
- }
-
- void send_midi(uchar data[4]) const
- {
- char targetPath[std::strlen(path)+6];
- std::strcpy(targetPath, path);
- std::strcat(targetPath, "/midi");
- lo_send(addr, targetPath, "m", data);
- }
-
- void send_update(const char* const url) const
- {
- char targetPath[std::strlen(path)+8];
- std::strcpy(targetPath, path);
- std::strcat(targetPath, "/update");
- lo_send(addr, targetPath, "s", url);
- }
-
- void send_exiting() const
- {
- char targetPath[std::strlen(path)+9];
- std::strcpy(targetPath, path);
- std::strcat(targetPath, "/exiting");
- lo_send(addr, targetPath, "");
- }
-};
-
-// -----------------------------------------------------------------------
-
-class UIDssi
-{
-public:
- UIDssi(const OscData& oscData, const char* const uiTitle)
- : fUI(this, 0, nullptr, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback),
- fHostClosed(false),
- fOscData(oscData)
- {
- fUI.setWindowTitle(uiTitle);
- }
-
- ~UIDssi()
- {
- if (fOscData.server != nullptr && ! fHostClosed)
- fOscData.send_exiting();
- }
-
- void exec()
- {
- for (;;)
- {
- fOscData.idle();
-
- if (fHostClosed || ! fUI.idle())
- break;
-
- d_msleep(30);
- }
- }
-
- // -------------------------------------------------------------------
-
-#if DISTRHO_PLUGIN_WANT_STATE
- void dssiui_configure(const char* key, const char* value)
- {
- fUI.stateChanged(key, value);
- }
-#endif
-
- void dssiui_control(ulong index, float value)
- {
- fUI.parameterChanged(index, value);
- }
-
-#if DISTRHO_PLUGIN_WANT_PROGRAMS
- void dssiui_program(ulong bank, ulong program)
- {
- fUI.programChanged(bank * 128 + program);
- }
-#endif
-
- void dssiui_samplerate(const double sampleRate)
- {
- fUI.setSampleRate(sampleRate, true);
- }
-
- void dssiui_show()
- {
- fUI.setWindowVisible(true);
- }
-
- void dssiui_hide()
- {
- fUI.setWindowVisible(false);
- }
-
- void dssiui_quit()
- {
- fHostClosed = true;
- fUI.quit();
- }
-
- // -------------------------------------------------------------------
-
-protected:
- void setParameterValue(const uint32_t rindex, const float value)
- {
- if (fOscData.server == nullptr)
- return;
-
- fOscData.send_control(rindex, value);
- }
-
- void setState(const char* const key, const char* const value)
- {
- if (fOscData.server == nullptr)
- return;
-
- fOscData.send_configure(key, value);
- }
-
- void sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity)
- {
- if (fOscData.server == nullptr)
- return;
- if (channel > 0xF)
- return;
-
- uint8_t mdata[4] = { 0, channel, note, velocity };
- mdata[1] += (velocity != 0) ? 0x90 : 0x80;
-
- fOscData.send_midi(mdata);
- }
-
- void setSize(const uint width, const uint height)
- {
- fUI.setWindowSize(width, height);
- }
-
-private:
- UIExporter fUI;
- bool fHostClosed;
-
- const OscData& fOscData;
-
- // -------------------------------------------------------------------
- // Callbacks
-
- #define uiPtr ((UIDssi*)ptr)
-
- static void setParameterCallback(void* ptr, uint32_t rindex, float value)
- {
- uiPtr->setParameterValue(rindex, value);
- }
-
- static void setStateCallback(void* ptr, const char* key, const char* value)
- {
- uiPtr->setState(key, value);
- }
-
- static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity)
- {
- uiPtr->sendNote(channel, note, velocity);
- }
-
- static void setSizeCallback(void* ptr, uint width, uint height)
- {
- uiPtr->setSize(width, height);
- }
-
- #undef uiPtr
-};
-
-// -----------------------------------------------------------------------
-
-static OscData gOscData;
-static const char* gUiTitle = nullptr;
-static UIDssi* globalUI = nullptr;
-
-static void initUiIfNeeded()
-{
- if (globalUI != nullptr)
- return;
-
- if (d_lastUiSampleRate == 0.0)
- d_lastUiSampleRate = 44100.0;
-
- globalUI = new UIDssi(gOscData, gUiTitle);
-}
-
-// -----------------------------------------------------------------------
-
-int osc_debug_handler(const char* path, const char*, lo_arg**, int, lo_message, void*)
-{
- d_debug("osc_debug_handler(\"%s\")", path);
- return 0;
-
-#ifndef DEBUG
- // unused
- (void)path;
-#endif
-}
-
-void osc_error_handler(int num, const char* msg, const char* path)
-{
- d_stderr("osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path);
-}
-
-#if DISTRHO_PLUGIN_WANT_STATE
-int osc_configure_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*)
-{
- const char* const key = &argv[0]->s;
- const char* const value = &argv[1]->s;
- d_debug("osc_configure_handler(\"%s\", \"%s\")", key, value);
-
- initUiIfNeeded();
-
- globalUI->dssiui_configure(key, value);
-
- return 0;
-}
-#endif
-
-int osc_control_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*)
-{
- const int32_t rindex = argv[0]->i;
- const float value = argv[1]->f;
- d_debug("osc_control_handler(%i, %f)", rindex, value);
-
- int32_t index = rindex - DISTRHO_PLUGIN_NUM_INPUTS - DISTRHO_PLUGIN_NUM_OUTPUTS;
-
- // latency
-#if DISTRHO_PLUGIN_WANT_LATENCY
- index -= 1;
-#endif
-
- if (index < 0)
- return 0;
-
- initUiIfNeeded();
-
- globalUI->dssiui_control(index, value);
-
- return 0;
-}
-
-#if DISTRHO_PLUGIN_WANT_PROGRAMS
-int osc_program_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*)
-{
- const int32_t bank = argv[0]->i;
- const int32_t program = argv[1]->f;
- d_debug("osc_program_handler(%i, %i)", bank, program);
-
- initUiIfNeeded();
-
- globalUI->dssiui_program(bank, program);
-
- return 0;
-}
-#endif
-
-int osc_sample_rate_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*)
-{
- const int32_t sampleRate = argv[0]->i;
- d_debug("osc_sample_rate_handler(%i)", sampleRate);
-
- d_lastUiSampleRate = sampleRate;
-
- if (globalUI != nullptr)
- globalUI->dssiui_samplerate(sampleRate);
-
- return 0;
-}
-
-int osc_show_handler(const char*, const char*, lo_arg**, int, lo_message, void*)
-{
- d_debug("osc_show_handler()");
-
- initUiIfNeeded();
-
- globalUI->dssiui_show();
-
- return 0;
-}
-
-int osc_hide_handler(const char*, const char*, lo_arg**, int, lo_message, void*)
-{
- d_debug("osc_hide_handler()");
-
- if (globalUI != nullptr)
- globalUI->dssiui_hide();
-
- return 0;
-}
-
-int osc_quit_handler(const char*, const char*, lo_arg**, int, lo_message, void*)
-{
- d_debug("osc_quit_handler()");
-
- if (globalUI != nullptr)
- globalUI->dssiui_quit();
-
- return 0;
-}
-
-END_NAMESPACE_DISTRHO
-
-// -----------------------------------------------------------------------
-
-int main(int argc, char* argv[])
-{
- USE_NAMESPACE_DISTRHO
-
- // dummy test mode
- if (argc == 1)
- {
- gUiTitle = "DSSI UI Test";
-
- initUiIfNeeded();
- globalUI->dssiui_show();
- globalUI->exec();
-
- delete globalUI;
- globalUI = nullptr;
-
- return 0;
- }
-
- if (argc != 5)
- {
- fprintf(stderr, "Usage: %s <osc-url> <plugin-dll> <plugin-label> <instance-name>\n", argv[0]);
- return 1;
- }
-
- const char* oscUrl = argv[1];
- const char* uiTitle = argv[4];
-
- char* const oscHost = lo_url_get_hostname(oscUrl);
- char* const oscPort = lo_url_get_port(oscUrl);
- char* const oscPath = lo_url_get_path(oscUrl);
- size_t oscPathSize = strlen(oscPath);
- lo_address oscAddr = lo_address_new(oscHost, oscPort);
- lo_server oscServer = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handler);
-
- char* const oscServerPath = lo_server_get_url(oscServer);
-
- char pluginPath[strlen(oscServerPath)+oscPathSize];
- strcpy(pluginPath, oscServerPath);
- strcat(pluginPath, oscPath+1);
-
-#if DISTRHO_PLUGIN_WANT_STATE
- char oscPathConfigure[oscPathSize+11];
- strcpy(oscPathConfigure, oscPath);
- strcat(oscPathConfigure, "/configure");
- lo_server_add_method(oscServer, oscPathConfigure, "ss", osc_configure_handler, nullptr);
-#endif
-
- char oscPathControl[oscPathSize+9];
- strcpy(oscPathControl, oscPath);
- strcat(oscPathControl, "/control");
- lo_server_add_method(oscServer, oscPathControl, "if", osc_control_handler, nullptr);
-
- d_stdout("oscServerPath: \"%s\"", oscServerPath);
- d_stdout("pluginPath: \"%s\"", pluginPath);
- d_stdout("oscPathControl: \"%s\"", oscPathControl);
-
-#if DISTRHO_PLUGIN_WANT_PROGRAMS
- char oscPathProgram[oscPathSize+9];
- strcpy(oscPathProgram, oscPath);
- strcat(oscPathProgram, "/program");
- lo_server_add_method(oscServer, oscPathProgram, "ii", osc_program_handler, nullptr);
-#endif
-
- char oscPathSampleRate[oscPathSize+13];
- strcpy(oscPathSampleRate, oscPath);
- strcat(oscPathSampleRate, "/sample-rate");
- lo_server_add_method(oscServer, oscPathSampleRate, "i", osc_sample_rate_handler, nullptr);
-
- char oscPathShow[oscPathSize+6];
- strcpy(oscPathShow, oscPath);
- strcat(oscPathShow, "/show");
- lo_server_add_method(oscServer, oscPathShow, "", osc_show_handler, nullptr);
-
- char oscPathHide[oscPathSize+6];
- strcpy(oscPathHide, oscPath);
- strcat(oscPathHide, "/hide");
- lo_server_add_method(oscServer, oscPathHide, "", osc_hide_handler, nullptr);
-
- char oscPathQuit[oscPathSize+6];
- strcpy(oscPathQuit, oscPath);
- strcat(oscPathQuit, "/quit");
- lo_server_add_method(oscServer, oscPathQuit, "", osc_quit_handler, nullptr);
-
- lo_server_add_method(oscServer, nullptr, nullptr, osc_debug_handler, nullptr);
-
- gUiTitle = uiTitle;
-
- gOscData.addr = oscAddr;
- gOscData.path = oscPath;
- gOscData.server = oscServer;
- gOscData.send_update(pluginPath);
-
- // wait for init
- for (int i=0; i < 100; ++i)
- {
- lo_server_recv(oscServer);
-
- if (d_lastUiSampleRate != 0.0 || globalUI != nullptr)
- break;
-
- d_msleep(50);
- }
-
- int ret = 1;
-
- if (d_lastUiSampleRate != 0.0 || globalUI != nullptr)
- {
- initUiIfNeeded();
-
- globalUI->exec();
-
- delete globalUI;
- globalUI = nullptr;
-
- ret = 0;
- }
-
-#if DISTRHO_PLUGIN_WANT_STATE
- lo_server_del_method(oscServer, oscPathConfigure, "ss");
-#endif
- lo_server_del_method(oscServer, oscPathControl, "if");
-#if DISTRHO_PLUGIN_WANT_PROGRAMS
- lo_server_del_method(oscServer, oscPathProgram, "ii");
-#endif
- lo_server_del_method(oscServer, oscPathSampleRate, "i");
- lo_server_del_method(oscServer, oscPathShow, "");
- lo_server_del_method(oscServer, oscPathHide, "");
- lo_server_del_method(oscServer, oscPathQuit, "");
- lo_server_del_method(oscServer, nullptr, nullptr);
-
- std::free(oscServerPath);
- std::free(oscHost);
- std::free(oscPort);
- std::free(oscPath);
-
- lo_address_free(oscAddr);
- lo_server_free(oscServer);
-
- return ret;
-}