| @@ -411,7 +411,7 @@ endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Set libs stuff (part 3) | # Set libs stuff (part 3) | ||||
| HAVE_ZYN_DEPS = $(shell pkg-config --exists fftw3 mxml zlib && echo true) | |||||
| HAVE_ZYN_DEPS = $(shell pkg-config --exists liblo fftw3 mxml zlib && echo true) | |||||
| ifeq ($(HAVE_FLTK),true) | ifeq ($(HAVE_FLTK),true) | ||||
| HAVE_ZYN_UI_DEPS = true | HAVE_ZYN_UI_DEPS = true | ||||
| endif | endif | ||||
| @@ -434,14 +434,14 @@ endif | |||||
| ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
| BASE_FLAGS += -DHAVE_ZYN_DEPS | BASE_FLAGS += -DHAVE_ZYN_DEPS | ||||
| NATIVE_PLUGINS_LIBS += $(shell pkg-config --libs fftw3 mxml zlib) | |||||
| NATIVE_PLUGINS_LIBS += $(shell pkg-config --libs liblo fftw3 mxml zlib) | |||||
| ifeq ($(HAVE_ZYN_UI_DEPS),true) | ifeq ($(HAVE_ZYN_UI_DEPS),true) | ||||
| BASE_FLAGS += -DHAVE_ZYN_UI_DEPS | BASE_FLAGS += -DHAVE_ZYN_UI_DEPS | ||||
| ifeq ($(HAVE_NTK),true) | |||||
| NATIVE_PLUGINS_LIBS += $(shell pkg-config --libs ntk_images ntk) | |||||
| else | |||||
| NATIVE_PLUGINS_LIBS += $(shell fltk-config --use-images --ldstaticflags) | |||||
| endif | |||||
| # ifeq ($(HAVE_NTK),true) | |||||
| # NATIVE_PLUGINS_LIBS += $(shell pkg-config --libs ntk_images ntk) | |||||
| # else | |||||
| # NATIVE_PLUGINS_LIBS += $(shell fltk-config --use-images --ldstaticflags) | |||||
| # endif | |||||
| endif | endif | ||||
| endif | endif | ||||
| @@ -1627,7 +1627,7 @@ protected: | |||||
| break; | break; | ||||
| case CarlaExternalUI::UiHide: | case CarlaExternalUI::UiHide: | ||||
| pHost->ui_closed(pHost->handle); | pHost->ui_closed(pHost->handle); | ||||
| //fUiServer.stopPipeServer(1000); | |||||
| fUiServer.stopPipeServer(1000); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -178,6 +178,7 @@ public: | |||||
| fHost(), | fHost(), | ||||
| fDescriptor(nullptr), | fDescriptor(nullptr), | ||||
| fIsProcessing(false), | fIsProcessing(false), | ||||
| fIsUiAvailable(false), | |||||
| fIsUiVisible(false), | fIsUiVisible(false), | ||||
| fAudioInBuffers(nullptr), | fAudioInBuffers(nullptr), | ||||
| fAudioOutBuffers(nullptr), | fAudioOutBuffers(nullptr), | ||||
| @@ -744,12 +745,12 @@ public: | |||||
| if (fDescriptor->ui_show == nullptr) | if (fDescriptor->ui_show == nullptr) | ||||
| return; | return; | ||||
| const bool oldIsUiVisible(fIsUiVisible); | |||||
| fIsUiAvailable = true; | |||||
| fDescriptor->ui_show(fHandle, yesNo); | fDescriptor->ui_show(fHandle, yesNo); | ||||
| // UI might not be available, see NATIVE_HOST_OPCODE_UI_UNAVAILABLE | // UI might not be available, see NATIVE_HOST_OPCODE_UI_UNAVAILABLE | ||||
| if (fIsUiVisible == yesNo || fIsUiVisible != oldIsUiVisible) | |||||
| if (yesNo && ! fIsUiAvailable) | |||||
| return; | return; | ||||
| fIsUiVisible = yesNo; | fIsUiVisible = yesNo; | ||||
| @@ -2265,7 +2266,7 @@ protected: | |||||
| break; | break; | ||||
| case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: | case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: | ||||
| pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, -1, 0, 0.0f, nullptr); | pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, -1, 0, 0.0f, nullptr); | ||||
| fIsUiVisible = false; | |||||
| fIsUiAvailable = false; | |||||
| break; | break; | ||||
| case NATIVE_HOST_OPCODE_HOST_IDLE: | case NATIVE_HOST_OPCODE_HOST_IDLE: | ||||
| pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); | pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); | ||||
| @@ -2434,6 +2435,7 @@ private: | |||||
| const NativePluginDescriptor* fDescriptor; | const NativePluginDescriptor* fDescriptor; | ||||
| bool fIsProcessing; | bool fIsProcessing; | ||||
| bool fIsUiAvailable; | |||||
| bool fIsUiVisible; | bool fIsUiVisible; | ||||
| float** fAudioInBuffers; | float** fAudioInBuffers; | ||||
| @@ -36,10 +36,17 @@ public: | |||||
| NativePluginAndUiClass(const NativeHostDescriptor* const host, const char* const extUiPath) | NativePluginAndUiClass(const NativeHostDescriptor* const host, const char* const extUiPath) | ||||
| : NativePluginClass(host), | : NativePluginClass(host), | ||||
| CarlaExternalUI(), | CarlaExternalUI(), | ||||
| fExtUiPath(extUiPath), | |||||
| leakDetector_NativePluginAndUiClass() {} | |||||
| fExtUiPath(getResourceDir()), | |||||
| leakDetector_NativePluginAndUiClass() | |||||
| { | |||||
| fExtUiPath += CARLA_OS_SEP_STR; | |||||
| fExtUiPath += extUiPath; | |||||
| } | |||||
| //~NativePluginAndUiClass() noexcept override {} | |||||
| const char* getExtUiPath() const noexcept | |||||
| { | |||||
| return fExtUiPath; | |||||
| } | |||||
| protected: | protected: | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -57,15 +64,19 @@ protected: | |||||
| return; | return; | ||||
| } | } | ||||
| CarlaString path(getResourceDir() + fExtUiPath); | |||||
| carla_stdout("Trying to start UI using \"%s\"", path.buffer()); | |||||
| carla_stdout("Trying to start UI using \"%s\"", fExtUiPath.buffer()); | |||||
| CarlaExternalUI::setData(path, getSampleRate(), getUiName()); | |||||
| CarlaExternalUI::startPipeServer(true); | |||||
| CarlaExternalUI::setData(fExtUiPath, getSampleRate(), getUiName()); | |||||
| if (! CarlaExternalUI::startPipeServer(true)) | |||||
| { | |||||
| uiClosed(); | |||||
| hostUiUnavailable(); | |||||
| } | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| CarlaExternalUI::stopPipeServer(5000); | |||||
| CarlaExternalUI::stopPipeServer(2000); | |||||
| } | } | ||||
| } | } | ||||
| @@ -79,11 +90,12 @@ protected: | |||||
| case CarlaExternalUI::UiShow: | case CarlaExternalUI::UiShow: | ||||
| break; | break; | ||||
| case CarlaExternalUI::UiCrashed: | case CarlaExternalUI::UiCrashed: | ||||
| uiClosed(); | |||||
| hostUiUnavailable(); | hostUiUnavailable(); | ||||
| break; | break; | ||||
| case CarlaExternalUI::UiHide: | case CarlaExternalUI::UiHide: | ||||
| uiClosed(); | uiClosed(); | ||||
| //CarlaExternalUI::stopPipeServer(2000); | |||||
| CarlaExternalUI::stopPipeServer(1000); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -153,6 +165,17 @@ protected: | |||||
| flushMessages(); | flushMessages(); | ||||
| } | } | ||||
| void uiNameChanged(const char* const uiName) override | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(uiName != nullptr && uiName[0] != '\0',); | |||||
| const CarlaMutexLocker cml(getPipeLock()); | |||||
| writeMessage("uiTitle\n", 10); | |||||
| writeAndFixMessage(uiName); | |||||
| flushMessages(); | |||||
| } | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Pipe Server calls | // Pipe Server calls | ||||
| @@ -19,21 +19,29 @@ BUILD_CXX_FLAGS += -I.. -isystem $(CWD)/modules -I$(CWD)/modules/distrho | |||||
| ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
| ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) -isystem zynaddsubfx | ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) -isystem zynaddsubfx | ||||
| ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib) | ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib) | ||||
| ZYN_LD_FLAGS = $(shell pkg-config --libs liblo) | |||||
| ifeq ($(HAVE_ZYN_UI_DEPS),true) | ifeq ($(HAVE_ZYN_UI_DEPS),true) | ||||
| ifeq ($(HAVE_NTK),true) | ifeq ($(HAVE_NTK),true) | ||||
| FLUID = ntk-fluid | FLUID = ntk-fluid | ||||
| ZYN_CXX_FLAGS += -DNTK_GUI | ZYN_CXX_FLAGS += -DNTK_GUI | ||||
| ZYN_CXX_FLAGS += $(shell pkg-config --cflags ntk_images ntk) | ZYN_CXX_FLAGS += $(shell pkg-config --cflags ntk_images ntk) | ||||
| ZYN_LD_FLAGS += $(shell pkg-config --libs ntk_images ntk) | |||||
| else # HAVE_NTK | else # HAVE_NTK | ||||
| FLUID = fluid | FLUID = fluid | ||||
| ZYN_CXX_FLAGS += -DFLTK_GUI | ZYN_CXX_FLAGS += -DFLTK_GUI | ||||
| ZYN_CXX_FLAGS += $(shell fltk-config --use-images --cxxflags) | ZYN_CXX_FLAGS += $(shell fltk-config --use-images --cxxflags) | ||||
| ZYN_LD_FLAGS += $(shell fltk-config --use-images --ldstaticflags) | |||||
| endif # HAVE_NTK | endif # HAVE_NTK | ||||
| else # HAVE_ZYN_UI_DEPS | else # HAVE_ZYN_UI_DEPS | ||||
| ZYN_CXX_FLAGS += -DNO_UI | ZYN_CXX_FLAGS += -DNO_UI | ||||
| endif # HAVE_ZYN_UI_DEPS | endif # HAVE_ZYN_UI_DEPS | ||||
| endif # HAVE_ZYN_DEPS | endif # HAVE_ZYN_DEPS | ||||
| # ---------------------------------------------------------------------------------------------------------------------------- | |||||
| # Set targets | |||||
| TARGETS = $(MODULEDIR)/$(MODULENAME).a | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| # Set objects | # Set objects | ||||
| @@ -95,8 +103,7 @@ OBJS += \ | |||||
| $(OBJDIR)/zynaddsubfx-src.cpp.o | $(OBJDIR)/zynaddsubfx-src.cpp.o | ||||
| ifeq ($(HAVE_ZYN_UI_DEPS),true) | ifeq ($(HAVE_ZYN_UI_DEPS),true) | ||||
| OBJS += \ | |||||
| $(OBJDIR)/zynaddsubfx-ui.cpp.o | |||||
| TARGETS += resources/zynaddsubfx-ui$(APP_EXT) | |||||
| ZYN_UI_FILES_CPP = \ | ZYN_UI_FILES_CPP = \ | ||||
| zynaddsubfx/UI/ADnoteUI.cpp \ | zynaddsubfx/UI/ADnoteUI.cpp \ | ||||
| @@ -148,7 +155,7 @@ endif | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| all: $(MODULEDIR)/$(MODULENAME).a | |||||
| all: $(TARGETS) | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -166,6 +173,11 @@ $(MODULEDIR)/$(MODULENAME).a: $(OBJS) | |||||
| @rm -f $@ | @rm -f $@ | ||||
| @$(AR) crs $@ $^ | @$(AR) crs $@ $^ | ||||
| resources/zynaddsubfx-ui$(APP_EXT): $(OBJDIR)/zynaddsubfx-ui.cpp.o $(MODULEDIR)/rtosc.a | |||||
| -@mkdir -p $(OBJDIR) | |||||
| @echo "Linking zynaddsubfx-ui" | |||||
| @$(CXX) $^ $(ZYN_LD_FLAGS) -o $@ | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| zynaddsubfx/UI/%.cpp: zynaddsubfx/UI/%.fl | zynaddsubfx/UI/%.cpp: zynaddsubfx/UI/%.fl | ||||
| @@ -283,5 +295,6 @@ $(OBJDIR)/%.cpp.o: %.cpp | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| -include $(OBJS:%.o=%.d) | -include $(OBJS:%.o=%.d) | ||||
| -include $(OBJDIR)/zynaddsubfx-ui.cpp.d | |||||
| # ---------------------------------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -31,7 +31,7 @@ class BigMeterPlugin : public NativePluginAndUiClass | |||||
| { | { | ||||
| public: | public: | ||||
| BigMeterPlugin(const NativeHostDescriptor* const host) | BigMeterPlugin(const NativeHostDescriptor* const host) | ||||
| : NativePluginAndUiClass(host, CARLA_OS_SEP_STR "bigmeter-ui"), | |||||
| : NativePluginAndUiClass(host, "bigmeter-ui"), | |||||
| fColor(1), | fColor(1), | ||||
| fStyle(1), | fStyle(1), | ||||
| fOutLeft(0.0f), | fOutLeft(0.0f), | ||||
| @@ -31,7 +31,7 @@ public: | |||||
| }; | }; | ||||
| MidiSequencerPlugin(const NativeHostDescriptor* const host) | MidiSequencerPlugin(const NativeHostDescriptor* const host) | ||||
| : NativePluginAndUiClass(host, CARLA_OS_SEP_STR "midiseq-ui"), | |||||
| : NativePluginAndUiClass(host, "midiseq-ui"), | |||||
| fNeedsAllNotesOff(false), | fNeedsAllNotesOff(false), | ||||
| fWantInEvents(false), | fWantInEvents(false), | ||||
| fWasPlayingBefore(false), | fWasPlayingBefore(false), | ||||
| @@ -25,7 +25,7 @@ class NotesPlugin : public NativePluginAndUiClass | |||||
| { | { | ||||
| public: | public: | ||||
| NotesPlugin(const NativeHostDescriptor* const host) | NotesPlugin(const NativeHostDescriptor* const host) | ||||
| : NativePluginAndUiClass(host, CARLA_OS_SEP_STR "notes-ui"), | |||||
| : NativePluginAndUiClass(host, "notes-ui"), | |||||
| fCurPage(1), | fCurPage(1), | ||||
| leakDetector_NotesPlugin() {} | leakDetector_NotesPlugin() {} | ||||
| @@ -91,6 +91,7 @@ extern "C" { | |||||
| // SYNTH_T* synth = nullptr; | // SYNTH_T* synth = nullptr; | ||||
| class WavFile; | class WavFile; | ||||
| namespace Nio { | namespace Nio { | ||||
| void masterSwap(Master*){} | |||||
| // bool start(void){return 1;} | // bool start(void){return 1;} | ||||
| // void stop(void){} | // void stop(void){} | ||||
| // bool setSource(std::string){return true;} | // bool setSource(std::string){return true;} | ||||
| @@ -15,7 +15,7 @@ | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | * For a full copy of the GNU General Public License see the doc/GPL.txt file. | ||||
| */ | */ | ||||
| #include "CarlaNative.hpp" | |||||
| #include "CarlaNativeExtUI.hpp" | |||||
| #include "CarlaMIDI.h" | #include "CarlaMIDI.h" | ||||
| #include "CarlaThread.hpp" | #include "CarlaThread.hpp" | ||||
| #include "LinkedList.hpp" | #include "LinkedList.hpp" | ||||
| @@ -24,30 +24,12 @@ | |||||
| #include "DSP/FFTwrapper.h" | #include "DSP/FFTwrapper.h" | ||||
| #include "Misc/Master.h" | #include "Misc/Master.h" | ||||
| #include "Misc/MiddleWare.h" | |||||
| #include "Misc/Part.h" | #include "Misc/Part.h" | ||||
| #include "Misc/Util.h" | #include "Misc/Util.h" | ||||
| #ifdef HAVE_ZYN_UI_DEPS | #ifdef HAVE_ZYN_UI_DEPS | ||||
| # define WANT_ZYNADDSUBFX_UI | |||||
| #endif | |||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| # ifdef override | |||||
| # define override_hack | |||||
| # undef override | |||||
| # endif | |||||
| # include "UI/MasterUI.h" | |||||
| # include <FL/Fl_Shared_Image.H> | |||||
| # include <FL/Fl_Tiled_Image.H> | |||||
| # ifdef NTK_GUI | |||||
| # include <FL/Fl_Theme.H> | |||||
| # endif | |||||
| # ifdef override_hack | |||||
| # define override | |||||
| # undef override_hack | |||||
| # endif | |||||
| # include "UI/Connection.h" | |||||
| #endif | #endif | ||||
| #include <ctime> | #include <ctime> | ||||
| @@ -58,8 +40,34 @@ | |||||
| using juce::roundToIntAccurate; | using juce::roundToIntAccurate; | ||||
| using juce::FloatVectorOperations; | using juce::FloatVectorOperations; | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| extern CarlaString gUiPixmapPath; | |||||
| // ----------------------------------------------------------------------- | |||||
| #ifdef HAVE_ZYN_UI_DEPS | |||||
| namespace GUI { | |||||
| Fl_Osc_Interface* genOscInterface(MiddleWare*) | |||||
| { | |||||
| return nullptr; | |||||
| } | |||||
| void raiseUi(ui_handle_t, const char *) | |||||
| { | |||||
| } | |||||
| #if 0 | |||||
| ui_handle_t createUi(Fl_Osc_Interface*, void *exit) | |||||
| { | |||||
| return nullptr; | |||||
| } | |||||
| void destroyUi(ui_handle_t) | |||||
| { | |||||
| } | |||||
| void raiseUi(ui_handle_t, const char *, const char *, ...) | |||||
| { | |||||
| } | |||||
| void tickUi(ui_handle_t) | |||||
| { | |||||
| //usleep(100000); | |||||
| } | |||||
| #endif | |||||
| }; | |||||
| #endif | #endif | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -227,30 +235,16 @@ static ZynAddSubFxPrograms sPrograms; | |||||
| class ZynAddSubFxThread : public CarlaThread | class ZynAddSubFxThread : public CarlaThread | ||||
| { | { | ||||
| public: | public: | ||||
| ZynAddSubFxThread(Master* const master, CarlaMutex& mutex, const NativeHostDescriptor* const host) | |||||
| ZynAddSubFxThread(Master* const master, CarlaMutex& mutex) noexcept | |||||
| : CarlaThread("ZynAddSubFxThread"), | : CarlaThread("ZynAddSubFxThread"), | ||||
| fMaster(master), | fMaster(master), | ||||
| fMutex(mutex), | fMutex(mutex), | ||||
| kHost(host), | |||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| fUi(nullptr), | |||||
| fUiClosed(0), | |||||
| fNextUiAction(-1), | |||||
| #endif | |||||
| fChangeProgram(false), | fChangeProgram(false), | ||||
| fNextChannel(0), | fNextChannel(0), | ||||
| fNextBank(0), | fNextBank(0), | ||||
| fNextProgram(0) {} | fNextProgram(0) {} | ||||
| ~ZynAddSubFxThread() | |||||
| { | |||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| // must be closed by now | |||||
| CARLA_SAFE_ASSERT(fUi == nullptr); | |||||
| #endif | |||||
| } | |||||
| void loadProgramLater(const uint8_t channel, const uint32_t bank, const uint32_t program) | |||||
| void loadProgramLater(const uint8_t channel, const uint32_t bank, const uint32_t program) noexcept | |||||
| { | { | ||||
| fNextChannel = channel; | fNextChannel = channel; | ||||
| fNextBank = bank; | fNextBank = bank; | ||||
| @@ -258,7 +252,7 @@ public: | |||||
| fChangeProgram = true; | fChangeProgram = true; | ||||
| } | } | ||||
| void stopLoadProgramLater() | |||||
| void stopLoadProgramLater() noexcept | |||||
| { | { | ||||
| fChangeProgram = false; | fChangeProgram = false; | ||||
| fNextChannel = 0; | fNextChannel = 0; | ||||
| @@ -266,89 +260,16 @@ public: | |||||
| fNextProgram = 0; | fNextProgram = 0; | ||||
| } | } | ||||
| void setMaster(Master* const master) | |||||
| void setMaster(Master* const master) noexcept | |||||
| { | { | ||||
| fMaster = master; | fMaster = master; | ||||
| } | } | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| void uiHide() | |||||
| { | |||||
| fNextUiAction = 0; | |||||
| } | |||||
| void uiShow() | |||||
| { | |||||
| fNextUiAction = 1; | |||||
| } | |||||
| void uiRepaint() | |||||
| { | |||||
| if (fUi != nullptr) | |||||
| fNextUiAction = 2; | |||||
| } | |||||
| void uiChangeName(const char* const name) | |||||
| { | |||||
| if (fUi != nullptr) | |||||
| { | |||||
| Fl::lock(); | |||||
| fUi->masterwindow->label(name); | |||||
| Fl::unlock(); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| protected: | protected: | ||||
| void run() override | void run() override | ||||
| { | { | ||||
| while (! shouldThreadExit()) | while (! shouldThreadExit()) | ||||
| { | { | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| Fl::lock(); | |||||
| if (fNextUiAction == 2) // repaint | |||||
| { | |||||
| CARLA_ASSERT(fUi != nullptr); | |||||
| if (fUi != nullptr) | |||||
| fUi->refresh_master_ui(); | |||||
| } | |||||
| else if (fNextUiAction == 1) // init/show | |||||
| { | |||||
| if (fUi == nullptr) | |||||
| { | |||||
| fUiClosed = 0; | |||||
| fUi = new MasterUI(&fUiClosed, &fOscIface); | |||||
| fUi->masterwindow->label(kHost->uiName); | |||||
| } | |||||
| fUi->showUI(1); | |||||
| } | |||||
| else if (fNextUiAction == 0) // close | |||||
| { | |||||
| CARLA_ASSERT(fUi != nullptr); | |||||
| if (fUi != nullptr) | |||||
| { | |||||
| delete fUi; | |||||
| fUi = nullptr; | |||||
| } | |||||
| } | |||||
| fNextUiAction = -1; | |||||
| if (fUiClosed != 0) | |||||
| { | |||||
| fUiClosed = 0; | |||||
| fNextUiAction = 0; | |||||
| kHost->ui_closed(kHost->handle); | |||||
| } | |||||
| Fl::check(); | |||||
| Fl::unlock(); | |||||
| #endif | |||||
| if (fChangeProgram) | if (fChangeProgram) | ||||
| { | { | ||||
| fChangeProgram = false; | fChangeProgram = false; | ||||
| @@ -357,15 +278,6 @@ protected: | |||||
| fNextBank = 0; | fNextBank = 0; | ||||
| fNextProgram = 0; | fNextProgram = 0; | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| if (fUi != nullptr) | |||||
| { | |||||
| Fl::lock(); | |||||
| fUi->refresh_master_ui(); | |||||
| Fl::unlock(); | |||||
| } | |||||
| #endif | |||||
| carla_msleep(15); | carla_msleep(15); | ||||
| } | } | ||||
| else | else | ||||
| @@ -373,30 +285,11 @@ protected: | |||||
| carla_msleep(30); | carla_msleep(30); | ||||
| } | } | ||||
| } | } | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| if (fUi != nullptr) | |||||
| { | |||||
| Fl::lock(); | |||||
| delete fUi; | |||||
| fUi = nullptr; | |||||
| Fl::check(); | |||||
| Fl::unlock(); | |||||
| } | |||||
| #endif | |||||
| } | } | ||||
| private: | private: | ||||
| Master* fMaster; | Master* fMaster; | ||||
| CarlaMutex& fMutex; | CarlaMutex& fMutex; | ||||
| const NativeHostDescriptor* const kHost; | |||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| MasterUI* fUi; | |||||
| int fUiClosed; | |||||
| volatile int fNextUiAction; | |||||
| Fl_Osc_Interface fOscIface; | |||||
| #endif | |||||
| volatile bool fChangeProgram; | volatile bool fChangeProgram; | ||||
| volatile uint8_t fNextChannel; | volatile uint8_t fNextChannel; | ||||
| @@ -409,7 +302,7 @@ private: | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| class ZynAddSubFxPlugin : public NativePluginClass | |||||
| class ZynAddSubFxPlugin : public NativePluginAndUiClass | |||||
| { | { | ||||
| public: | public: | ||||
| enum Parameters { | enum Parameters { | ||||
| @@ -423,12 +316,13 @@ public: | |||||
| }; | }; | ||||
| ZynAddSubFxPlugin(const NativeHostDescriptor* const host) | ZynAddSubFxPlugin(const NativeHostDescriptor* const host) | ||||
| : NativePluginClass(host), | |||||
| : NativePluginAndUiClass(host, "zynaddsubfx-ui"), | |||||
| fMiddleWare(nullptr), | |||||
| fMaster(nullptr), | fMaster(nullptr), | ||||
| fSynth(), | fSynth(), | ||||
| fIsActive(false), | fIsActive(false), | ||||
| fMutex(), | fMutex(), | ||||
| fThread(nullptr, fMutex, host), | |||||
| fThread(nullptr, fMutex), | |||||
| leakDetector_ZynAddSubFxPlugin() | leakDetector_ZynAddSubFxPlugin() | ||||
| { | { | ||||
| // init parameters to default | // init parameters to default | ||||
| @@ -447,9 +341,6 @@ public: | |||||
| fSynth.alias(); | fSynth.alias(); | ||||
| // FIXME | |||||
| fSynth.samplerate_f = getSampleRate(); | |||||
| _initMaster(); | _initMaster(); | ||||
| sPrograms.initIfNeeded(); | sPrograms.initIfNeeded(); | ||||
| @@ -565,9 +456,6 @@ protected: | |||||
| if (isOffline() || ! fIsActive) | if (isOffline() || ! fIsActive) | ||||
| { | { | ||||
| sPrograms.load(fMaster, fMutex, channel, bank, program); | sPrograms.load(fMaster, fMutex, channel, bank, program); | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| fThread.uiRepaint(); | |||||
| #endif | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -674,16 +562,44 @@ protected: | |||||
| fMutex.unlock(); | fMutex.unlock(); | ||||
| } | } | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Plugin UI calls | // Plugin UI calls | ||||
| #ifdef HAVE_ZYN_UI_DEPS | |||||
| void uiShow(const bool show) override | void uiShow(const bool show) override | ||||
| { | { | ||||
| if (show) | if (show) | ||||
| fThread.uiShow(); | |||||
| { | |||||
| if (isPipeRunning()) | |||||
| { | |||||
| const CarlaMutexLocker cml(getPipeLock()); | |||||
| writeMessage("focus\n", 6); | |||||
| flushMessages(); | |||||
| return; | |||||
| } | |||||
| carla_stdout("Trying to start UI using \"%s\"", getExtUiPath()); | |||||
| CarlaExternalUI::setData(getExtUiPath(), fMiddleWare->getServerAddress(), getUiName()); | |||||
| if (! CarlaExternalUI::startPipeServer(true)) | |||||
| { | |||||
| uiClosed(); | |||||
| hostUiUnavailable(); | |||||
| } | |||||
| } | |||||
| else | else | ||||
| fThread.uiHide(); | |||||
| { | |||||
| CarlaExternalUI::stopPipeServer(2000); | |||||
| } | |||||
| } | |||||
| void uiIdle() override | |||||
| { | |||||
| NativePluginAndUiClass::uiIdle(); | |||||
| if (isPipeRunning()) | |||||
| fMiddleWare->tick(); | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -738,9 +654,6 @@ protected: | |||||
| fSynth.samplerate = static_cast<uint>(sampleRate); | fSynth.samplerate = static_cast<uint>(sampleRate); | ||||
| fSynth.alias(); | fSynth.alias(); | ||||
| // FIXME | |||||
| fSynth.samplerate_f = sampleRate; | |||||
| _initMaster(); | _initMaster(); | ||||
| if (state != nullptr) | if (state != nullptr) | ||||
| @@ -751,20 +664,15 @@ protected: | |||||
| } | } | ||||
| } | } | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| void uiNameChanged(const char* const uiName) override | |||||
| { | |||||
| fThread.uiChangeName(uiName); | |||||
| } | |||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| private: | private: | ||||
| Master* fMaster; | |||||
| SYNTH_T fSynth; | |||||
| bool fIsActive; | |||||
| float fParameters[kParamCount]; | |||||
| MiddleWare* fMiddleWare; | |||||
| Master* fMaster; | |||||
| SYNTH_T fSynth; | |||||
| bool fIsActive; | |||||
| float fParameters[kParamCount]; | |||||
| CarlaMutex fMutex; | CarlaMutex fMutex; | ||||
| ZynAddSubFxThread fThread; | ZynAddSubFxThread fThread; | ||||
| @@ -796,7 +704,8 @@ private: | |||||
| void _initMaster() | void _initMaster() | ||||
| { | { | ||||
| fMaster = new Master(fSynth); | |||||
| fMiddleWare = new MiddleWare(fSynth); | |||||
| fMaster = fMiddleWare->spawnMaster(); | |||||
| fThread.setMaster(fMaster); | fThread.setMaster(fMaster); | ||||
| fThread.startThread(); | fThread.startThread(); | ||||
| @@ -817,8 +726,9 @@ private: | |||||
| //ensure that everything has stopped | //ensure that everything has stopped | ||||
| fThread.stopThread(-1); | fThread.stopThread(-1); | ||||
| delete fMaster; | |||||
| fMaster = nullptr; | fMaster = nullptr; | ||||
| delete fMiddleWare; | |||||
| fMiddleWare = nullptr; | |||||
| } | } | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -839,10 +749,6 @@ public: | |||||
| denormalkillbuf = new float[8192]; | denormalkillbuf = new float[8192]; | ||||
| for (int i=0; i < 8192; ++i) | for (int i=0; i < 8192; ++i) | ||||
| denormalkillbuf[i] = (RND - 0.5f) * 1e-16f; | denormalkillbuf[i] = (RND - 0.5f) * 1e-16f; | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| gUiPixmapPath = CarlaString(host->resourceDir) + CARLA_OS_SEP_STR "zynaddsubfx" CARLA_OS_SEP_STR; | |||||
| #endif | |||||
| } | } | ||||
| return new ZynAddSubFxPlugin(host); | return new ZynAddSubFxPlugin(host); | ||||
| @@ -861,7 +767,7 @@ public: | |||||
| static const NativePluginDescriptor zynaddsubfxDesc = { | static const NativePluginDescriptor zynaddsubfxDesc = { | ||||
| /* category */ NATIVE_PLUGIN_CATEGORY_SYNTH, | /* category */ NATIVE_PLUGIN_CATEGORY_SYNTH, | ||||
| /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_IS_SYNTH | /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_IS_SYNTH | ||||
| #ifdef WANT_ZYNADDSUBFX_UI | |||||
| #ifdef HAVE_ZYN_UI_DEPS | |||||
| |NATIVE_PLUGIN_HAS_UI | |NATIVE_PLUGIN_HAS_UI | ||||
| #endif | #endif | ||||
| |NATIVE_PLUGIN_USES_MULTI_PROGS | |NATIVE_PLUGIN_USES_MULTI_PROGS | ||||
| @@ -15,7 +15,7 @@ | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | * For a full copy of the GNU General Public License see the doc/GPL.txt file. | ||||
| */ | */ | ||||
| #include "CarlaString.hpp" | |||||
| #include "CarlaPipeUtils.cpp" | |||||
| #ifdef CARLA_OS_WIN | #ifdef CARLA_OS_WIN | ||||
| #define errx(...) | #define errx(...) | ||||
| @@ -23,10 +23,10 @@ | |||||
| #endif | #endif | ||||
| #define PLUGINVERSION | #define PLUGINVERSION | ||||
| #define SOURCE_DIR "/usr/share/zynaddsubfx/examples" | |||||
| #define SOURCE_DIR "/usr/share/zynaddsubfx" | |||||
| #undef override | #undef override | ||||
| CarlaString gUiPixmapPath; | |||||
| CarlaString gUiPixmapPath("/usr/share/carla/resources/zynaddsubfx/"); | |||||
| // zynaddsubfx ui includes | // zynaddsubfx ui includes | ||||
| #include "zynaddsubfx/UI/NioUI.cpp" | #include "zynaddsubfx/UI/NioUI.cpp" | ||||
| @@ -35,7 +35,7 @@ CarlaString gUiPixmapPath; | |||||
| #include "zynaddsubfx/UI/BankUI.cpp" | #include "zynaddsubfx/UI/BankUI.cpp" | ||||
| #include "zynaddsubfx/UI/BankView.cpp" | #include "zynaddsubfx/UI/BankView.cpp" | ||||
| #include "zynaddsubfx/UI/ConfigUI.cpp" | #include "zynaddsubfx/UI/ConfigUI.cpp" | ||||
| #include "zynaddsubfx/UI/Connection.cpp" | |||||
| // #include "zynaddsubfx/UI/Connection.cpp" | |||||
| #include "zynaddsubfx/UI/EffUI.cpp" | #include "zynaddsubfx/UI/EffUI.cpp" | ||||
| #include "zynaddsubfx/UI/EnvelopeFreeEdit.cpp" | #include "zynaddsubfx/UI/EnvelopeFreeEdit.cpp" | ||||
| #include "zynaddsubfx/UI/EnvelopeUI.cpp" | #include "zynaddsubfx/UI/EnvelopeUI.cpp" | ||||
| @@ -69,3 +69,167 @@ CarlaString gUiPixmapPath; | |||||
| #include "zynaddsubfx/UI/ResonanceUI.cpp" | #include "zynaddsubfx/UI/ResonanceUI.cpp" | ||||
| #include "zynaddsubfx/UI/SUBnoteUI.cpp" | #include "zynaddsubfx/UI/SUBnoteUI.cpp" | ||||
| #include "zynaddsubfx/UI/VirKeyboard.cpp" | #include "zynaddsubfx/UI/VirKeyboard.cpp" | ||||
| #include "zynaddsubfx/UI/guimain.cpp" | |||||
| class ZynPipeClient : public CarlaPipeClient | |||||
| { | |||||
| public: | |||||
| ZynPipeClient() noexcept | |||||
| : CarlaPipeClient(), | |||||
| fQuitReceived(false) {} | |||||
| ~ZynPipeClient() noexcept override | |||||
| { | |||||
| if (fQuitReceived) | |||||
| return; | |||||
| const CarlaMutexLocker cml(getPipeLock()); | |||||
| writeMessage("exiting\n"); | |||||
| flushMessages(); | |||||
| } | |||||
| protected: | |||||
| bool msgReceived(const char* const msg) noexcept override | |||||
| { | |||||
| if (std::strcmp(msg, "show") == 0) | |||||
| { | |||||
| try { | |||||
| GUI::raiseUi(gui, "/show", "i", 1); | |||||
| } CARLA_SAFE_EXCEPTION("msgReceived show"); | |||||
| return true; | |||||
| } | |||||
| if (std::strcmp(msg, "hide") == 0) | |||||
| { | |||||
| try { | |||||
| GUI::raiseUi(gui, "/hide", ""); | |||||
| } CARLA_SAFE_EXCEPTION("msgReceived hide"); | |||||
| return true; | |||||
| } | |||||
| if (std::strcmp(msg, "focus") == 0) | |||||
| { | |||||
| try { | |||||
| GUI::raiseUi(gui, "/focus", ""); | |||||
| } CARLA_SAFE_EXCEPTION("msgReceived focus"); | |||||
| return true; | |||||
| } | |||||
| if (std::strcmp(msg, "uiTitle") == 0) | |||||
| { | |||||
| const char* uiTitle; | |||||
| CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uiTitle), true); | |||||
| try { | |||||
| GUI::raiseUi(gui, "/title", "s", uiTitle); | |||||
| } CARLA_SAFE_EXCEPTION("msgReceived uiTitle"); | |||||
| return true; | |||||
| } | |||||
| if (std::strcmp(msg, "quit") == 0) | |||||
| { | |||||
| fQuitReceived = true; | |||||
| try { | |||||
| GUI::raiseUi(gui, "/close-ui", ""); | |||||
| } CARLA_SAFE_EXCEPTION("msgReceived quit"); | |||||
| return true; | |||||
| } | |||||
| carla_stderr("ZynPipeClient::msgReceived : %s", msg); | |||||
| } | |||||
| private: | |||||
| bool fQuitReceived; | |||||
| }; | |||||
| int main(int argc, const char* argv[]) | |||||
| { | |||||
| ZynPipeClient pipe; | |||||
| const char* uiTitle = nullptr; | |||||
| // Startup Liblo Link | |||||
| if (argc > 1) { | |||||
| sendtourl = argv[1]; | |||||
| uiTitle = argv[2]; | |||||
| if (! pipe.initPipeClient(argv)) | |||||
| return 1; | |||||
| server = lo_server_new_with_proto(NULL, LO_UDP, liblo_error_cb); | |||||
| lo_server_add_method(server, NULL, NULL, handler_function, 0); | |||||
| } | |||||
| gui = GUI::createUi(new UI_Interface(), &Pexitprogram); | |||||
| if (argc == 1) | |||||
| GUI::raiseUi(gui, "/show", "i", 1); | |||||
| while(Pexitprogram == 0) { | |||||
| if(server) | |||||
| while(lo_server_recv_noblock(server, 0)); | |||||
| pipe.idlePipe(); | |||||
| GUI::tickUi(gui); | |||||
| } | |||||
| GUI::destroyUi(gui); | |||||
| gui = nullptr; | |||||
| return 0; | |||||
| } | |||||
| // -------------------------------------------------------------------------------------------- | |||||
| // we need juce::Time::getMillisecondCounter() | |||||
| #ifdef CARLA_OS_WIN | |||||
| #include <ctime> | |||||
| #else | |||||
| #include <sys/time.h> | |||||
| #endif | |||||
| namespace juce { | |||||
| #include "juce_core/native/juce_BasicNativeHeaders.h" | |||||
| #include "juce_core/juce_core.h" | |||||
| static uint32 lastMSCounterValue = 0; | |||||
| #ifdef CARLA_OS_WIN | |||||
| uint32 juce_millisecondsSinceStartup() noexcept | |||||
| { | |||||
| return (uint32) timeGetTime(); | |||||
| } | |||||
| #else | |||||
| uint32 juce_millisecondsSinceStartup() noexcept | |||||
| { | |||||
| timespec t; | |||||
| clock_gettime (CLOCK_MONOTONIC, &t); | |||||
| return t.tv_sec * 1000 + t.tv_nsec / 1000000; | |||||
| } | |||||
| #endif | |||||
| uint32 Time::getMillisecondCounter() noexcept | |||||
| { | |||||
| const uint32 now = juce_millisecondsSinceStartup(); | |||||
| if (now < lastMSCounterValue) | |||||
| { | |||||
| // in multi-threaded apps this might be called concurrently, so | |||||
| // make sure that our last counter value only increases and doesn't | |||||
| // go backwards.. | |||||
| if (now < lastMSCounterValue - 1000) | |||||
| lastMSCounterValue = now; | |||||
| } | |||||
| else | |||||
| { | |||||
| lastMSCounterValue = now; | |||||
| } | |||||
| return now; | |||||
| } | |||||
| } // namespace juce | |||||
| // -------------------------------------------------------------------------------------------- | |||||
| @@ -1,7 +1,4 @@ | |||||
| #ifndef ALLOCATOR_H | |||||
| #define ALLOCATOR_H | |||||
| #pragma once | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #include <utility> | #include <utility> | ||||
| @@ -109,5 +106,3 @@ extern Allocator DummyAlloc; | |||||
| * * A new one is constructed with a deep copy | * * A new one is constructed with a deep copy | ||||
| * * The old one is returned to middleware for deallocation | * * The old one is returned to middleware for deallocation | ||||
| */ | */ | ||||
| #endif | |||||
| @@ -612,7 +612,6 @@ void Master::AudioOut(float *outl, float *outr) | |||||
| while(uToB && uToB->hasNext() && events < 10) { | while(uToB && uToB->hasNext() && events < 10) { | ||||
| const char *msg = uToB->read(); | const char *msg = uToB->read(); | ||||
| #ifndef PLUGINVERSION | |||||
| if(!strcmp(msg, "/load-master")) { | if(!strcmp(msg, "/load-master")) { | ||||
| Master *this_master = this; | Master *this_master = this; | ||||
| Master *new_master = *(Master**)rtosc_argument(msg, 0).b.data; | Master *new_master = *(Master**)rtosc_argument(msg, 0).b.data; | ||||
| @@ -621,7 +620,6 @@ void Master::AudioOut(float *outl, float *outr) | |||||
| bToU->write("/free", "sb", "Master", sizeof(Master*), &this_master); | bToU->write("/free", "sb", "Master", sizeof(Master*), &this_master); | ||||
| return; | return; | ||||
| } | } | ||||
| #endif | |||||
| //XXX yes, this is not realtime safe, but it is useful... | //XXX yes, this is not realtime safe, but it is useful... | ||||
| if(strcmp(msg, "/get-vu") && false) { | if(strcmp(msg, "/get-vu") && false) { | ||||
| @@ -650,7 +648,7 @@ void Master::AudioOut(float *outl, float *outr) | |||||
| } | } | ||||
| if(events>1 && false) | if(events>1 && false) | ||||
| fprintf(stderr, "backend: %d events per cycle\n",events); | fprintf(stderr, "backend: %d events per cycle\n",events); | ||||
| //Swaps the Left channel with Right Channel | //Swaps the Left channel with Right Channel | ||||
| if(swaplr) | if(swaplr) | ||||
| @@ -204,11 +204,15 @@ void refreshBankView(const Bank &bank, unsigned loc, Fl_Osc_Interface *osc) | |||||
| errx(1, "Failure to handle bank update properly..."); | errx(1, "Failure to handle bank update properly..."); | ||||
| osc->tryLink(response); | |||||
| if (osc) | |||||
| osc->tryLink(response); | |||||
| } | } | ||||
| void bankList(Bank &bank, Fl_Osc_Interface *osc) | void bankList(Bank &bank, Fl_Osc_Interface *osc) | ||||
| { | { | ||||
| if (! osc) | |||||
| return; | |||||
| char response[2048]; | char response[2048]; | ||||
| int i = 0; | int i = 0; | ||||
| @@ -242,7 +246,8 @@ void bankPos(Bank &bank, Fl_Osc_Interface *osc) | |||||
| if(!rtosc_message(response, 2048, "/loadbank", "i", bank.bankpos)) | if(!rtosc_message(response, 2048, "/loadbank", "i", bank.bankpos)) | ||||
| errx(1, "Failure to handle bank update properly..."); | errx(1, "Failure to handle bank update properly..."); | ||||
| osc->tryLink(response); | |||||
| if (osc) | |||||
| osc->tryLink(response); | |||||
| } | } | ||||
| /***************************************************************************** | /***************************************************************************** | ||||
| @@ -1289,8 +1294,13 @@ void MiddleWare::activeUrl(std::string u) | |||||
| { | { | ||||
| impl->last_url = u; | impl->last_url = u; | ||||
| } | } | ||||
| const SYNTH_T &MiddleWare::getSynth(void) const | const SYNTH_T &MiddleWare::getSynth(void) const | ||||
| { | { | ||||
| return impl->synth; | return impl->synth; | ||||
| } | } | ||||
| const char* MiddleWare::getServerAddress(void) const | |||||
| { | |||||
| return lo_server_get_url(impl->server); | |||||
| } | |||||
| @@ -35,6 +35,8 @@ class MiddleWare | |||||
| void activeUrl(std::string u); | void activeUrl(std::string u); | ||||
| //View Synthesis Parameters | //View Synthesis Parameters | ||||
| const SYNTH_T &getSynth(void) const; | const SYNTH_T &getSynth(void) const; | ||||
| //liblo stuff | |||||
| const char* getServerAddress(void) const; | |||||
| private: | private: | ||||
| class MiddleWareImpl *impl; | class MiddleWareImpl *impl; | ||||
| }; | }; | ||||
| @@ -273,9 +273,6 @@ const Ports &ADnoteParameters::ports = adPorts; | |||||
| const Ports &ADnoteVoiceParam::ports = voicePorts; | const Ports &ADnoteVoiceParam::ports = voicePorts; | ||||
| const Ports &ADnoteGlobalParam::ports = globalPorts; | const Ports &ADnoteGlobalParam::ports = globalPorts; | ||||
| int ADnote_unison_sizes[] = | |||||
| {1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 0}; | |||||
| ADnoteParameters::ADnoteParameters(const SYNTH_T &synth, FFTwrapper *fft_) | ADnoteParameters::ADnoteParameters(const SYNTH_T &synth, FFTwrapper *fft_) | ||||
| :PresetsArray() | :PresetsArray() | ||||
| { | { | ||||
| @@ -29,7 +29,8 @@ | |||||
| enum FMTYPE { | enum FMTYPE { | ||||
| NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PITCH_MOD | ||||
| }; | }; | ||||
| extern int ADnote_unison_sizes[]; | |||||
| static const int ADnote_unison_sizes[] = | |||||
| {1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 0}; | |||||
| /*****************************************************************/ | /*****************************************************************/ | ||||
| /* GLOBAL PARAMETERS */ | /* GLOBAL PARAMETERS */ | ||||
| @@ -34,9 +34,6 @@ NSM_Client *nsm = 0; | |||||
| lo_server server; | lo_server server; | ||||
| std::string sendtourl; | std::string sendtourl; | ||||
| int ADnote_unison_sizes[] = | |||||
| {1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 0}; | |||||
| /* | /* | ||||
| * Program exit | * Program exit | ||||
| */ | */ | ||||
| @@ -128,23 +125,38 @@ ui_handle_t GUI::createUi(Fl_Osc_Interface *osc, void *exit) | |||||
| Fl_Dial::default_style(Fl_Dial::PIXMAP_DIAL); | Fl_Dial::default_style(Fl_Dial::PIXMAP_DIAL); | ||||
| #ifdef CARLA_VERSION_STRING | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(gUiPixmapPath + "knob.png")) | |||||
| Fl_Dial::default_image(img); | |||||
| #else | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/knob.png")) | if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/knob.png")) | ||||
| Fl_Dial::default_image(img); | Fl_Dial::default_image(img); | ||||
| #endif | |||||
| else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/knob.png")) | else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/knob.png")) | ||||
| Fl_Dial::default_image(img); | Fl_Dial::default_image(img); | ||||
| else | else | ||||
| errx(1, "ERROR: Cannot find pixmaps/knob.png"); | errx(1, "ERROR: Cannot find pixmaps/knob.png"); | ||||
| #ifdef CARLA_VERSION_STRING | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(gUiPixmapPath + "window_backdrop.png")) | |||||
| Fl::scheme_bg(new Fl_Tiled_Image(img)); | |||||
| #else | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/window_backdrop.png")) | if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/window_backdrop.png")) | ||||
| Fl::scheme_bg(new Fl_Tiled_Image(img)); | Fl::scheme_bg(new Fl_Tiled_Image(img)); | ||||
| #endif | |||||
| else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/window_backdrop.png")) | else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/window_backdrop.png")) | ||||
| Fl::scheme_bg(new Fl_Tiled_Image(img)); | Fl::scheme_bg(new Fl_Tiled_Image(img)); | ||||
| else | else | ||||
| errx(1, "ERROR: Cannot find pixmaps/window_backdrop.png"); | errx(1, "ERROR: Cannot find pixmaps/window_backdrop.png"); | ||||
| #ifdef CARLA_VERSION_STRING | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(gUiPixmapPath + "module_backdrop.png")) | |||||
| module_backdrop = new Fl_Tiled_Image(img); | |||||
| #else | |||||
| if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/module_backdrop.png")) | if(Fl_Shared_Image *img = Fl_Shared_Image::get(PIXMAP_PATH "/module_backdrop.png")) | ||||
| module_backdrop = new Fl_Tiled_Image(img); | module_backdrop = new Fl_Tiled_Image(img); | ||||
| #endif | |||||
| else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/module_backdrop.png")) | else if(Fl_Shared_Image *img = Fl_Shared_Image::get(SOURCE_DIR "/pixmaps/module_backdrop.png")) | ||||
| module_backdrop = new Fl_Tiled_Image(img); | module_backdrop = new Fl_Tiled_Image(img); | ||||
| else | else | ||||
| @@ -510,6 +522,7 @@ static int handler_function(const char *path, const char *types, lo_arg **argv, | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #ifndef CARLA_VERSION_STRING | |||||
| int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
| { | { | ||||
| //Startup Liblo Link | //Startup Liblo Link | ||||
| @@ -531,3 +544,4 @@ int main(int argc, char *argv[]) | |||||
| exitprogram(); | exitprogram(); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | |||||
| @@ -35,8 +35,8 @@ public: | |||||
| CarlaExternalUI() noexcept | CarlaExternalUI() noexcept | ||||
| : fFilename(), | : fFilename(), | ||||
| fSampleRate(), | |||||
| fUiTitle(), | |||||
| fArg1(), | |||||
| fArg2(), | |||||
| fUiState(UiNone), | fUiState(UiNone), | ||||
| leakDetector_CarlaExternalUI() {} | leakDetector_CarlaExternalUI() {} | ||||
| @@ -52,16 +52,23 @@ public: | |||||
| return uiState; | return uiState; | ||||
| } | } | ||||
| void setData(const char* const filename, const char* const arg1, const char* const arg2) noexcept | |||||
| { | |||||
| fFilename = filename; | |||||
| fArg1 = arg1; | |||||
| fArg2 = arg2; | |||||
| } | |||||
| void setData(const char* const filename, const double sampleRate, const char* const uiTitle) noexcept | void setData(const char* const filename, const double sampleRate, const char* const uiTitle) noexcept | ||||
| { | { | ||||
| fFilename = filename; | |||||
| fSampleRate = CarlaString(sampleRate); | |||||
| fUiTitle = uiTitle; | |||||
| fFilename = filename; | |||||
| fArg1 = CarlaString(sampleRate); | |||||
| fArg2 = uiTitle; | |||||
| } | } | ||||
| bool startPipeServer(const bool show = true) noexcept | bool startPipeServer(const bool show = true) noexcept | ||||
| { | { | ||||
| if (CarlaPipeServer::startPipeServer(fFilename, fSampleRate, fUiTitle)) | |||||
| if (CarlaPipeServer::startPipeServer(fFilename, fArg1, fArg2)) | |||||
| { | { | ||||
| if (show) | if (show) | ||||
| writeShowMessage(); | writeShowMessage(); | ||||
| @@ -87,8 +94,8 @@ protected: | |||||
| private: | private: | ||||
| CarlaString fFilename; | CarlaString fFilename; | ||||
| CarlaString fSampleRate; | |||||
| CarlaString fUiTitle; | |||||
| CarlaString fArg1; | |||||
| CarlaString fArg2; | |||||
| UiState fUiState; | UiState fUiState; | ||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaExternalUI) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaExternalUI) | ||||