| @@ -224,7 +224,7 @@ void DistrhoPlugin3BandEQ::d_deactivate() | |||
| tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_run(const float** inputs, float** outputs, uint32_t frames, uint32_t, const MidiEvent*) | |||
| void DistrhoPlugin3BandEQ::d_run(float** inputs, float** outputs, uint32_t frames, uint32_t, const MidiEvent*) | |||
| { | |||
| const float* in1 = inputs[0]; | |||
| const float* in2 = inputs[1]; | |||
| @@ -80,7 +80,7 @@ protected: | |||
| // Process | |||
| void d_activate(); | |||
| void d_deactivate(); | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents); | |||
| void d_run(float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents); | |||
| // --------------------------------------------- | |||
| @@ -224,7 +224,7 @@ void DistrhoPlugin3BandSplitter::d_deactivate() | |||
| tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_run(const float** inputs, float** outputs, uint32_t frames, uint32_t, const MidiEvent*) | |||
| void DistrhoPlugin3BandSplitter::d_run(float** inputs, float** outputs, uint32_t frames, uint32_t, const MidiEvent*) | |||
| { | |||
| const float* in1 = inputs[0]; | |||
| const float* in2 = inputs[1]; | |||
| @@ -80,7 +80,7 @@ protected: | |||
| // Process | |||
| void d_activate(); | |||
| void d_deactivate(); | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents); | |||
| void d_run(float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents); | |||
| // --------------------------------------------- | |||
| @@ -10,11 +10,12 @@ include ../Makefile.mk | |||
| BUILD_C_FLAGS += -fvisibility=hidden -fPIC -I. | |||
| BUILD_CXX_FLAGS += -fvisibility=hidden -fPIC -I. -I../carla-includes -I../carla-utils | |||
| BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) | |||
| BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
| ifeq ($(HAVE_ZYN_DEPS),true) | |||
| BUILD_CXX_FLAGS += -DWANT_ZYNADDSUBFX | |||
| ZYN_CXX_FLAGS = $(shell pkg-config --cflags fftw3 mxml) | |||
| ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
| ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml) | |||
| endif | |||
| # Simple plugins | |||
| @@ -51,14 +52,14 @@ distrho-3bandeq.o: distrho-3bandeq.cpp | |||
| distrho-3bandsplitter.o: distrho-3bandsplitter.cpp | |||
| $(CXX) -c $< $(BUILD_CXX_FLAGS) -I../distrho-plugin-toolkit -I3bandsplitter -DDISTRHO_NAMESPACE=DISTRHO_3BandSplitter -o $@ | |||
| distrho-pugl.o: distrho/pugl.cpp | |||
| distrho-pugl.o: distrho-pugl.cpp | |||
| $(CXX) -c $< $(BUILD_CXX_FLAGS) -I../distrho-plugin-toolkit -o $@ | |||
| zynaddsubfx.o: zynaddsubfx.cpp | |||
| $(CXX) -c $< $(BUILD_CXX_FLAGS) $(ZYN_CXX_FLAGS) -o $@ | |||
| $(CXX) -c $< $(ZYN_CXX_FLAGS) -o $@ | |||
| zynaddsubfx-src.o: zynaddsubfx-src.cpp | |||
| $(CXX) -c $< $(BUILD_CXX_FLAGS) $(ZYN_CXX_FLAGS) -o $@ | |||
| $(CXX) -c $< $(ZYN_CXX_FLAGS) -o $@ | |||
| # -------------------------------------------------------------- | |||
| @@ -29,7 +29,7 @@ static PluginHandle bypass_instantiate(const PluginDescriptor* _this_, HostDescr | |||
| (void)host; | |||
| } | |||
| static void bypass_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents) | |||
| static void bypass_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) | |||
| { | |||
| float* in = inBuffer[0]; | |||
| float* out = outBuffer[0]; | |||
| @@ -45,7 +45,7 @@ static void bypass_process(PluginHandle handle, float** inBuffer, float** outBuf | |||
| // ----------------------------------------------------------------------- | |||
| static PluginDescriptor bypassDesc = { | |||
| static const PluginDescriptor bypassDesc = { | |||
| .category = PLUGIN_CATEGORY_NONE, | |||
| .hints = 0x0, | |||
| .audioIns = 1, | |||
| @@ -99,7 +99,7 @@ INPUT = | |||
| INPUT_ENCODING = UTF-8 | |||
| FILE_PATTERNS = | |||
| RECURSIVE = NO | |||
| EXCLUDE = bypass.c midi-split.cpp zynaddsubfx.cpp zynaddsubfx-src.cpp | |||
| EXCLUDE = bypass.c midi-split.cpp distrho-3bandeq.cpp distrho-3bandsplitter.cpp distrho-pugl.cpp zynaddsubfx.cpp zynaddsubfx-src.cpp | |||
| EXCLUDE_SYMLINKS = NO | |||
| EXCLUDE_PATTERNS = | |||
| EXCLUDE_SYMBOLS = | |||
| @@ -175,7 +175,7 @@ typedef struct _PluginDescriptor { | |||
| void (*activate)(PluginHandle handle); | |||
| void (*deactivate)(PluginHandle handle); | |||
| void (*cleanup)(PluginHandle handle); | |||
| void (*process)(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents); | |||
| void (*process)(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents); | |||
| } PluginDescriptor; | |||
| @@ -26,11 +26,12 @@ | |||
| * @{ | |||
| */ | |||
| class PluginDescriptorClass { | |||
| class PluginDescriptorClass | |||
| { | |||
| public: | |||
| PluginDescriptorClass(const HostDescriptor* host) | |||
| PluginDescriptorClass(const HostDescriptor* const host) | |||
| : m_host(host) | |||
| { | |||
| this->host = host; | |||
| } | |||
| virtual ~PluginDescriptorClass() | |||
| @@ -40,64 +41,79 @@ public: | |||
| // ------------------------------------------------------------------- | |||
| // Host calls | |||
| const HostDescriptor* getHostHandle() const | |||
| { | |||
| return m_host; | |||
| } | |||
| uint32_t getBufferSize() const | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| return host->get_buffer_size(host->handle); | |||
| if (m_host) | |||
| return m_host->get_buffer_size(m_host->handle); | |||
| return 0; | |||
| } | |||
| double getSampleRate() const | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| return host->get_sample_rate(host->handle); | |||
| if (m_host) | |||
| return m_host->get_sample_rate(m_host->handle); | |||
| return 0.0; | |||
| } | |||
| const TimeInfo* getTimeInfo() const | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| return host->get_time_info(host->handle); | |||
| if (m_host) | |||
| return m_host->get_time_info(m_host->handle); | |||
| return nullptr; | |||
| } | |||
| void writeMidiEvent(MidiEvent* event) | |||
| void writeMidiEvent(MidiEvent* const event) | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| host->write_midi_event(host->handle, event); | |||
| if (m_host) | |||
| m_host->write_midi_event(m_host->handle, event); | |||
| } | |||
| void uiParameterChanged(uint32_t index, float value) | |||
| void uiParameterChanged(const uint32_t index, const float value) | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| host->ui_parameter_changed(host->handle, index, value); | |||
| if (m_host) | |||
| m_host->ui_parameter_changed(m_host->handle, index, value); | |||
| } | |||
| void uiCustomDataChanged(const char* key, const char* value) | |||
| void uiMidiProgramChanged(const uint32_t bank, const uint32_t program) | |||
| { | |||
| CARLA_ASSERT(host); | |||
| CARLA_ASSERT(m_host); | |||
| if (host) | |||
| host->ui_custom_data_changed(host->handle, key, value); | |||
| if (m_host) | |||
| m_host->ui_midi_program_changed(m_host->handle, bank, program); | |||
| } | |||
| void uiCustomDataChanged(const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(m_host); | |||
| if (m_host) | |||
| m_host->ui_custom_data_changed(m_host->handle, key, value); | |||
| } | |||
| void uiClosed() | |||
| { | |||
| if (host) | |||
| host->ui_closed(host->handle); | |||
| CARLA_ASSERT(m_host); | |||
| if (m_host) | |||
| m_host->ui_closed(m_host->handle); | |||
| } | |||
| protected: | |||
| @@ -109,21 +125,21 @@ protected: | |||
| return 0; | |||
| } | |||
| virtual const Parameter* getParameterInfo(uint32_t index) | |||
| virtual const Parameter* getParameterInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| return nullptr; | |||
| } | |||
| virtual float getParameterValue(uint32_t index) | |||
| virtual float getParameterValue(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| return 0.0f; | |||
| } | |||
| virtual const char* getParameterText(uint32_t index) | |||
| virtual const char* getParameterText(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| @@ -138,7 +154,7 @@ protected: | |||
| return 0; | |||
| } | |||
| virtual const MidiProgram* getMidiProgramInfo(uint32_t index) | |||
| virtual const MidiProgram* getMidiProgramInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||
| @@ -148,19 +164,19 @@ protected: | |||
| // ------------------------------------------------------------------- | |||
| // Plugin state calls | |||
| virtual void setParameterValue(uint32_t index, float value) | |||
| virtual void setParameterValue(const uint32_t index, const float value) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| Q_UNUSED(value); | |||
| } | |||
| virtual void setMidiProgram(uint32_t bank, uint32_t program) | |||
| virtual void setMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| Q_UNUSED(bank); | |||
| Q_UNUSED(program); | |||
| } | |||
| virtual void setCustomData(const char* key, const char* value) | |||
| virtual void setCustomData(const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(key); | |||
| CARLA_ASSERT(value); | |||
| @@ -169,7 +185,7 @@ protected: | |||
| // ------------------------------------------------------------------- | |||
| // Plugin UI calls | |||
| virtual void uiShow(bool show) | |||
| virtual void uiShow(const bool show) | |||
| { | |||
| Q_UNUSED(show); | |||
| } | |||
| @@ -178,19 +194,19 @@ protected: | |||
| { | |||
| } | |||
| virtual void uiSetParameterValue(uint32_t index, float value) | |||
| virtual void uiSetParameterValue(const uint32_t index, const float value) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| Q_UNUSED(value); | |||
| } | |||
| virtual void uiSetMidiProgram(uint32_t bank, uint32_t program) | |||
| virtual void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| Q_UNUSED(bank); | |||
| Q_UNUSED(program); | |||
| } | |||
| virtual void uiSetCustomData(const char* key, const char* value) | |||
| virtual void uiSetCustomData(const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(key); | |||
| CARLA_ASSERT(value); | |||
| @@ -207,100 +223,102 @@ protected: | |||
| { | |||
| } | |||
| virtual void process(float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents) = 0; | |||
| virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const MidiEvent* const midiEvents) = 0; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| const HostDescriptor* host; | |||
| const HostDescriptor* const m_host; | |||
| // ------------------------------------------------------------------- | |||
| #ifndef DOXYGEN | |||
| public: | |||
| #define handlePtr ((PluginDescriptorClass*)handle) | |||
| static uint32_t _get_parameter_count(PluginHandle handle) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getParameterCount(); | |||
| return handlePtr->getParameterCount(); | |||
| } | |||
| static const Parameter* _get_parameter_info(PluginHandle handle, uint32_t index) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getParameterInfo(index); | |||
| return handlePtr->getParameterInfo(index); | |||
| } | |||
| static float _get_parameter_value(PluginHandle handle, uint32_t index) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getParameterValue(index); | |||
| return handlePtr->getParameterValue(index); | |||
| } | |||
| static const char* _get_parameter_text(PluginHandle handle, uint32_t index) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getParameterText(index); | |||
| return handlePtr->getParameterText(index); | |||
| } | |||
| static uint32_t _get_midi_program_count(PluginHandle handle) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getMidiProgramCount(); | |||
| return handlePtr->getMidiProgramCount(); | |||
| } | |||
| static const MidiProgram* _get_midi_program_info(PluginHandle handle, uint32_t index) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->getMidiProgramInfo(index); | |||
| return handlePtr->getMidiProgramInfo(index); | |||
| } | |||
| static void _set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->setParameterValue(index, value); | |||
| return handlePtr->setParameterValue(index, value); | |||
| } | |||
| static void _set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->setMidiProgram(bank, program); | |||
| return handlePtr->setMidiProgram(bank, program); | |||
| } | |||
| static void _set_custom_data(PluginHandle handle, const char* key, const char* value) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->setCustomData(key, value); | |||
| return handlePtr->setCustomData(key, value); | |||
| } | |||
| static void _ui_show(PluginHandle handle, bool show) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->uiShow(show); | |||
| return handlePtr->uiShow(show); | |||
| } | |||
| static void _ui_idle(PluginHandle handle) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->uiIdle(); | |||
| return handlePtr->uiIdle(); | |||
| } | |||
| static void _ui_set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->uiSetParameterValue(index, value); | |||
| return handlePtr->uiSetParameterValue(index, value); | |||
| } | |||
| static void _ui_set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->uiSetMidiProgram(bank, program); | |||
| return handlePtr->uiSetMidiProgram(bank, program); | |||
| } | |||
| static void _ui_set_custom_data(PluginHandle handle, const char* key, const char* value) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->uiSetCustomData(key, value); | |||
| return handlePtr->uiSetCustomData(key, value); | |||
| } | |||
| static void _activate(PluginHandle handle) | |||
| { | |||
| ((PluginDescriptorClass*)handle)->activate(); | |||
| handlePtr->activate(); | |||
| } | |||
| static void _deactivate(PluginHandle handle) | |||
| { | |||
| ((PluginDescriptorClass*)handle)->deactivate(); | |||
| handlePtr->deactivate(); | |||
| } | |||
| static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents) | |||
| static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) | |||
| { | |||
| return ((PluginDescriptorClass*)handle)->process(inBuffer, outBuffer, frames, midiEventCount, midiEvents); | |||
| return handlePtr->process(inBuffer, outBuffer, frames, midiEventCount, midiEvents); | |||
| } | |||
| #endif | |||
| }; | |||
| @@ -17,73 +17,115 @@ | |||
| #include "carla_native.hpp" | |||
| #include <QtGui/QDialog> | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| # include "DistrhoUIMain.cpp" | |||
| #endif | |||
| #ifdef QTCREATOR_TEST | |||
| # define DISTRHO_PLUGIN_HAS_UI 1 | |||
| //# define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| # define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| # define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| //# define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| # define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| #endif | |||
| // ------------------------------------------------- | |||
| START_NAMESPACE_DISTRHO | |||
| START_NAMESPACE_DISTRHO | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| class UICarla | |||
| // ----------------------------------------------------------------------- | |||
| // Carla UI | |||
| class UICarla : public QDialog | |||
| { | |||
| public: | |||
| UICarla(const HostDescriptor* const host, PluginInternal* plugin, intptr_t winId) | |||
| : m_host(host), | |||
| UICarla(const HostDescriptor* const host, PluginInternal* const plugin) | |||
| : QDialog(nullptr), | |||
| m_host(host), | |||
| m_plugin(plugin), | |||
| ui(this, winId, setParameterCallback, setStateCallback, uiEditParameterCallback, uiSendNoteCallback, uiResizeCallback) | |||
| ui(this, winId(), setParameterCallback, setStateCallback, uiEditParameterCallback, uiSendNoteCallback, uiResizeCallback) | |||
| { | |||
| setFixedSize(ui.getWidth(), ui.getHeight()); | |||
| setWindowTitle("TEST GUI"); | |||
| } | |||
| ~UICarla() | |||
| { | |||
| } | |||
| // --------------------------------------------- | |||
| void carla_show(const bool yesNo) | |||
| { | |||
| setVisible(yesNo); | |||
| } | |||
| void carla_idle() | |||
| { | |||
| ui.idle(); | |||
| } | |||
| void carla_setParameterValue(const uint32_t index, const float value) | |||
| { | |||
| ui.parameterChanged(index, value); | |||
| } | |||
| # if DISTRHO_PLUGIN_WANT_PROGRAMS | |||
| void carla_setMidiProgram(const uint32_t realProgram) | |||
| { | |||
| ui.programChanged(realProgram); | |||
| } | |||
| # endif | |||
| # if DISTRHO_PLUGIN_WANT_STATE | |||
| void carla_setCustomData(const char* const key, const char* const value) | |||
| { | |||
| ui.stateChanged(key, value); | |||
| } | |||
| # endif | |||
| // --------------------------------------------- | |||
| protected: | |||
| void setParameterValue(uint32_t index, float value) | |||
| { | |||
| m_host->ui_parameter_changed(m_host->handle, index, value); | |||
| } | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| # if DISTRHO_PLUGIN_WANT_STATE | |||
| void setState(const char* key, const char* value) | |||
| { | |||
| m_host->ui_custom_data_changed(m_host->handle, key, value); | |||
| } | |||
| #endif | |||
| # endif | |||
| void uiEditParameter(uint32_t, bool) | |||
| { | |||
| // TODO | |||
| } | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| # if DISTRHO_PLUGIN_IS_SYNTH | |||
| void uiSendNote(bool, uint8_t, uint8_t, uint8_t) | |||
| { | |||
| // TODO | |||
| } | |||
| #endif | |||
| # endif | |||
| void uiResize(unsigned int width, unsigned int height) | |||
| { | |||
| //hostCallback(audioMasterSizeWindow, width, height, nullptr, 0.0f); | |||
| Q_UNUSED(width); | |||
| Q_UNUSED(height); | |||
| setFixedSize(width, height); | |||
| } | |||
| private: | |||
| // Carla stuff | |||
| // Plugin stuff | |||
| const HostDescriptor* const m_host; | |||
| PluginInternal* const m_plugin; | |||
| // Plugin UI | |||
| // UI | |||
| UIInternal ui; | |||
| // --------------------------------------------- | |||
| @@ -99,16 +141,16 @@ private: | |||
| static void setStateCallback(void* ptr, const char* key, const char* value) | |||
| { | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| # if DISTRHO_PLUGIN_WANT_STATE | |||
| UICarla* _this_ = (UICarla*)ptr; | |||
| CARLA_ASSERT(_this_); | |||
| _this_->setState(key, value); | |||
| #else | |||
| # else | |||
| Q_UNUSED(ptr); | |||
| Q_UNUSED(key); | |||
| Q_UNUSED(value); | |||
| #endif | |||
| # endif | |||
| } | |||
| static void uiEditParameterCallback(void* ptr, uint32_t index, bool started) | |||
| @@ -121,18 +163,18 @@ private: | |||
| static void uiSendNoteCallback(void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velocity) | |||
| { | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| # if DISTRHO_PLUGIN_IS_SYNTH | |||
| UICarla* _this_ = (UICarla*)ptr; | |||
| CARLA_ASSERT(_this_); | |||
| _this_->uiSendNote(onOff, channel, note, velocity); | |||
| #else | |||
| # else | |||
| Q_UNUSED(ptr); | |||
| Q_UNUSED(onOff); | |||
| Q_UNUSED(channel); | |||
| Q_UNUSED(note); | |||
| Q_UNUSED(velocity); | |||
| #endif | |||
| # endif | |||
| } | |||
| static void uiResizeCallback(void* ptr, unsigned int width, unsigned int height) | |||
| @@ -142,25 +184,29 @@ private: | |||
| _this_->uiResize(width, height); | |||
| } | |||
| friend class PluginCarla; | |||
| }; | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| // Carla Plugin | |||
| class PluginCarla : public PluginDescriptorClass | |||
| { | |||
| public: | |||
| PluginCarla(const HostDescriptor* host) | |||
| : PluginDescriptorClass(host), | |||
| m_host(host) | |||
| PluginCarla(const HostDescriptor* const host) | |||
| : PluginDescriptorClass(host) | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| uiPtr = nullptr; | |||
| #endif | |||
| } | |||
| ~PluginCarla() | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| if (uiPtr) | |||
| delete uiPtr; | |||
| #endif | |||
| } | |||
| protected: | |||
| @@ -172,12 +218,15 @@ protected: | |||
| return plugin.parameterCount(); | |||
| } | |||
| const ::Parameter* getParameterInfo(uint32_t index) | |||
| const ::Parameter* getParameterInfo(const uint32_t index) | |||
| { | |||
| static ::Parameter param; | |||
| // reset | |||
| param.hints = ::PARAMETER_IS_ENABLED; | |||
| { | |||
| uint32_t paramHints = plugin.parameterHints(index); | |||
| const uint32_t paramHints = plugin.parameterHints(index); | |||
| if (paramHints & PARAMETER_IS_AUTOMABLE) | |||
| param.hints |= ::PARAMETER_IS_AUTOMABLE; | |||
| @@ -195,7 +244,8 @@ protected: | |||
| param.unit = plugin.parameterUnit(index); | |||
| { | |||
| const ParameterRanges* ranges(plugin.parameterRanges(index)); | |||
| const ParameterRanges* const ranges(plugin.parameterRanges(index)); | |||
| param.ranges.def = ranges->def; | |||
| param.ranges.min = ranges->min; | |||
| param.ranges.max = ranges->max; | |||
| @@ -210,7 +260,7 @@ protected: | |||
| return ¶m; | |||
| } | |||
| float getParameterValue(uint32_t index) | |||
| float getParameterValue(const uint32_t index) | |||
| { | |||
| return plugin.parameterValue(index); | |||
| } | |||
| @@ -224,7 +274,7 @@ protected: | |||
| return plugin.programCount(); | |||
| } | |||
| virtual const ::MidiProgram* getMidiProgramInfo(uint32_t index) | |||
| virtual const ::MidiProgram* getMidiProgramInfo(const uint32_t index) | |||
| { | |||
| static ::MidiProgram midiProgram; | |||
| midiProgram.bank = index / 128; | |||
| @@ -237,21 +287,25 @@ protected: | |||
| // ------------------------------------------------------------------- | |||
| // Plugin state calls | |||
| void setParameterValue(uint32_t index, float value) | |||
| void setParameterValue(const uint32_t index, const float value) | |||
| { | |||
| plugin.setParameterValue(index, value); | |||
| } | |||
| #if DISTRHO_PLUGIN_WANT_PROGRAMS | |||
| void setMidiProgram(uint32_t bank, uint32_t program) | |||
| void setMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| uint32_t realProgram = bank * 128 + program; | |||
| const uint32_t realProgram = bank * 128 + program; | |||
| if (realProgram >= plugin.programCount()) | |||
| return; | |||
| plugin.setProgram(realProgram); | |||
| } | |||
| #endif | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| void setCustomData(const char* key, const char* value) | |||
| void setCustomData(const char* const key, const char* const value) | |||
| { | |||
| plugin.setState(key, value); | |||
| } | |||
| @@ -261,42 +315,42 @@ protected: | |||
| // Plugin UI calls | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| void uiShow(bool show) | |||
| void uiShow(const bool show) | |||
| { | |||
| if (show) | |||
| createUiIfNeeded(); | |||
| //if (uiPtr) | |||
| // uiPtr->setVisible(show); | |||
| if (uiPtr) | |||
| uiPtr->carla_show(show); | |||
| } | |||
| void uiIdle() | |||
| { | |||
| if (uiPtr) | |||
| uiPtr->ui.idle(); | |||
| uiPtr->carla_idle(); | |||
| } | |||
| void uiSetParameterValue(uint32_t index, float value) | |||
| void uiSetParameterValue(const uint32_t index, const float value) | |||
| { | |||
| if (uiPtr) | |||
| uiPtr->ui.parameterChanged(index, value); | |||
| uiPtr->carla_setParameterValue(index, value); | |||
| } | |||
| # if DISTRHO_PLUGIN_WANT_PROGRAMS | |||
| void uiSetMidiProgram(uint32_t bank, uint32_t program) | |||
| void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| uint32_t realProgram = bank * 128 + program; | |||
| if (uiPtr) | |||
| uiPtr->ui.programChanged(realProgram); | |||
| uiPtr->carla_setMidiProgram(realProgram); | |||
| } | |||
| # endif | |||
| # if DISTRHO_PLUGIN_WANT_STATE | |||
| void uiSetCustomData(const char* key, const char* value) | |||
| void uiSetCustomData(const char* const key, const char* const value) | |||
| { | |||
| if (uiPtr) | |||
| uiPtr->ui.stateChanged(key, value); | |||
| uiPtr->carla_setCustomData(key, value); | |||
| } | |||
| # endif | |||
| #endif | |||
| @@ -314,30 +368,51 @@ protected: | |||
| plugin.deactivate(); | |||
| } | |||
| void process(float**, float**, uint32_t, uint32_t, ::MidiEvent*) | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const ::MidiEvent* const midiEvents) | |||
| { | |||
| for (uint32_t i=0; i < midiEventCount && i < MAX_MIDI_EVENTS; i++) | |||
| { | |||
| const ::MidiEvent* midiEvent = &midiEvents[i]; | |||
| MidiEvent* realEvent = &realMidiEvents[i]; | |||
| realEvent->buffer[0] = midiEvent->data[0]; | |||
| realEvent->buffer[1] = midiEvent->data[1]; | |||
| realEvent->buffer[2] = midiEvent->data[2]; | |||
| realEvent->frame = midiEvent->time; | |||
| } | |||
| plugin.run(inBuffer, outBuffer, frames, midiEventCount, realMidiEvents); | |||
| } | |||
| #else | |||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t, const ::MidiEvent* const) | |||
| { | |||
| //plugin->d_run(); | |||
| plugin.run(inBuffer, outBuffer, frames, 0, nullptr); | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| PluginInternal plugin; | |||
| const HostDescriptor* const m_host; | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| MidiEvent realMidiEvents[MAX_MIDI_EVENTS]; | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| // UI | |||
| UICarla* uiPtr; | |||
| #endif | |||
| void createUiIfNeeded() | |||
| { | |||
| if (! uiPtr) | |||
| { | |||
| setLastUiSampleRate(getSampleRate()); | |||
| uiPtr = new UICarla(m_host, &plugin, 0); | |||
| uiPtr = new UICarla(getHostHandle(), &plugin); | |||
| } | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| @@ -20,7 +20,7 @@ | |||
| class MidiSplitPlugin : public PluginDescriptorClass | |||
| { | |||
| public: | |||
| MidiSplitPlugin(const HostDescriptor* host) | |||
| MidiSplitPlugin(const HostDescriptor* const host) | |||
| : PluginDescriptorClass(host) | |||
| { | |||
| } | |||
| @@ -33,48 +33,38 @@ protected: | |||
| // ------------------------------------------------------------------- | |||
| // Plugin process calls | |||
| void activate() | |||
| void process(float**, float**, const uint32_t, const uint32_t midiEventCount, const MidiEvent* const midiEvents) | |||
| { | |||
| //memset(events, 0, sizeof(MidiEvent) * MAX_MIDI_EVENTS); | |||
| } | |||
| void process(float**, float**, uint32_t, uint32_t midiEventCount, MidiEvent* midiEvents) | |||
| { | |||
| MidiEvent midiEvent; | |||
| for (uint32_t i=0; i < midiEventCount; i++) | |||
| { | |||
| memcpy(&midiEvent, &midiEvents[i], sizeof(MidiEvent)); | |||
| memcpy(&m_midiEvent, &midiEvents[i], sizeof(MidiEvent)); | |||
| uint8_t status = midiEvent.data[0]; | |||
| uint8_t channel = status & 0x0F; | |||
| const uint8_t status = m_midiEvent.data[0] & 0xF0; | |||
| const uint8_t channel = status & 0x0F; | |||
| CARLA_ASSERT(channel < 16); | |||
| if (channel >= 16) | |||
| continue; | |||
| status -= channel; | |||
| midiEvent.port = channel; | |||
| midiEvent.data[0] = status; | |||
| m_midiEvent.port = channel; | |||
| m_midiEvent.data[0] = status; | |||
| writeMidiEvent(&midiEvent); | |||
| writeMidiEvent(&m_midiEvent); | |||
| } | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| //static const unsigned short MAX_MIDI_EVENTS = 512; | |||
| //MidiEvent events[MAX_MIDI_EVENTS]; | |||
| MidiEvent m_midiEvent; | |||
| PluginDescriptorClassEND(MidiSplitPlugin) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| static PluginDescriptor midiSplitDesc = { | |||
| static const PluginDescriptor midiSplitDesc = { | |||
| /* category */ PLUGIN_CATEGORY_UTILITY, | |||
| /* hints */ 0x0, | |||
| /* audioIns */ 0, | |||
| @@ -15,11 +15,13 @@ | |||
| * For a full copy of the GNU General Public License see the COPYING file | |||
| */ | |||
| // for UINT32_MAX | |||
| #define __STDC_LIMIT_MACROS | |||
| #include <cstdint> | |||
| #include "carla_midi.h" | |||
| #include "carla_native.hpp" | |||
| #include <climits> | |||
| #include "zynaddsubfx/Misc/Master.h" | |||
| #include "zynaddsubfx/Misc/Util.h" | |||
| @@ -40,21 +42,18 @@ class ZynAddSubFxPlugin : public PluginDescriptorClass | |||
| { | |||
| public: | |||
| enum Parameters { | |||
| PARAMETER_MASTER, | |||
| PARAMETER_MAX | |||
| PARAMETER_COUNT = 0 | |||
| }; | |||
| ZynAddSubFxPlugin(const HostDescriptor* host) | |||
| ZynAddSubFxPlugin(const HostDescriptor* const host) | |||
| : PluginDescriptorClass(host) | |||
| { | |||
| qDebug("ZynAddSubFxPlugin::ZynAddSubFxPlugin(), s_instanceCount=%i", s_instanceCount); | |||
| m_master = new Master; | |||
| // refresh banks | |||
| m_master->bank.rescanforbanks(); | |||
| for (size_t i=0, size = m_master->bank.banks.size(); i < size; i++) | |||
| for (uint32_t i=0, size = m_master->bank.banks.size(); i < size; i++) | |||
| { | |||
| if (m_master->bank.banks[i].dir.empty()) | |||
| continue; | |||
| @@ -63,15 +62,12 @@ public: | |||
| for (unsigned int instrument = 0; instrument < BANK_SIZE; instrument++) | |||
| { | |||
| const std::string insName = m_master->bank.getname(instrument); | |||
| const std::string insName(m_master->bank.getname(instrument)); | |||
| if (insName.empty() || insName[0] == '\0' || insName[0] == ' ') | |||
| continue; | |||
| ProgramInfo pInfo; | |||
| pInfo.bank = i; | |||
| pInfo.prog = instrument; | |||
| pInfo.name = insName; | |||
| ProgramInfo pInfo = { i, instrument, CarlaString(insName.c_str()) }; | |||
| m_programs.push_back(pInfo); | |||
| } | |||
| } | |||
| @@ -79,8 +75,6 @@ public: | |||
| ~ZynAddSubFxPlugin() | |||
| { | |||
| qDebug("ZynAddSubFxPlugin::~ZynAddSubFxPlugin(), s_instanceCount=%i", s_instanceCount); | |||
| //ensure that everything has stopped with the mutex wait | |||
| pthread_mutex_lock(&m_master->mutex); | |||
| pthread_mutex_unlock(&m_master->mutex); | |||
| @@ -96,15 +90,15 @@ protected: | |||
| uint32_t getParameterCount() | |||
| { | |||
| return PARAMETER_MAX; | |||
| return PARAMETER_COUNT; | |||
| } | |||
| const Parameter* getParameterInfo(uint32_t index) | |||
| const Parameter* getParameterInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| if (index >= PARAMETER_MAX) | |||
| return nullptr; | |||
| //if (index >= PARAMETER_COUNT) | |||
| return nullptr; | |||
| static Parameter param; | |||
| @@ -116,6 +110,7 @@ protected: | |||
| switch (index) | |||
| { | |||
| #if 0 | |||
| case PARAMETER_MASTER: | |||
| param.hints = PARAMETER_IS_ENABLED | PARAMETER_IS_AUTOMABLE; | |||
| param.name = "Master Volume"; | |||
| @@ -124,17 +119,20 @@ protected: | |||
| param.ranges.max = 100.0f; | |||
| param.ranges.def = 100.0f; | |||
| break; | |||
| #endif | |||
| } | |||
| return ¶m; | |||
| } | |||
| float getParameterValue(uint32_t index) | |||
| float getParameterValue(const uint32_t index) | |||
| { | |||
| switch (index) | |||
| { | |||
| #if 0 | |||
| case PARAMETER_MASTER: | |||
| return m_master->Pvolume; | |||
| #endif | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| @@ -148,19 +146,19 @@ protected: | |||
| return m_programs.size(); | |||
| } | |||
| const MidiProgram* getMidiProgramInfo(uint32_t index) | |||
| const MidiProgram* getMidiProgramInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||
| if (index >= m_programs.size()) | |||
| return nullptr; | |||
| const ProgramInfo pInfo(m_programs[index]); | |||
| const ProgramInfo& pInfo(m_programs[index]); | |||
| static MidiProgram midiProgram; | |||
| midiProgram.bank = pInfo.bank; | |||
| midiProgram.program = pInfo.prog; | |||
| midiProgram.name = pInfo.name.c_str(); | |||
| midiProgram.name = pInfo.name; | |||
| return &midiProgram; | |||
| } | |||
| @@ -168,17 +166,15 @@ protected: | |||
| // ------------------------------------------------------------------- | |||
| // Plugin state calls | |||
| void setParameterValue(uint32_t index, float value) | |||
| void setParameterValue(const uint32_t index, const float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case PARAMETER_MASTER: | |||
| m_master->setPvolume((char)rint(value)); | |||
| break; | |||
| } | |||
| Q_UNUSED(value); | |||
| } | |||
| void setMidiProgram(uint32_t bank, uint32_t program) | |||
| void setMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| if (bank >= m_master->bank.banks.size()) | |||
| return; | |||
| @@ -206,70 +202,70 @@ protected: | |||
| m_master->setController(0, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
| } | |||
| void process(float**, float** outBuffer, uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents) | |||
| void process(float**, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const MidiEvent* const midiEvents) | |||
| { | |||
| unsigned long from_frame = 0; | |||
| unsigned long event_index = 0; | |||
| unsigned long next_event_frame = 0; | |||
| unsigned long to_frame = 0; | |||
| uint32_t fromFrame = 0; | |||
| uint32_t eventIndex = 0; | |||
| uint32_t nextEventFrame = 0; | |||
| uint32_t toFrame = 0; | |||
| pthread_mutex_lock(&m_master->mutex); | |||
| do { | |||
| /* Find the time of the next event, if any */ | |||
| if (event_index >= midiEventCount) | |||
| next_event_frame = ULONG_MAX; | |||
| // Find the time of the next event, if any | |||
| if (eventIndex >= midiEventCount) | |||
| nextEventFrame = UINT32_MAX; | |||
| else | |||
| next_event_frame = midiEvents[event_index].time; | |||
| nextEventFrame = midiEvents[eventIndex].time; | |||
| /* find the end of the sub-sample to be processed this time round... */ | |||
| /* if the next event falls within the desired sample interval... */ | |||
| if ((next_event_frame < frames) && (next_event_frame >= to_frame)) | |||
| /* set the end to be at that event */ | |||
| to_frame = next_event_frame; | |||
| // find the end of the sub-sample to be processed this time round... | |||
| // if the next event falls within the desired sample interval... | |||
| if ((nextEventFrame < frames) && (nextEventFrame >= toFrame)) | |||
| // set the end to be at that event | |||
| toFrame = nextEventFrame; | |||
| else | |||
| /* ...else go for the whole remaining sample */ | |||
| to_frame = frames; | |||
| // ...else go for the whole remaining sample | |||
| toFrame = frames; | |||
| if (from_frame < to_frame) | |||
| if (fromFrame < toFrame) | |||
| { | |||
| // call master to fill from `from_frame` to `to_frame`: | |||
| m_master->GetAudioOutSamples(to_frame - from_frame, (int)getSampleRate(), &outBuffer[0][from_frame], &outBuffer[1][from_frame]); | |||
| // call master to fill from `fromFrame` to `toFrame`: | |||
| m_master->GetAudioOutSamples(toFrame - fromFrame, (unsigned)getSampleRate(), &outBuffer[0][fromFrame], &outBuffer[1][fromFrame]); | |||
| // next sub-sample please... | |||
| from_frame = to_frame; | |||
| fromFrame = toFrame; | |||
| } | |||
| // Now process any event(s) at the current timing point | |||
| while (event_index < midiEventCount && midiEvents[event_index].time == to_frame) | |||
| while (eventIndex < midiEventCount && midiEvents[eventIndex].time == toFrame) | |||
| { | |||
| uint8_t status = midiEvents[event_index].data[0]; | |||
| uint8_t status = midiEvents[eventIndex].data[0]; | |||
| uint8_t channel = status & 0x0F; | |||
| if (MIDI_IS_STATUS_NOTE_OFF(status)) | |||
| { | |||
| uint8_t note = midiEvents[event_index].data[1]; | |||
| uint8_t note = midiEvents[eventIndex].data[1]; | |||
| m_master->noteOff(channel, note); | |||
| } | |||
| else if (MIDI_IS_STATUS_NOTE_ON(status)) | |||
| { | |||
| uint8_t note = midiEvents[event_index].data[1]; | |||
| uint8_t velo = midiEvents[event_index].data[2]; | |||
| uint8_t note = midiEvents[eventIndex].data[1]; | |||
| uint8_t velo = midiEvents[eventIndex].data[2]; | |||
| m_master->noteOn(channel, note, velo); | |||
| } | |||
| else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status)) | |||
| { | |||
| uint8_t note = midiEvents[event_index].data[1]; | |||
| uint8_t pressure = midiEvents[event_index].data[2]; | |||
| uint8_t note = midiEvents[eventIndex].data[1]; | |||
| uint8_t pressure = midiEvents[eventIndex].data[2]; | |||
| m_master->polyphonicAftertouch(channel, note, pressure); | |||
| } | |||
| event_index++; | |||
| eventIndex++; | |||
| } | |||
| // Keep going until we have the desired total length of sample... | |||
| } while (to_frame < frames); | |||
| } while (toFrame < frames); | |||
| pthread_mutex_unlock(&m_master->mutex); | |||
| } | |||
| @@ -280,7 +276,7 @@ private: | |||
| struct ProgramInfo { | |||
| uint32_t bank; | |||
| uint32_t prog; | |||
| std::string name; | |||
| CarlaString name; | |||
| }; | |||
| std::vector<ProgramInfo> m_programs; | |||
| @@ -331,14 +327,14 @@ int ZynAddSubFxPlugin::s_instanceCount = 0; | |||
| // ----------------------------------------------------------------------- | |||
| static PluginDescriptor zynAddSubFxDesc = { | |||
| static const PluginDescriptor zynAddSubFxDesc = { | |||
| /* category */ PLUGIN_CATEGORY_SYNTH, | |||
| /* hints */ PLUGIN_IS_SYNTH | PLUGIN_USES_SINGLE_THREAD, | |||
| /* hints */ PLUGIN_IS_SYNTH, | |||
| /* audioIns */ 2, | |||
| /* audioOuts */ 2, | |||
| /* midiIns */ 1, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZynAddSubFxPlugin::PARAMETER_MAX, | |||
| /* paramIns */ ZynAddSubFxPlugin::PARAMETER_COUNT, | |||
| /* paramOuts */ 0, | |||
| /* name */ "ZynAddSubFX", | |||
| /* label */ "zynaddsubfx", | |||
| @@ -167,7 +167,7 @@ protected: | |||
| // Process | |||
| virtual void d_activate() = 0; | |||
| virtual void d_deactivate() = 0; | |||
| virtual void d_run(const float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) = 0; | |||
| virtual void d_run(float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) = 0; | |||
| // Callbacks | |||
| virtual void d_bufferSizeChanged(uint32_t newBufferSize); | |||
| @@ -293,7 +293,7 @@ public: | |||
| plugin->d_deactivate(); | |||
| } | |||
| void run(const float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) | |||
| void run(float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) | |||
| { | |||
| assert(plugin && frames >= 2); | |||
| @@ -195,9 +195,6 @@ public: | |||
| void ladspa_run(unsigned long bufferSize) | |||
| #endif | |||
| { | |||
| if (bufferSize <= 1) | |||
| return; | |||
| // Check for updated bufferSize | |||
| if (bufferSize != lastBufferSize) | |||
| { | |||
| @@ -230,7 +227,7 @@ public: | |||
| snd_seq_event_t* event = &events[i]; | |||
| memset(&midiEvents[midiEventCount], 0, sizeof(MidiEvent)); | |||
| if (events[i].type == SND_SEQ_EVENT_NOTEON) | |||
| if (event->type == SND_SEQ_EVENT_NOTEON) | |||
| { | |||
| j = midiEventCount++; | |||
| midiEvents[j].frame = event->time.tick; | |||
| @@ -238,14 +235,14 @@ public: | |||
| midiEvents[j].buffer[1] = event->data.note.note; | |||
| midiEvents[j].buffer[2] = event->data.note.velocity; | |||
| } | |||
| else if (events[i].type == SND_SEQ_EVENT_NOTEOFF) | |||
| else if (event->type == SND_SEQ_EVENT_NOTEOFF) | |||
| { | |||
| j = midiEventCount++; | |||
| midiEvents[j].frame = event->time.tick; | |||
| midiEvents[j].buffer[0] = 0x80 + event->data.note.channel; | |||
| midiEvents[j].buffer[1] = event->data.note.note; | |||
| } | |||
| else if (events[i].type == SND_SEQ_EVENT_KEYPRESS) | |||
| else if (event->type == SND_SEQ_EVENT_KEYPRESS) | |||
| { | |||
| j = midiEventCount++; | |||
| midiEvents[j].frame = event->time.tick; | |||
| @@ -253,7 +250,7 @@ public: | |||
| midiEvents[j].buffer[1] = event->data.note.note; | |||
| midiEvents[j].buffer[2] = event->data.note.velocity; | |||
| } | |||
| else if (events[i].type == SND_SEQ_EVENT_CONTROLLER) | |||
| else if (event->type == SND_SEQ_EVENT_CONTROLLER) | |||
| { | |||
| j = midiEventCount++; | |||
| midiEvents[j].frame = event->time.tick; | |||
| @@ -261,14 +258,14 @@ public: | |||
| midiEvents[j].buffer[1] = event->data.control.param; | |||
| midiEvents[j].buffer[2] = event->data.control.value; | |||
| } | |||
| else if (events[i].type == SND_SEQ_EVENT_CHANPRESS) | |||
| else if (event->type == SND_SEQ_EVENT_CHANPRESS) | |||
| { | |||
| j = midiEventCount++; | |||
| midiEvents[j].frame = event->time.tick; | |||
| midiEvents[j].buffer[0] = 0xD0 + event->data.control.channel; | |||
| midiEvents[j].buffer[1] = event->data.control.value; | |||
| } | |||
| else if (events[i].type == SND_SEQ_EVENT_PITCHBEND) | |||
| else if (event->type == SND_SEQ_EVENT_PITCHBEND) | |||
| { | |||
| // TODO | |||
| //j = midiEventCount++; | |||
| @@ -348,7 +345,7 @@ private: | |||
| static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, unsigned long sampleRate) | |||
| { | |||
| if (d_lastBufferSize == 0) | |||
| d_lastBufferSize = 512; | |||
| d_lastBufferSize = 2048; | |||
| d_lastSampleRate = sampleRate; | |||
| return new PluginLadspaDssi(); | |||
| @@ -507,6 +507,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t | |||
| if (doInternalInit) | |||
| { | |||
| // set valid but dummy values | |||
| d_lastBufferSize = 512; | |||
| d_lastSampleRate = 44100.0; | |||
| } | |||
| @@ -516,6 +517,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t | |||
| if (doInternalInit) | |||
| { | |||
| // unset | |||
| d_lastBufferSize = 0; | |||
| d_lastSampleRate = 0.0; | |||
| @@ -241,7 +241,7 @@ protected: | |||
| while (lo_server_recv_noblock(oscData->server, 0) != 0) {} | |||
| } | |||
| QObject::timerEvent(event); | |||
| QMainWindow::timerEvent(event); | |||
| } | |||
| private: | |||
| @@ -307,7 +307,7 @@ private: | |||
| // ------------------------------------------------- | |||
| static UIDssi* globalUI = nullptr; | |||
| static UIDssi* globalUI = nullptr; | |||
| void osc_error_handler(int num, const char* msg, const char* path) | |||
| { | |||
| @@ -199,7 +199,7 @@ protected: | |||
| #endif | |||
| private: | |||
| UIInternal ui; | |||
| UIInternal ui; | |||
| // LV2 Stuff | |||
| LV2UI_Controller const lv2Controller; | |||