| @@ -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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| @@ -1,7 +1,7 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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) | |||
| ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
| 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 | |||
| # -------------------------------------------------------------- | |||
| @@ -73,9 +73,6 @@ distrho-3bandsplitter.cpp.o: distrho-3bandsplitter.cpp | |||
| distrho-pingpongpan.cpp.o: distrho-pingpongpan.cpp | |||
| $(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 | |||
| $(CXX) $< $(ZYN_CXX_FLAGS) -c -o $@ | |||
| @@ -16,8 +16,9 @@ | |||
| */ | |||
| #include "carla_native.hpp" | |||
| #include "carla_utils.hpp" | |||
| #include <QtGui/QDialog> | |||
| #include <QtGui/QMainWindow> | |||
| #include "DistrhoPluginMain.cpp" | |||
| @@ -33,17 +34,20 @@ START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| // Carla UI | |||
| class UICarla : public QDialog | |||
| class UICarla : public QMainWindow | |||
| { | |||
| 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()); | |||
| setWindowTitle(DISTRHO_PLUGIN_NAME); | |||
| } | |||
| ~UICarla() | |||
| @@ -84,15 +88,15 @@ public: | |||
| // --------------------------------------------- | |||
| 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 | |||
| 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 | |||
| @@ -115,14 +119,19 @@ protected: | |||
| 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: | |||
| // Plugin stuff | |||
| const HostDescriptor* const m_host; | |||
| PluginInternal* const m_plugin; | |||
| const HostDescriptor* const host; | |||
| PluginInternal* const plugin; | |||
| // Qt4 stuff | |||
| QWidget widget; | |||
| // UI | |||
| UIInternal ui; | |||
| @@ -179,6 +188,8 @@ private: | |||
| if (UICarla* _this_ = (UICarla*)ptr) | |||
| _this_->uiResize(width, height); | |||
| } | |||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UICarla) | |||
| }; | |||
| #endif | |||
| @@ -199,8 +210,7 @@ public: | |||
| ~PluginCarla() | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| if (uiPtr) | |||
| delete uiPtr; | |||
| uiPtr = nullptr; | |||
| #endif | |||
| } | |||
| @@ -215,14 +225,18 @@ protected: | |||
| const ::Parameter* getParameterInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| static ::Parameter param; | |||
| // reset | |||
| param.hints = ::PARAMETER_IS_ENABLED; | |||
| param.scalePointCount = 0; | |||
| param.scalePoints = nullptr; | |||
| { | |||
| const uint32_t paramHints = plugin.parameterHints(index); | |||
| int nativeparamHints = 0; | |||
| const uint32_t paramHints = plugin.parameterHints(index); | |||
| if (paramHints & PARAMETER_IS_AUTOMABLE) | |||
| nativeparamHints |= ::PARAMETER_IS_AUTOMABLE; | |||
| @@ -252,17 +266,18 @@ protected: | |||
| param.ranges.stepLarge = ranges.stepLarge; | |||
| } | |||
| param.scalePointCount = 0; | |||
| param.scalePoints = nullptr; | |||
| return ¶m; | |||
| } | |||
| float getParameterValue(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| return plugin.parameterValue(index); | |||
| } | |||
| // getParameterText unused | |||
| // ------------------------------------------------------------------- | |||
| // Plugin midi-program calls | |||
| @@ -274,10 +289,17 @@ protected: | |||
| virtual const ::MidiProgram* getMidiProgramInfo(const uint32_t index) | |||
| { | |||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||
| if (index >= plugin.programCount()) | |||
| return nullptr; | |||
| static ::MidiProgram midiProgram; | |||
| midiProgram.bank = index / 128; | |||
| midiProgram.program = index % 128; | |||
| midiProgram.name = plugin.programName(index); | |||
| return &midiProgram; | |||
| } | |||
| #endif | |||
| @@ -287,6 +309,8 @@ protected: | |||
| void setParameterValue(const uint32_t index, const float value) | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| plugin.setParameterValue(index, value); | |||
| } | |||
| @@ -305,10 +329,51 @@ protected: | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| void setCustomData(const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(key); | |||
| CARLA_ASSERT(value); | |||
| plugin.setState(key, value); | |||
| } | |||
| #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 | |||
| @@ -318,28 +383,38 @@ protected: | |||
| if (show) | |||
| createUiIfNeeded(); | |||
| if (uiPtr) | |||
| if (uiPtr != nullptr) | |||
| uiPtr->carla_show(show); | |||
| } | |||
| void uiIdle() | |||
| { | |||
| if (uiPtr) | |||
| CARLA_ASSERT(uiPtr); | |||
| if (uiPtr != nullptr) | |||
| uiPtr->carla_idle(); | |||
| } | |||
| 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); | |||
| } | |||
| # if DISTRHO_PLUGIN_WANT_PROGRAMS | |||
| void uiSetMidiProgram(const uint32_t bank, const uint32_t program) | |||
| { | |||
| CARLA_ASSERT(uiPtr); | |||
| uint32_t realProgram = bank * 128 + program; | |||
| if (uiPtr) | |||
| if (realProgram >= plugin.programCount()) | |||
| return; | |||
| if (uiPtr != nullptr) | |||
| uiPtr->carla_setMidiProgram(realProgram); | |||
| } | |||
| # endif | |||
| @@ -347,49 +422,17 @@ protected: | |||
| # if DISTRHO_PLUGIN_WANT_STATE | |||
| 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); | |||
| } | |||
| # 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: | |||
| PluginInternal plugin; | |||
| @@ -400,11 +443,11 @@ private: | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| // UI | |||
| UICarla* uiPtr; | |||
| ScopedPointer<UICarla> uiPtr; | |||
| void createUiIfNeeded() | |||
| { | |||
| if (! uiPtr) | |||
| if (uiPtr == nullptr) | |||
| { | |||
| d_lastUiSampleRate = getSampleRate(); | |||
| uiPtr = new UICarla(getHostHandle(), &plugin); | |||
| @@ -412,6 +455,8 @@ private: | |||
| } | |||
| #endif | |||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla) | |||
| // ------------------------------------------------------------------- | |||
| public: | |||
| @@ -1,7 +1,7 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * 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 | |||
| * 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 | |||
| * 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, | |||
| * 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. | |||
| * | |||
| * For a full copy of the license see the LGPL.txt file | |||
| @@ -44,9 +44,8 @@ START_NAMESPACE_DISTRHO | |||
| class PluginLadspaDssi | |||
| { | |||
| public: | |||
| PluginLadspaDssi() | |||
| : lastBufferSize(d_lastBufferSize), | |||
| lastSampleRate(d_lastSampleRate), | |||
| PluginLadspaDssi(const double sampleRate) | |||
| : lastSampleRate(sampleRate), | |||
| portAudioIns{nullptr}, | |||
| portAudioOuts{nullptr} | |||
| { | |||
| @@ -143,9 +142,11 @@ public: | |||
| return nullptr; | |||
| static DSSI_Program_Descriptor desc; | |||
| desc.Bank = index / 128; | |||
| desc.Program = index % 128; | |||
| desc.Name = plugin.programName(index); | |||
| return &desc; | |||
| } | |||
| @@ -292,9 +293,8 @@ private: | |||
| PluginInternal plugin; | |||
| // Temporary data | |||
| const unsigned long lastBufferSize; | |||
| const double lastSampleRate; | |||
| LADSPA_DataVector lastControlValues; | |||
| const double lastSampleRate; | |||
| LADSPA_DataVector lastControlValues; | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| MidiEvent midiEvents[MAX_MIDI_EVENTS]; | |||
| @@ -346,7 +346,7 @@ static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, unsigned long | |||
| d_lastBufferSize = 2048; | |||
| d_lastSampleRate = sampleRate; | |||
| return new PluginLadspaDssi(); | |||
| return new PluginLadspaDssi(sampleRate); | |||
| } | |||
| 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, ""); | |||
| } | |||
| // stuff that we might receive while waiting for sample-rate | |||
| static bool globalShow = false; | |||
| class UIDssi : public QMainWindow | |||
| { | |||
| public: | |||
| UIDssi(const OscData* oscData_, const char* title) | |||
| : QMainWindow(nullptr), | |||
| oscData(oscData_), | |||
| 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); | |||
| setFixedSize(ui.getWidth(), ui.getHeight()); | |||
| setWindowTitle(title); | |||
| // idle timer | |||
| uiTimer = startTimer(30); | |||
| // 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() | |||
| { | |||
| // save settings | |||
| QSettings settings("DISTRHO", DISTRHO_PLUGIN_NAME); | |||
| settings.setValue("Global/Geometry", saveGeometry()); | |||
| if (uiTimer) | |||
| if (uiTimer != 0) | |||
| { | |||
| killTimer(uiTimer); | |||
| osc_send_exiting(oscData); | |||
| @@ -154,8 +139,9 @@ public: | |||
| #if DISTRHO_PLUGIN_WANT_PROGRAMS | |||
| 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 | |||
| @@ -183,13 +169,24 @@ public: | |||
| } | |||
| #endif | |||
| void dssiui_show() | |||
| { | |||
| show(); | |||
| } | |||
| void dssiui_hide() | |||
| { | |||
| hide(); | |||
| } | |||
| void dssiui_quit() | |||
| { | |||
| if (uiTimer) | |||
| if (uiTimer != 0) | |||
| { | |||
| killTimer(uiTimer); | |||
| uiTimer = 0; | |||
| } | |||
| close(); | |||
| qApp->quit(); | |||
| } | |||
| @@ -238,35 +235,34 @@ protected: | |||
| } | |||
| private: | |||
| // OSC Stuff | |||
| const OscData* const oscData; | |||
| // Qt4 stuff | |||
| int uiTimer; | |||
| QWidget widget; | |||
| QSettings settings; | |||
| // Plugin UI | |||
| UIInternal ui; | |||
| const OscData* const oscData; | |||
| // --------------------------------------------- | |||
| // Callbacks | |||
| 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) | |||
| { | |||
| #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 | |||
| return; | |||
| // unused | |||
| Q_UNUSED(ptr); | |||
| Q_UNUSED(key); | |||
| Q_UNUSED(value); | |||
| @@ -276,11 +272,12 @@ private: | |||
| static void uiSendNoteCallback(void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velocity) | |||
| { | |||
| #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 | |||
| return; | |||
| // unused | |||
| Q_UNUSED(ptr); | |||
| Q_UNUSED(onOff); | |||
| Q_UNUSED(channel); | |||
| @@ -291,10 +288,8 @@ private: | |||
| 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 | |||
| # include "DistrhoUIOpenGL.h" | |||
| START_NAMESPACE_DISTRHO | |||
| # include "pugl/pugl.h" | |||
| END_NAMESPACE_DISTRHO | |||
| #else | |||
| # include "DistrhoUIQt4.h" | |||
| # include <QtGui/QApplication> | |||
| @@ -82,6 +84,13 @@ struct UIPrivateData { | |||
| // UI | |||
| void* ptr; | |||
| 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 | |||
| 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 | |||
| // ------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_OPENGL | |||
| @@ -25,12 +25,12 @@ | |||
| #include <cmath> | |||
| #include <vector> | |||
| START_NAMESPACE_DISTRHO | |||
| #if DISTRHO_OS_LINUX | |||
| # include "pugl/pugl_x11.h" | |||
| #endif | |||
| START_NAMESPACE_DISTRHO | |||
| // ------------------------------------------------- | |||
| // Point | |||
| @@ -54,9 +54,7 @@ | |||
| # define PUGL_API | |||
| #endif | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #else | |||
| #ifndef __cplusplus | |||
| # include <stdbool.h> | |||
| #endif | |||
| @@ -95,7 +93,7 @@ typedef enum { | |||
| PUGL_CHAR_ESCAPE = 0x1B, | |||
| PUGL_CHAR_DELETE = 0x7F | |||
| } PuglChar; | |||
| /** | |||
| Special (non-Unicode) keyboard keys. | |||
| */ | |||
| @@ -131,12 +129,12 @@ typedef enum { | |||
| Keyboard modifier flags. | |||
| */ | |||
| typedef enum { | |||
| PUGL_MOD_SHIFT = 1, /**< Shift key */ | |||
| PUGL_MOD_SHIFT = 1, /**< Shift key */ | |||
| PUGL_MOD_CTRL = 1 << 1, /**< Control key */ | |||
| PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ | |||
| PUGL_MOD_SUPER = 1 << 3, /**< Mod4/Command/Windows key */ | |||
| } PuglMod; | |||
| /** | |||
| 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. | |||
| 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 press True if the key was pressed, false if released. | |||
| @param key The key pressed. | |||
| @@ -340,8 +338,4 @@ puglDestroy(PuglView* view); | |||
| @} | |||
| */ | |||
| #ifdef __cplusplus | |||
| } /* extern "C" */ | |||
| #endif | |||
| #endif /* PUGL_H_INCLUDED */ | |||
| @@ -19,6 +19,9 @@ | |||
| @file pugl_x11.h X11 Pugl Implementation (PuglInternalsImpl only). | |||
| */ | |||
| #ifndef PUGL_X11_H_INCLUDED | |||
| #define PUGL_X11_H_INCLUDED | |||
| #include "pugl.h" | |||
| #include <GL/gl.h> | |||
| @@ -39,3 +42,5 @@ typedef struct PuglInternalsImpl PuglInternals; | |||
| PuglInternals* | |||
| 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); | |||
| memset(memory, 0, numBytes); | |||
| std::memset(memory, 0, numBytes); | |||
| } | |||
| template <typename T> | |||
| static inline | |||
| void carla_zeroStruct(T& structure) | |||
| { | |||
| memset(&structure, 0, sizeof(T)); | |||
| std::memset(&structure, 0, sizeof(T)); | |||
| } | |||
| // ------------------------------------------------- | |||