/* * DISTRHO Plugin Framework (DPF) * Copyright (C) 2012-2014 Filipe Coelho * * 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. */ #ifndef DISTRHO_UI_INTERNAL_HPP_INCLUDED #define DISTRHO_UI_INTERNAL_HPP_INCLUDED #include "../DistrhoUI.hpp" #include "../../dgl/App.hpp" #include "../../dgl/Window.hpp" START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- // Static data, see DistrhoUI.cpp extern double d_lastUiSampleRate; // ----------------------------------------------------------------------- // UI callbacks typedef void (*editParamFunc) (void* ptr, uint32_t rindex, bool started); typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); typedef void (*uiResizeFunc) (void* ptr, unsigned int width, unsigned int height); // ----------------------------------------------------------------------- // UI private data struct UI::PrivateData { // DSP double sampleRate; uint32_t parameterOffset; // Callbacks editParamFunc editParamCallbackFunc; setParamFunc setParamCallbackFunc; setStateFunc setStateCallbackFunc; sendNoteFunc sendNoteCallbackFunc; uiResizeFunc uiResizeCallbackFunc; void* ptr; PrivateData() noexcept : sampleRate(d_lastUiSampleRate), parameterOffset(0), editParamCallbackFunc(nullptr), setParamCallbackFunc(nullptr), setStateCallbackFunc(nullptr), sendNoteCallbackFunc(nullptr), uiResizeCallbackFunc(nullptr), ptr(nullptr) { assert(sampleRate != 0.0); #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; # if DISTRHO_PLUGIN_WANT_LATENCY parameterOffset += 1; # endif #endif #ifdef DISTRHO_PLUGIN_TARGET_LV2 # if (DISTRHO_PLUGIN_IS_SYNTH || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) parameterOffset += 1; # if DISTRHO_PLUGIN_WANT_STATE parameterOffset += 1; # endif # endif #endif } void editParamCallback(const uint32_t rindex, const bool started) { if (editParamCallbackFunc != nullptr) editParamCallbackFunc(ptr, rindex, started); } void setParamCallback(const uint32_t rindex, const float value) { if (setParamCallbackFunc != nullptr) setParamCallbackFunc(ptr, rindex, value); } void setStateCallback(const char* const key, const char* const value) { if (setStateCallbackFunc != nullptr) setStateCallbackFunc(ptr, key, value); } void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) { if (sendNoteCallbackFunc != nullptr) sendNoteCallbackFunc(ptr, channel, note, velocity); } void uiResizeCallback(const unsigned int width, const unsigned int height) { if (uiResizeCallbackFunc != nullptr) uiResizeCallbackFunc(ptr, width, height); } }; // ----------------------------------------------------------------------- // UI exporter class class UIExporter { public: UIExporter(void* const ptr, const intptr_t winId, const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const uiResizeFunc uiResizeCall) : glApp(), glWindow(glApp, winId), fUi(createUI()), fData((fUi != nullptr) ? fUi->pData : nullptr) { assert(fUi != nullptr); if (fUi == nullptr) return; fData->ptr = ptr; fData->editParamCallbackFunc = editParamCall; fData->setParamCallbackFunc = setParamCall; fData->setStateCallbackFunc = setStateCall; fData->sendNoteCallbackFunc = sendNoteCall; fData->uiResizeCallbackFunc = uiResizeCall; glWindow.setSize(fUi->d_getWidth(), fUi->d_getHeight()); glWindow.setResizable(false); } ~UIExporter() { delete fUi; } // ------------------------------------------------------------------- const char* getName() const noexcept { return (fUi != nullptr) ? fUi->d_getName() : ""; } unsigned int getWidth() const noexcept { return (fUi != nullptr) ? fUi->d_getWidth() : 0; } unsigned int getHeight() const noexcept { return (fUi != nullptr) ? fUi->d_getHeight() : 0; } // ------------------------------------------------------------------- uint32_t getParameterOffset() const noexcept { return (fData != nullptr) ? fData->parameterOffset : 0; } // ------------------------------------------------------------------- void parameterChanged(const uint32_t index, const float value) { if (fUi != nullptr) fUi->d_parameterChanged(index, value); } #if DISTRHO_PLUGIN_WANT_PROGRAMS void programChanged(const uint32_t index) { if (fUi != nullptr) fUi->d_programChanged(index); } #endif #if DISTRHO_PLUGIN_WANT_STATE void stateChanged(const char* const key, const char* const value) { if (fUi != nullptr) fUi->d_stateChanged(key, value); } #endif // ------------------------------------------------------------------- bool idle() { if (fUi != nullptr) fUi->d_uiIdle(); glApp.idle(); return ! glApp.isQuiting(); } void quit() { glWindow.close(); glApp.quit(); } void setSize(const unsigned int width, const unsigned int height) { glWindow.setSize(width, height); } void setTitle(const char* const uiTitle) { glWindow.setTitle(uiTitle); } void setVisible(const bool yesNo) { glWindow.setVisible(yesNo); } private: // ------------------------------------------------------------------- // DGL Application and Window for this plugin DGL::App glApp; DGL::Window glWindow; // ------------------------------------------------------------------- // private members accessed by DistrhoPlugin class UI* const fUi; UI::PrivateData* const fData; }; // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO #endif // DISTRHO_UI_INTERNAL_HPP_INCLUDED