| @@ -0,0 +1,408 @@ | |||||
| /* | |||||
| * Carla Native Plugin API | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the COPYING file | |||||
| */ | |||||
| #ifndef __CARLA_NATIVE_HPP__ | |||||
| #define __CARLA_NATIVE_HPP__ | |||||
| #include "carla_native.h" | |||||
| #include "carla_utils.hpp" | |||||
| /*! | |||||
| * @defgroup CarlaNativeAPI Carla Native API | |||||
| * @{ | |||||
| */ | |||||
| class PluginDescriptorClass | |||||
| { | |||||
| public: | |||||
| PluginDescriptorClass(const HostDescriptor* const host) | |||||
| : m_host(host) | |||||
| { | |||||
| } | |||||
| virtual ~PluginDescriptorClass() | |||||
| { | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| // Host calls | |||||
| const HostDescriptor* getHostHandle() const | |||||
| { | |||||
| return m_host; | |||||
| } | |||||
| uint32_t getBufferSize() const | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| return m_host->get_buffer_size(m_host->handle); | |||||
| return 0; | |||||
| } | |||||
| double getSampleRate() const | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| return m_host->get_sample_rate(m_host->handle); | |||||
| return 0.0; | |||||
| } | |||||
| const TimeInfo* getTimeInfo() const | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| return m_host->get_time_info(m_host->handle); | |||||
| return nullptr; | |||||
| } | |||||
| void writeMidiEvent(const MidiEvent* const event) | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| m_host->write_midi_event(m_host->handle, event); | |||||
| } | |||||
| void uiParameterChanged(const uint32_t index, const float value) | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| m_host->ui_parameter_changed(m_host->handle, index, value); | |||||
| } | |||||
| void uiMidiProgramChanged(const uint32_t bank, const uint32_t program) | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| 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() | |||||
| { | |||||
| CARLA_ASSERT(m_host); | |||||
| if (m_host) | |||||
| m_host->ui_closed(m_host->handle); | |||||
| } | |||||
| protected: | |||||
| // ------------------------------------------------------------------- | |||||
| // Plugin parameter calls | |||||
| virtual uint32_t getParameterCount() | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| virtual const Parameter* getParameterInfo(const uint32_t index) | |||||
| { | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return nullptr; | |||||
| // unused | |||||
| Q_UNUSED(index); | |||||
| } | |||||
| virtual float getParameterValue(const uint32_t index) | |||||
| { | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return 0.0f; | |||||
| // unused | |||||
| Q_UNUSED(index); | |||||
| } | |||||
| virtual const char* getParameterText(const uint32_t index) | |||||
| { | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return nullptr; | |||||
| // unused | |||||
| Q_UNUSED(index); | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| // Plugin midi-program calls | |||||
| virtual uint32_t getMidiProgramCount() | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| virtual const MidiProgram* getMidiProgramInfo(const uint32_t index) | |||||
| { | |||||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||||
| return nullptr; | |||||
| // unused | |||||
| Q_UNUSED(index); | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| // Plugin state calls | |||||
| virtual void setParameterValue(const uint32_t index, const float value) | |||||
| { | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(index); | |||||
| Q_UNUSED(value); | |||||
| } | |||||
| virtual void setMidiProgram(const uint32_t bank, const uint32_t program) | |||||
| { | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(bank); | |||||
| Q_UNUSED(program); | |||||
| } | |||||
| virtual void setCustomData(const char* const key, const char* const value) | |||||
| { | |||||
| CARLA_ASSERT(key); | |||||
| CARLA_ASSERT(value); | |||||
| return; | |||||
| // unused | |||||
| CARLA_ASSERT(key); | |||||
| CARLA_ASSERT(value); | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| // Plugin process calls | |||||
| virtual void activate() | |||||
| { | |||||
| } | |||||
| virtual void deactivate() | |||||
| { | |||||
| } | |||||
| virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const MidiEvent* const midiEvents) = 0; | |||||
| // ------------------------------------------------------------------- | |||||
| // Plugin UI calls | |||||
| virtual void uiShow(const bool show) | |||||
| { | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(show); | |||||
| } | |||||
| virtual void uiIdle() | |||||
| { | |||||
| } | |||||
| virtual void uiSetParameterValue(const uint32_t index, const float value) | |||||
| { | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(value); | |||||
| } | |||||
| virtual void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | |||||
| { | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(bank); | |||||
| Q_UNUSED(program); | |||||
| } | |||||
| virtual void uiSetCustomData(const char* const key, const char* const value) | |||||
| { | |||||
| CARLA_ASSERT(key); | |||||
| CARLA_ASSERT(value); | |||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(key); | |||||
| Q_UNUSED(value); | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| private: | |||||
| const HostDescriptor* const m_host; | |||||
| // ------------------------------------------------------------------- | |||||
| #ifndef DOXYGEN | |||||
| public: | |||||
| #define handlePtr ((PluginDescriptorClass*)handle) | |||||
| static uint32_t _get_parameter_count(PluginHandle handle) | |||||
| { | |||||
| return handlePtr->getParameterCount(); | |||||
| } | |||||
| static const Parameter* _get_parameter_info(PluginHandle handle, uint32_t index) | |||||
| { | |||||
| return handlePtr->getParameterInfo(index); | |||||
| } | |||||
| static float _get_parameter_value(PluginHandle handle, uint32_t index) | |||||
| { | |||||
| return handlePtr->getParameterValue(index); | |||||
| } | |||||
| static const char* _get_parameter_text(PluginHandle handle, uint32_t index) | |||||
| { | |||||
| return handlePtr->getParameterText(index); | |||||
| } | |||||
| static uint32_t _get_midi_program_count(PluginHandle handle) | |||||
| { | |||||
| return handlePtr->getMidiProgramCount(); | |||||
| } | |||||
| static const MidiProgram* _get_midi_program_info(PluginHandle handle, uint32_t index) | |||||
| { | |||||
| return handlePtr->getMidiProgramInfo(index); | |||||
| } | |||||
| static void _set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||||
| { | |||||
| return handlePtr->setParameterValue(index, value); | |||||
| } | |||||
| static void _set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program) | |||||
| { | |||||
| return handlePtr->setMidiProgram(bank, program); | |||||
| } | |||||
| static void _set_custom_data(PluginHandle handle, const char* key, const char* value) | |||||
| { | |||||
| return handlePtr->setCustomData(key, value); | |||||
| } | |||||
| static void _ui_show(PluginHandle handle, bool show) | |||||
| { | |||||
| return handlePtr->uiShow(show); | |||||
| } | |||||
| static void _ui_idle(PluginHandle handle) | |||||
| { | |||||
| return handlePtr->uiIdle(); | |||||
| } | |||||
| static void _ui_set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||||
| { | |||||
| return handlePtr->uiSetParameterValue(index, value); | |||||
| } | |||||
| static void _ui_set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program) | |||||
| { | |||||
| return handlePtr->uiSetMidiProgram(bank, program); | |||||
| } | |||||
| static void _ui_set_custom_data(PluginHandle handle, const char* key, const char* value) | |||||
| { | |||||
| return handlePtr->uiSetCustomData(key, value); | |||||
| } | |||||
| static void _activate(PluginHandle handle) | |||||
| { | |||||
| handlePtr->activate(); | |||||
| } | |||||
| static void _deactivate(PluginHandle handle) | |||||
| { | |||||
| handlePtr->deactivate(); | |||||
| } | |||||
| static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) | |||||
| { | |||||
| return handlePtr->process(inBuffer, outBuffer, frames, midiEventCount, midiEvents); | |||||
| } | |||||
| #undef handlePtr | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginDescriptorClass) | |||||
| #endif | |||||
| }; | |||||
| /**@}*/ | |||||
| // ----------------------------------------------------------------------- | |||||
| #define PluginDescriptorClassEND(className) \ | |||||
| public: \ | |||||
| static PluginHandle _instantiate(const PluginDescriptor*, HostDescriptor* host) \ | |||||
| { \ | |||||
| return new className(host); \ | |||||
| } \ | |||||
| static void _cleanup(PluginHandle handle) \ | |||||
| { \ | |||||
| delete (className*)handle; \ | |||||
| } | |||||
| #define PluginDescriptorFILL(className) \ | |||||
| className::_instantiate, \ | |||||
| className::_cleanup, \ | |||||
| className::_get_parameter_count, \ | |||||
| className::_get_parameter_info, \ | |||||
| className::_get_parameter_value, \ | |||||
| className::_get_parameter_text, \ | |||||
| className::_get_midi_program_count, \ | |||||
| className::_get_midi_program_info, \ | |||||
| className::_set_parameter_value, \ | |||||
| className::_set_midi_program, \ | |||||
| className::_set_custom_data, \ | |||||
| className::_ui_show, \ | |||||
| className::_ui_idle, \ | |||||
| className::_ui_set_parameter_value, \ | |||||
| className::_ui_set_midi_program, \ | |||||
| className::_ui_set_custom_data, \ | |||||
| className::_activate, \ | |||||
| className::_deactivate, \ | |||||
| className::_process | |||||
| #endif // __CARLA_NATIVE_HPP__ | |||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -9,7 +9,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -9,7 +9,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -9,7 +9,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -18,7 +18,7 @@ LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | |||||
| ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
| ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) | ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) | ||||
| ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml) | ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml) | ||||
| LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml) | |||||
| LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml) -lpthread | |||||
| endif | endif | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| @@ -73,9 +73,6 @@ distrho-3bandsplitter.cpp.o: distrho-3bandsplitter.cpp | |||||
| distrho-pingpongpan.cpp.o: distrho-pingpongpan.cpp | distrho-pingpongpan.cpp.o: distrho-pingpongpan.cpp | ||||
| $(CXX) $< $(BUILD_CXX_FLAGS) -Ipingpongpan -DDISTRHO_NAMESPACE=DISTRHO_PingPongPan -c -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -Ipingpongpan -DDISTRHO_NAMESPACE=DISTRHO_PingPongPan -c -o $@ | ||||
| # distrho-pugl.o: distrho-pugl.cpp | |||||
| # $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
| zynaddsubfx.cpp.o: zynaddsubfx.cpp | zynaddsubfx.cpp.o: zynaddsubfx.cpp | ||||
| $(CXX) $< $(ZYN_CXX_FLAGS) -c -o $@ | $(CXX) $< $(ZYN_CXX_FLAGS) -c -o $@ | ||||
| @@ -16,8 +16,9 @@ | |||||
| */ | */ | ||||
| #include "carla_native.hpp" | #include "carla_native.hpp" | ||||
| #include "carla_utils.hpp" | |||||
| #include <QtGui/QDialog> | |||||
| #include <QtGui/QMainWindow> | |||||
| #include "DistrhoPluginMain.cpp" | #include "DistrhoPluginMain.cpp" | ||||
| @@ -33,17 +34,20 @@ START_NAMESPACE_DISTRHO | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Carla UI | // Carla UI | ||||
| class UICarla : public QDialog | |||||
| class UICarla : public QMainWindow | |||||
| { | { | ||||
| public: | public: | ||||
| UICarla(const HostDescriptor* const host, PluginInternal* const plugin) | |||||
| : QDialog(nullptr), | |||||
| m_host(host), | |||||
| m_plugin(plugin), | |||||
| ui(this, (intptr_t)winId(), setParameterCallback, setStateCallback, uiEditParameterCallback, uiSendNoteCallback, uiResizeCallback) | |||||
| { | |||||
| UICarla(const HostDescriptor* const host_, PluginInternal* const plugin_) | |||||
| : QMainWindow(nullptr), | |||||
| host(host_), | |||||
| plugin(plugin_), | |||||
| widget(this), | |||||
| ui(this, (intptr_t)widget.winId(), setParameterCallback, setStateCallback, uiEditParameterCallback, uiSendNoteCallback, uiResizeCallback) | |||||
| { | |||||
| setCentralWidget(&widget); | |||||
| setFixedSize(ui.getWidth(), ui.getHeight()); | setFixedSize(ui.getWidth(), ui.getHeight()); | ||||
| setWindowTitle(DISTRHO_PLUGIN_NAME); | setWindowTitle(DISTRHO_PLUGIN_NAME); | ||||
| } | } | ||||
| ~UICarla() | ~UICarla() | ||||
| @@ -84,15 +88,15 @@ public: | |||||
| // --------------------------------------------- | // --------------------------------------------- | ||||
| protected: | protected: | ||||
| void setParameterValue(uint32_t index, float value) | |||||
| void setParameterValue(uint32_t rindex, float value) | |||||
| { | { | ||||
| m_host->ui_parameter_changed(m_host->handle, index, value); | |||||
| host->ui_parameter_changed(host->handle, rindex, value); | |||||
| } | } | ||||
| # if DISTRHO_PLUGIN_WANT_STATE | # if DISTRHO_PLUGIN_WANT_STATE | ||||
| void setState(const char* key, const char* value) | void setState(const char* key, const char* value) | ||||
| { | { | ||||
| m_host->ui_custom_data_changed(m_host->handle, key, value); | |||||
| host->ui_custom_data_changed(host->handle, key, value); | |||||
| } | } | ||||
| # endif | # endif | ||||
| @@ -115,14 +119,19 @@ protected: | |||||
| void closeEvent(QCloseEvent* event) | void closeEvent(QCloseEvent* event) | ||||
| { | { | ||||
| m_host->ui_closed(m_host->handle); | |||||
| QDialog::closeEvent(event); | |||||
| host->ui_closed(host->handle); | |||||
| // FIXME - ignore event? | |||||
| QMainWindow::closeEvent(event); | |||||
| } | } | ||||
| private: | private: | ||||
| // Plugin stuff | // Plugin stuff | ||||
| const HostDescriptor* const m_host; | |||||
| PluginInternal* const m_plugin; | |||||
| const HostDescriptor* const host; | |||||
| PluginInternal* const plugin; | |||||
| // Qt4 stuff | |||||
| QWidget widget; | |||||
| // UI | // UI | ||||
| UIInternal ui; | UIInternal ui; | ||||
| @@ -179,6 +188,8 @@ private: | |||||
| if (UICarla* _this_ = (UICarla*)ptr) | if (UICarla* _this_ = (UICarla*)ptr) | ||||
| _this_->uiResize(width, height); | _this_->uiResize(width, height); | ||||
| } | } | ||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UICarla) | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -199,8 +210,7 @@ public: | |||||
| ~PluginCarla() | ~PluginCarla() | ||||
| { | { | ||||
| #if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
| if (uiPtr) | |||||
| delete uiPtr; | |||||
| uiPtr = nullptr; | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -215,14 +225,18 @@ protected: | |||||
| const ::Parameter* getParameterInfo(const uint32_t index) | const ::Parameter* getParameterInfo(const uint32_t index) | ||||
| { | { | ||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| static ::Parameter param; | static ::Parameter param; | ||||
| // reset | // reset | ||||
| param.hints = ::PARAMETER_IS_ENABLED; | param.hints = ::PARAMETER_IS_ENABLED; | ||||
| param.scalePointCount = 0; | |||||
| param.scalePoints = nullptr; | |||||
| { | { | ||||
| const uint32_t paramHints = plugin.parameterHints(index); | |||||
| int nativeparamHints = 0; | int nativeparamHints = 0; | ||||
| const uint32_t paramHints = plugin.parameterHints(index); | |||||
| if (paramHints & PARAMETER_IS_AUTOMABLE) | if (paramHints & PARAMETER_IS_AUTOMABLE) | ||||
| nativeparamHints |= ::PARAMETER_IS_AUTOMABLE; | nativeparamHints |= ::PARAMETER_IS_AUTOMABLE; | ||||
| @@ -252,17 +266,18 @@ protected: | |||||
| param.ranges.stepLarge = ranges.stepLarge; | param.ranges.stepLarge = ranges.stepLarge; | ||||
| } | } | ||||
| param.scalePointCount = 0; | |||||
| param.scalePoints = nullptr; | |||||
| return ¶m; | return ¶m; | ||||
| } | } | ||||
| float getParameterValue(const uint32_t index) | float getParameterValue(const uint32_t index) | ||||
| { | { | ||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| return plugin.parameterValue(index); | return plugin.parameterValue(index); | ||||
| } | } | ||||
| // getParameterText unused | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin midi-program calls | // Plugin midi-program calls | ||||
| @@ -274,10 +289,17 @@ protected: | |||||
| virtual const ::MidiProgram* getMidiProgramInfo(const uint32_t index) | virtual const ::MidiProgram* getMidiProgramInfo(const uint32_t index) | ||||
| { | { | ||||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||||
| if (index >= plugin.programCount()) | |||||
| return nullptr; | |||||
| static ::MidiProgram midiProgram; | static ::MidiProgram midiProgram; | ||||
| midiProgram.bank = index / 128; | midiProgram.bank = index / 128; | ||||
| midiProgram.program = index % 128; | midiProgram.program = index % 128; | ||||
| midiProgram.name = plugin.programName(index); | midiProgram.name = plugin.programName(index); | ||||
| return &midiProgram; | return &midiProgram; | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -287,6 +309,8 @@ protected: | |||||
| void setParameterValue(const uint32_t index, const float value) | void setParameterValue(const uint32_t index, const float value) | ||||
| { | { | ||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| plugin.setParameterValue(index, value); | plugin.setParameterValue(index, value); | ||||
| } | } | ||||
| @@ -305,10 +329,51 @@ protected: | |||||
| #if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
| void setCustomData(const char* const key, const char* const value) | void setCustomData(const char* const key, const char* const value) | ||||
| { | { | ||||
| CARLA_ASSERT(key); | |||||
| CARLA_ASSERT(value); | |||||
| plugin.setState(key, value); | plugin.setState(key, value); | ||||
| } | } | ||||
| #endif | #endif | ||||
| // ------------------------------------------------------------------- | |||||
| // Plugin process calls | |||||
| void activate() | |||||
| { | |||||
| plugin.activate(); | |||||
| } | |||||
| void deactivate() | |||||
| { | |||||
| plugin.deactivate(); | |||||
| } | |||||
| #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) | |||||
| { | |||||
| uint32_t i; | |||||
| for (i=0; i < midiEventCount && i < MAX_MIDI_EVENTS; i++) | |||||
| { | |||||
| const ::MidiEvent* const midiEvent = &midiEvents[i]; | |||||
| MidiEvent* const realMidiEvent = &realMidiEvents[i]; | |||||
| realMidiEvent->buffer[0] = midiEvent->data[0]; | |||||
| realMidiEvent->buffer[1] = midiEvent->data[1]; | |||||
| realMidiEvent->buffer[2] = midiEvent->data[2]; | |||||
| realMidiEvent->frame = midiEvent->time; | |||||
| } | |||||
| plugin.run(inBuffer, outBuffer, frames, i, realMidiEvents); | |||||
| } | |||||
| #else | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t, const ::MidiEvent* const) | |||||
| { | |||||
| plugin.run(inBuffer, outBuffer, frames, 0, nullptr); | |||||
| } | |||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin UI calls | // Plugin UI calls | ||||
| @@ -318,28 +383,38 @@ protected: | |||||
| if (show) | if (show) | ||||
| createUiIfNeeded(); | createUiIfNeeded(); | ||||
| if (uiPtr) | |||||
| if (uiPtr != nullptr) | |||||
| uiPtr->carla_show(show); | uiPtr->carla_show(show); | ||||
| } | } | ||||
| void uiIdle() | void uiIdle() | ||||
| { | { | ||||
| if (uiPtr) | |||||
| CARLA_ASSERT(uiPtr); | |||||
| if (uiPtr != nullptr) | |||||
| uiPtr->carla_idle(); | uiPtr->carla_idle(); | ||||
| } | } | ||||
| void uiSetParameterValue(const uint32_t index, const float value) | void uiSetParameterValue(const uint32_t index, const float value) | ||||
| { | { | ||||
| if (uiPtr) | |||||
| CARLA_ASSERT(uiPtr); | |||||
| CARLA_ASSERT(index < getParameterCount()); | |||||
| if (uiPtr != nullptr) | |||||
| uiPtr->carla_setParameterValue(index, value); | uiPtr->carla_setParameterValue(index, value); | ||||
| } | } | ||||
| # if DISTRHO_PLUGIN_WANT_PROGRAMS | # if DISTRHO_PLUGIN_WANT_PROGRAMS | ||||
| void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | ||||
| { | { | ||||
| CARLA_ASSERT(uiPtr); | |||||
| uint32_t realProgram = bank * 128 + program; | uint32_t realProgram = bank * 128 + program; | ||||
| if (uiPtr) | |||||
| if (realProgram >= plugin.programCount()) | |||||
| return; | |||||
| if (uiPtr != nullptr) | |||||
| uiPtr->carla_setMidiProgram(realProgram); | uiPtr->carla_setMidiProgram(realProgram); | ||||
| } | } | ||||
| # endif | # endif | ||||
| @@ -347,49 +422,17 @@ protected: | |||||
| # if DISTRHO_PLUGIN_WANT_STATE | # if DISTRHO_PLUGIN_WANT_STATE | ||||
| void uiSetCustomData(const char* const key, const char* const value) | void uiSetCustomData(const char* const key, const char* const value) | ||||
| { | { | ||||
| if (uiPtr) | |||||
| CARLA_ASSERT(uiPtr); | |||||
| CARLA_ASSERT(key); | |||||
| CARLA_ASSERT(value); | |||||
| if (uiPtr != nullptr) | |||||
| uiPtr->carla_setCustomData(key, value); | uiPtr->carla_setCustomData(key, value); | ||||
| } | } | ||||
| # endif | # endif | ||||
| #endif | #endif | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin process calls | |||||
| void activate() | |||||
| { | |||||
| plugin.activate(); | |||||
| } | |||||
| void deactivate() | |||||
| { | |||||
| plugin.deactivate(); | |||||
| } | |||||
| #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.run(inBuffer, outBuffer, frames, 0, nullptr); | |||||
| } | |||||
| #endif | |||||
| // ------------------------------------------------------------------- | |||||
| private: | private: | ||||
| PluginInternal plugin; | PluginInternal plugin; | ||||
| @@ -400,11 +443,11 @@ private: | |||||
| #if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
| // UI | // UI | ||||
| UICarla* uiPtr; | |||||
| ScopedPointer<UICarla> uiPtr; | |||||
| void createUiIfNeeded() | void createUiIfNeeded() | ||||
| { | { | ||||
| if (! uiPtr) | |||||
| if (uiPtr == nullptr) | |||||
| { | { | ||||
| d_lastUiSampleRate = getSampleRate(); | d_lastUiSampleRate = getSampleRate(); | ||||
| uiPtr = new UICarla(getHostHandle(), &plugin); | uiPtr = new UICarla(getHostHandle(), &plugin); | ||||
| @@ -412,6 +455,8 @@ private: | |||||
| } | } | ||||
| #endif | #endif | ||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla) | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| public: | public: | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -9,7 +9,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | ||||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -9,7 +9,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU Lesser General Public | * modify it under the terms of the GNU Lesser General Public | ||||
| @@ -8,7 +8,7 @@ | |||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU Lesser General Public License for more details. | * GNU Lesser General Public License for more details. | ||||
| * | * | ||||
| * For a full copy of the license see the LGPL.txt file | * For a full copy of the license see the LGPL.txt file | ||||
| @@ -44,9 +44,8 @@ START_NAMESPACE_DISTRHO | |||||
| class PluginLadspaDssi | class PluginLadspaDssi | ||||
| { | { | ||||
| public: | public: | ||||
| PluginLadspaDssi() | |||||
| : lastBufferSize(d_lastBufferSize), | |||||
| lastSampleRate(d_lastSampleRate), | |||||
| PluginLadspaDssi(const double sampleRate) | |||||
| : lastSampleRate(sampleRate), | |||||
| portAudioIns{nullptr}, | portAudioIns{nullptr}, | ||||
| portAudioOuts{nullptr} | portAudioOuts{nullptr} | ||||
| { | { | ||||
| @@ -143,9 +142,11 @@ public: | |||||
| return nullptr; | return nullptr; | ||||
| static DSSI_Program_Descriptor desc; | static DSSI_Program_Descriptor desc; | ||||
| desc.Bank = index / 128; | desc.Bank = index / 128; | ||||
| desc.Program = index % 128; | desc.Program = index % 128; | ||||
| desc.Name = plugin.programName(index); | desc.Name = plugin.programName(index); | ||||
| return &desc; | return &desc; | ||||
| } | } | ||||
| @@ -292,9 +293,8 @@ private: | |||||
| PluginInternal plugin; | PluginInternal plugin; | ||||
| // Temporary data | // Temporary data | ||||
| const unsigned long lastBufferSize; | |||||
| const double lastSampleRate; | |||||
| LADSPA_DataVector lastControlValues; | |||||
| const double lastSampleRate; | |||||
| LADSPA_DataVector lastControlValues; | |||||
| #if DISTRHO_PLUGIN_IS_SYNTH | #if DISTRHO_PLUGIN_IS_SYNTH | ||||
| MidiEvent midiEvents[MAX_MIDI_EVENTS]; | MidiEvent midiEvents[MAX_MIDI_EVENTS]; | ||||
| @@ -346,7 +346,7 @@ static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, unsigned long | |||||
| d_lastBufferSize = 2048; | d_lastBufferSize = 2048; | ||||
| d_lastSampleRate = sampleRate; | d_lastSampleRate = sampleRate; | ||||
| return new PluginLadspaDssi(); | |||||
| return new PluginLadspaDssi(sampleRate); | |||||
| } | } | ||||
| static void ladspa_connect_port(LADSPA_Handle instance, unsigned long port, LADSPA_Data* dataLocation) | static void ladspa_connect_port(LADSPA_Handle instance, unsigned long port, LADSPA_Data* dataLocation) | ||||
| @@ -86,51 +86,36 @@ void osc_send_exiting(const OscData* oscData) | |||||
| lo_send(oscData->addr, targetPath, ""); | lo_send(oscData->addr, targetPath, ""); | ||||
| } | } | ||||
| // stuff that we might receive while waiting for sample-rate | |||||
| static bool globalShow = false; | |||||
| class UIDssi : public QMainWindow | class UIDssi : public QMainWindow | ||||
| { | { | ||||
| public: | public: | ||||
| UIDssi(const OscData* oscData_, const char* title) | UIDssi(const OscData* oscData_, const char* title) | ||||
| : QMainWindow(nullptr), | : QMainWindow(nullptr), | ||||
| oscData(oscData_), | |||||
| widget(this), | widget(this), | ||||
| settings("DISTRHO", DISTRHO_PLUGIN_NAME), | |||||
| ui(this, widget.winId(), setParameterCallback, setStateCallback, nullptr, uiSendNoteCallback, uiResizeCallback), | |||||
| oscData(oscData_) | |||||
| ui(this, (intptr_t)widget.winId(), setParameterCallback, setStateCallback, nullptr, uiSendNoteCallback, uiResizeCallback) | |||||
| { | { | ||||
| setCentralWidget(&widget); | setCentralWidget(&widget); | ||||
| setFixedSize(ui.getWidth(), ui.getHeight()); | setFixedSize(ui.getWidth(), ui.getHeight()); | ||||
| setWindowTitle(title); | setWindowTitle(title); | ||||
| // idle timer | |||||
| uiTimer = startTimer(30); | uiTimer = startTimer(30); | ||||
| // load settings | // load settings | ||||
| restoreGeometry(settings.value("Global/Geometry", QByteArray()).toByteArray()); | |||||
| #if DISTRHO_PLUGIN_WANT_STATE | |||||
| for (size_t i=0; i < globalConfigures.size(); i++) | |||||
| dssiui_configure(globalConfigures.at(i).key, globalConfigures.at(i).value); | |||||
| #endif | |||||
| #if DISTRHO_PLUGIN_WANT_PROGRAMS | |||||
| if (globalProgram[0] >= 0 && globalProgram[1] >= 0) | |||||
| dssiui_program(globalProgram[0], globalProgram[1]); | |||||
| #endif | |||||
| QSettings settings("DISTRHO", DISTRHO_PLUGIN_NAME); | |||||
| for (size_t i=0; i < globalControls.size(); i++) | |||||
| dssiui_control(i, globalControls.at(i)); | |||||
| if (globalShow) | |||||
| show(); | |||||
| restoreGeometry(settings.value("Global/Geometry", QByteArray()).toByteArray()); | |||||
| } | } | ||||
| ~UIDssi() | ~UIDssi() | ||||
| { | { | ||||
| // save settings | // save settings | ||||
| QSettings settings("DISTRHO", DISTRHO_PLUGIN_NAME); | |||||
| settings.setValue("Global/Geometry", saveGeometry()); | settings.setValue("Global/Geometry", saveGeometry()); | ||||
| if (uiTimer) | |||||
| if (uiTimer != 0) | |||||
| { | { | ||||
| killTimer(uiTimer); | killTimer(uiTimer); | ||||
| osc_send_exiting(oscData); | osc_send_exiting(oscData); | ||||
| @@ -154,8 +139,9 @@ public: | |||||
| #if DISTRHO_PLUGIN_WANT_PROGRAMS | #if DISTRHO_PLUGIN_WANT_PROGRAMS | ||||
| void dssiui_program(unsigned long bank, unsigned long program) | void dssiui_program(unsigned long bank, unsigned long program) | ||||
| { | { | ||||
| unsigned long index = bank * 128 + program; | |||||
| ui.programChanged(index); | |||||
| unsigned long realProgram = bank * 128 + program; | |||||
| ui.programChanged(realProgram); | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -183,13 +169,24 @@ public: | |||||
| } | } | ||||
| #endif | #endif | ||||
| void dssiui_show() | |||||
| { | |||||
| show(); | |||||
| } | |||||
| void dssiui_hide() | |||||
| { | |||||
| hide(); | |||||
| } | |||||
| void dssiui_quit() | void dssiui_quit() | ||||
| { | { | ||||
| if (uiTimer) | |||||
| if (uiTimer != 0) | |||||
| { | { | ||||
| killTimer(uiTimer); | killTimer(uiTimer); | ||||
| uiTimer = 0; | uiTimer = 0; | ||||
| } | } | ||||
| close(); | close(); | ||||
| qApp->quit(); | qApp->quit(); | ||||
| } | } | ||||
| @@ -238,35 +235,34 @@ protected: | |||||
| } | } | ||||
| private: | private: | ||||
| // OSC Stuff | |||||
| const OscData* const oscData; | |||||
| // Qt4 stuff | // Qt4 stuff | ||||
| int uiTimer; | int uiTimer; | ||||
| QWidget widget; | QWidget widget; | ||||
| QSettings settings; | |||||
| // Plugin UI | // Plugin UI | ||||
| UIInternal ui; | UIInternal ui; | ||||
| const OscData* const oscData; | |||||
| // --------------------------------------------- | // --------------------------------------------- | ||||
| // Callbacks | // Callbacks | ||||
| static void setParameterCallback(void* ptr, uint32_t rindex, float value) | static void setParameterCallback(void* ptr, uint32_t rindex, float value) | ||||
| { | { | ||||
| UIDssi* _this_ = (UIDssi*)ptr; | |||||
| assert(_this_); | |||||
| _this_->setParameterValue(rindex, value); | |||||
| if (UIDssi* _this_ = (UIDssi*)ptr) | |||||
| _this_->setParameterValue(rindex, value); | |||||
| } | } | ||||
| static void setStateCallback(void* ptr, const char* key, const char* value) | static void setStateCallback(void* ptr, const char* key, const char* value) | ||||
| { | { | ||||
| #if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
| UIDssi* _this_ = (UIDssi*)ptr; | |||||
| assert(_this_); | |||||
| _this_->setState(key, value); | |||||
| if (UIDssi* _this_ = (UIDssi*)ptr) | |||||
| _this_->setState(key, value); | |||||
| #else | #else | ||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(ptr); | Q_UNUSED(ptr); | ||||
| Q_UNUSED(key); | Q_UNUSED(key); | ||||
| Q_UNUSED(value); | Q_UNUSED(value); | ||||
| @@ -276,11 +272,12 @@ private: | |||||
| static void uiSendNoteCallback(void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velocity) | 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 | ||||
| UIDssi* _this_ = (UIDssi*)ptr; | |||||
| assert(_this_); | |||||
| _this_->uiSendNote(onOff, channel, note, velocity); | |||||
| if (UIDssi* _this_ = (UIDssi*)ptr) | |||||
| _this_->uiSendNote(onOff, channel, note, velocity); | |||||
| #else | #else | ||||
| return; | |||||
| // unused | |||||
| Q_UNUSED(ptr); | Q_UNUSED(ptr); | ||||
| Q_UNUSED(onOff); | Q_UNUSED(onOff); | ||||
| Q_UNUSED(channel); | Q_UNUSED(channel); | ||||
| @@ -291,10 +288,8 @@ private: | |||||
| static void uiResizeCallback(void* ptr, unsigned int width, unsigned int height) | static void uiResizeCallback(void* ptr, unsigned int width, unsigned int height) | ||||
| { | { | ||||
| UIDssi* _this_ = (UIDssi*)ptr; | |||||
| assert(_this_); | |||||
| _this_->uiResize(width, height); | |||||
| if (UIDssi* _this_ = (UIDssi*)ptr) | |||||
| _this_->uiResize(width, height); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -22,7 +22,9 @@ | |||||
| #ifdef DISTRHO_UI_OPENGL | #ifdef DISTRHO_UI_OPENGL | ||||
| # include "DistrhoUIOpenGL.h" | # include "DistrhoUIOpenGL.h" | ||||
| START_NAMESPACE_DISTRHO | |||||
| # include "pugl/pugl.h" | # include "pugl/pugl.h" | ||||
| END_NAMESPACE_DISTRHO | |||||
| #else | #else | ||||
| # include "DistrhoUIQt4.h" | # include "DistrhoUIQt4.h" | ||||
| # include <QtGui/QApplication> | # include <QtGui/QApplication> | ||||
| @@ -82,6 +84,13 @@ struct UIPrivateData { | |||||
| // UI | // UI | ||||
| void* ptr; | void* ptr; | ||||
| NativeWidget* widget; | NativeWidget* widget; | ||||
| /* ^this: | |||||
| * Under Qt4 it points to the UI itself (in this case Qt4UI), | |||||
| * It's set right on the Qt4UI constructor. | |||||
| * | |||||
| * Under OpenGL it starts NULL and its created in createWindow(). | |||||
| * It points to a puglView. | |||||
| */ | |||||
| // Callbacks | // Callbacks | ||||
| setParamFunc setParamCallbackFunc; | setParamFunc setParamCallbackFunc; | ||||
| @@ -67,16 +67,18 @@ void OpenGLUI::d_uiIdle() | |||||
| // ------------------------------------------------- | // ------------------------------------------------- | ||||
| END_NAMESPACE_DISTRHO | |||||
| #ifndef DISTRHO_NAMESPACE | |||||
| # if DISTRHO_OS_WINDOWS | |||||
| # include "pugl/pugl_win.cpp" | |||||
| # elif DISTRHO_OS_MAC | |||||
| # include "pugl/pugl_osx.m" | |||||
| # else | |||||
| # include "pugl/pugl_x11.c" | |||||
| # endif | |||||
| #if DISTRHO_OS_WINDOWS | |||||
| # include "pugl/pugl_win.cpp" | |||||
| #elif DISTRHO_OS_MAC | |||||
| # include "pugl/pugl_osx.m" | |||||
| #elif DISTRHO_OS_LINUX | |||||
| # include "pugl/pugl_x11.c" | |||||
| #else | |||||
| # error Unsupported platform! | |||||
| #endif | #endif | ||||
| // ------------------------------------------------- | |||||
| END_NAMESPACE_DISTRHO | |||||
| #endif // DISTRHO_UI_OPENGL | #endif // DISTRHO_UI_OPENGL | ||||
| @@ -25,12 +25,12 @@ | |||||
| #include <cmath> | #include <cmath> | ||||
| #include <vector> | #include <vector> | ||||
| START_NAMESPACE_DISTRHO | |||||
| #if DISTRHO_OS_LINUX | #if DISTRHO_OS_LINUX | ||||
| # include "pugl/pugl_x11.h" | # include "pugl/pugl_x11.h" | ||||
| #endif | #endif | ||||
| START_NAMESPACE_DISTRHO | |||||
| // ------------------------------------------------- | // ------------------------------------------------- | ||||
| // Point | // Point | ||||
| @@ -54,9 +54,7 @@ | |||||
| # define PUGL_API | # define PUGL_API | ||||
| #endif | #endif | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #else | |||||
| #ifndef __cplusplus | |||||
| # include <stdbool.h> | # include <stdbool.h> | ||||
| #endif | #endif | ||||
| @@ -95,7 +93,7 @@ typedef enum { | |||||
| PUGL_CHAR_ESCAPE = 0x1B, | PUGL_CHAR_ESCAPE = 0x1B, | ||||
| PUGL_CHAR_DELETE = 0x7F | PUGL_CHAR_DELETE = 0x7F | ||||
| } PuglChar; | } PuglChar; | ||||
| /** | /** | ||||
| Special (non-Unicode) keyboard keys. | Special (non-Unicode) keyboard keys. | ||||
| */ | */ | ||||
| @@ -131,12 +129,12 @@ typedef enum { | |||||
| Keyboard modifier flags. | Keyboard modifier flags. | ||||
| */ | */ | ||||
| typedef enum { | typedef enum { | ||||
| PUGL_MOD_SHIFT = 1, /**< Shift key */ | |||||
| PUGL_MOD_SHIFT = 1, /**< Shift key */ | |||||
| PUGL_MOD_CTRL = 1 << 1, /**< Control key */ | PUGL_MOD_CTRL = 1 << 1, /**< Control key */ | ||||
| PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ | PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ | ||||
| PUGL_MOD_SUPER = 1 << 3, /**< Mod4/Command/Windows key */ | PUGL_MOD_SUPER = 1 << 3, /**< Mod4/Command/Windows key */ | ||||
| } PuglMod; | } PuglMod; | ||||
| /** | /** | ||||
| Handle for opaque user data. | Handle for opaque user data. | ||||
| */ | */ | ||||
| @@ -205,7 +203,7 @@ typedef void (*PuglScrollFunc)(PuglView* view, float dx, float dy); | |||||
| A function called when a special key is pressed or released. | A function called when a special key is pressed or released. | ||||
| This callback allows the use of keys that do not have unicode points. Note | This callback allows the use of keys that do not have unicode points. Note | ||||
| that some non-printable keys | |||||
| that some non-printable keys | |||||
| @param view The view the event occured in. | @param view The view the event occured in. | ||||
| @param press True if the key was pressed, false if released. | @param press True if the key was pressed, false if released. | ||||
| @param key The key pressed. | @param key The key pressed. | ||||
| @@ -340,8 +338,4 @@ puglDestroy(PuglView* view); | |||||
| @} | @} | ||||
| */ | */ | ||||
| #ifdef __cplusplus | |||||
| } /* extern "C" */ | |||||
| #endif | |||||
| #endif /* PUGL_H_INCLUDED */ | #endif /* PUGL_H_INCLUDED */ | ||||
| @@ -19,6 +19,9 @@ | |||||
| @file pugl_x11.h X11 Pugl Implementation (PuglInternalsImpl only). | @file pugl_x11.h X11 Pugl Implementation (PuglInternalsImpl only). | ||||
| */ | */ | ||||
| #ifndef PUGL_X11_H_INCLUDED | |||||
| #define PUGL_X11_H_INCLUDED | |||||
| #include "pugl.h" | #include "pugl.h" | ||||
| #include <GL/gl.h> | #include <GL/gl.h> | ||||
| @@ -39,3 +42,5 @@ typedef struct PuglInternalsImpl PuglInternals; | |||||
| PuglInternals* | PuglInternals* | ||||
| puglGetInternalsImpl(PuglView* view); | puglGetInternalsImpl(PuglView* view); | ||||
| #endif /* PUGL_X11_H_INCLUDED */ | |||||
| @@ -172,14 +172,14 @@ void carla_zeroMem(void* const memory, const size_t numBytes) | |||||
| { | { | ||||
| CARLA_ASSERT(memory); | CARLA_ASSERT(memory); | ||||
| memset(memory, 0, numBytes); | |||||
| std::memset(memory, 0, numBytes); | |||||
| } | } | ||||
| template <typename T> | template <typename T> | ||||
| static inline | static inline | ||||
| void carla_zeroStruct(T& structure) | void carla_zeroStruct(T& structure) | ||||
| { | { | ||||
| memset(&structure, 0, sizeof(T)); | |||||
| std::memset(&structure, 0, sizeof(T)); | |||||
| } | } | ||||
| // ------------------------------------------------- | // ------------------------------------------------- | ||||