diff --git a/source/backend/Makefile b/source/backend/Makefile index 790df7087..3f353fef7 100644 --- a/source/backend/Makefile +++ b/source/backend/Makefile @@ -13,12 +13,8 @@ OBJS_standalone = \ $(OBJDIR)/CarlaStandalone.cpp.o \ $(OBJDIR)/CarlaStandaloneNSM.cpp.o -OBJS_utils = \ - $(OBJDIR)/CarlaUtils.cpp.o - TARGETS = \ - $(BINDIR)/libcarla_standalone2$(LIB_EXT) \ - $(BINDIR)/libcarla_utils$(LIB_EXT) + $(BINDIR)/libcarla_standalone2$(LIB_EXT) # ---------------------------------------------------------------------------------------------------------------------------- @@ -44,9 +40,6 @@ endif STANDALONE_LIBS += $(MODULEDIR)/rtaudio.a STANDALONE_LIBS += $(MODULEDIR)/rtmidi.a -UTILS_LIBS += $(MODULEDIR)/lilv.a -UTILS_LIBS += $(MODULEDIR)/water.files.a - # ---------------------------------------------------------------------------------------------------------------------------- STANDALONE_LINK_FLAGS = $(JACKBRIDGE_LIBS) @@ -64,17 +57,6 @@ STANDALONE_LINK_FLAGS += $(FLUIDSYNTH_LIBS) STANDALONE_LINK_FLAGS += $(LINUXSAMPLER_LIBS) STANDALONE_LINK_FLAGS += $(X11_LIBS) -UTILS_LINK_FLAGS += $(LILV_LIBS) -UTILS_LINK_FLAGS += $(WATER_LIBS) - -ifeq ($(HAVE_X11),true) -UTILS_LINK_FLAGS += $(X11_LIBS) -endif - -ifneq ($(HAIKU),true) -UTILS_LINK_FLAGS += -lpthread -endif - # ---------------------------------------------------------------------------------------------------------------------------- all: $(TARGETS) @@ -82,9 +64,10 @@ all: $(TARGETS) # ---------------------------------------------------------------------------------------------------------------------------- clean: - rm -f $(OBJS_standalone) $(OBJS_utils) $(TARGETS) + rm -f $(OBJS_standalone) $(TARGETS) $(MAKE) clean -C engine $(MAKE) clean -C plugin + $(MAKE) clean -C utils debug: $(MAKE) DEBUG=true @@ -99,11 +82,6 @@ $(BINDIR)/libcarla_standalone2$(LIB_EXT): $(OBJS_standalone) $(STANDALONE_LIBS) @echo "Linking libcarla_standalone2$(LIB_EXT)" @$(CXX) $(OBJS_standalone) $(LIBS_START) $(STANDALONE_LIBS) $(LIBS_END) $(LINK_FLAGS) $(STANDALONE_LINK_FLAGS) $(SHARED) -o $@ -$(BINDIR)/libcarla_utils$(LIB_EXT): $(OBJS_utils) $(UTILS_LIBS) - -@mkdir -p $(BINDIR) - @echo "Linking libcarla_utils$(LIB_EXT)" - @$(CXX) $(OBJS_utils) $(LIBS_START) $(UTILS_LIBS) $(LIBS_END) $(LINK_FLAGS) $(UTILS_LINK_FLAGS) $(SHARED) -o $@ - # ---------------------------------------------------------------------------------------------------------------------------- ifeq ($(MACOS),true) @@ -111,11 +89,6 @@ $(OBJDIR)/CarlaStandalone.cpp.o: CarlaStandalone.cpp -@mkdir -p $(OBJDIR) @echo "Compiling $<" @$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ - -$(OBJDIR)/CarlaUtils.cpp.o: CarlaUtils.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling $<" - @$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ endif $(OBJDIR)/%.cpp.o: %.cpp @@ -124,6 +97,5 @@ $(OBJDIR)/%.cpp.o: %.cpp @$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ -include $(OBJS_standalone:%.o=%.d) --include $(OBJS_utils:%.o=%.d) # ---------------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/CarlaUtils.cpp b/source/backend/utils/CachedPlugins.cpp similarity index 61% rename from source/backend/CarlaUtils.cpp rename to source/backend/utils/CachedPlugins.cpp index 300280608..0192971a5 100644 --- a/source/backend/CarlaUtils.cpp +++ b/source/backend/utils/CachedPlugins.cpp @@ -18,28 +18,8 @@ #include "CarlaUtils.h" #include "CarlaNative.h" - -#include "CarlaBackendUtils.hpp" +#include "CarlaString.hpp" #include "CarlaLv2Utils.hpp" -#include "CarlaPipeUtils.hpp" -#include "CarlaThread.hpp" -#include "LinkedList.hpp" - -#include "water/files/File.h" - -#ifdef CARLA_OS_MAC -# import -#endif - -#ifndef CARLA_UTILS_CACHED_PLUGINS_ONLY -# include "rtaudio/RtAudio.h" -# include "rtmidi/RtMidi.h" -# ifdef HAVE_X11 -# include -# endif -#endif - -#include "../native-plugins/_data.all.cpp" namespace CB = CarlaBackend; @@ -429,409 +409,8 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, return &info; } -#ifndef CARLA_UTILS_CACHED_PLUGINS_ONLY -// ------------------------------------------------------------------------------------------------------------------- - -const char* carla_get_complete_license_text() -{ - carla_debug("carla_get_complete_license_text()"); - - static CarlaString retText; - - if (retText.isEmpty()) - { - retText = - "

This current Carla build is using the following features and 3rd-party code:

" - ""; - } - - return retText; -} - -const char* const* carla_get_supported_file_extensions() -{ - carla_debug("carla_get_supported_file_extensions()"); - - // NOTE: please keep in sync with CarlaEngine::loadFile!! - static const char* const extensions[] = { - // Base types - "carxp", "carxs", - - // plugin files and resources -#ifdef HAVE_FLUIDSYNTH - "sf2", "sf3", -#endif -#ifdef HAVE_ZYN_DEPS - "xmz", "xiz", -#endif -#if defined(CARLA_OS_MAC) - "vst", -#else - "dll", - "so", -#endif - - // Audio files -#ifdef HAVE_SNDFILE - "aif", "aifc", "aiff", "au", "bwf", "flac", "htk", "iff", "mat4", "mat5", "oga", "ogg", - "paf", "pvf", "pvf5", "sd2", "sf", "snd", "svx", "vcc", "w64", "wav", "xi", -#endif -#ifdef HAVE_FFMPEG - "3g2", "3gp", "aac", "ac3", "amr", "ape", "mp2", "mp3", "mpc", "wma", -# ifdef HAVE_SNDFILE - // FFmpeg without sndfile - "flac", "oga", "ogg", "w64", "wav", -# endif -#endif - - // MIDI files - "mid", "midi", - - // SFZ - "sfz", - - // terminator - nullptr - }; - - return extensions; -} - -const char* const* carla_get_supported_features() -{ - carla_debug("carla_get_supported_features()"); - - static const char* const features[] = { -#ifdef HAVE_FLUIDSYNTH - "sf2", -#endif -#ifdef HAVE_HYLIA - "link", -#endif -#ifdef HAVE_LIBLO - "osc", -#endif -#if defined(HAVE_LIBMAGIC) || defined(CARLA_OS_WIN) - "bridges", -#endif -#ifdef HAVE_PYQT - "gui", -#endif - nullptr - }; - - return features; -} - -// ------------------------------------------------------------------------------------------------------------------- - -void carla_fflush(bool err) -{ - std::fflush(err ? stderr : stdout); -} - -void carla_fputs(bool err, const char* string) -{ - std::fputs(string, err ? stderr : stdout); -} - -void carla_set_process_name(const char* name) -{ - carla_debug("carla_set_process_name(\"%s\")", name); - - CarlaThread::setCurrentThreadName(name); -} - -// ------------------------------------------------------------------------------------------------------------------- - -class CarlaPipeClientPlugin : public CarlaPipeClient -{ -public: - CarlaPipeClientPlugin(const CarlaPipeCallbackFunc callbackFunc, void* const callbackPtr) noexcept - : CarlaPipeClient(), - fCallbackFunc(callbackFunc), - fCallbackPtr(callbackPtr), - fLastReadLine(nullptr) - { - CARLA_SAFE_ASSERT(fCallbackFunc != nullptr); - } - - ~CarlaPipeClientPlugin() override - { - if (fLastReadLine != nullptr) - { - delete[] fLastReadLine; - fLastReadLine = nullptr; - } - } - - const char* readlineblock(const uint timeout) noexcept - { - delete[] fLastReadLine; - fLastReadLine = CarlaPipeClient::_readlineblock(timeout); - return fLastReadLine; - } - - bool msgReceived(const char* const msg) noexcept override - { - if (fCallbackFunc != nullptr) - { - try { - fCallbackFunc(fCallbackPtr, msg); - } CARLA_SAFE_EXCEPTION("msgReceived"); - } - - return true; - } - -private: - const CarlaPipeCallbackFunc fCallbackFunc; - void* const fCallbackPtr; - const char* fLastReadLine; - - CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClientPlugin) -}; - -CarlaPipeClientHandle carla_pipe_client_new(const char* argv[], CarlaPipeCallbackFunc callbackFunc, void* callbackPtr) -{ - carla_debug("carla_pipe_client_new(%p, %p, %p)", argv, callbackFunc, callbackPtr); - - CarlaPipeClientPlugin* const pipe(new CarlaPipeClientPlugin(callbackFunc, callbackPtr)); - - if (! pipe->initPipeClient(argv)) - { - delete pipe; - return nullptr; - } - - return pipe; -} - -void carla_pipe_client_idle(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); - - ((CarlaPipeClientPlugin*)handle)->idlePipe(); -} - -bool carla_pipe_client_is_running(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); - - return ((CarlaPipeClientPlugin*)handle)->isPipeRunning(); -} - -void carla_pipe_client_lock(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); - - return ((CarlaPipeClientPlugin*)handle)->lockPipe(); -} - -void carla_pipe_client_unlock(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); - - return ((CarlaPipeClientPlugin*)handle)->unlockPipe(); -} - -const char* carla_pipe_client_readlineblock(CarlaPipeClientHandle handle, uint timeout) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, nullptr); - - return ((CarlaPipeClientPlugin*)handle)->readlineblock(timeout); -} - -bool carla_pipe_client_write_msg(CarlaPipeClientHandle handle, const char* msg) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); - - return ((CarlaPipeClientPlugin*)handle)->writeMessage(msg); -} - -bool carla_pipe_client_write_and_fix_msg(CarlaPipeClientHandle handle, const char* msg) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); - - return ((CarlaPipeClientPlugin*)handle)->writeAndFixMessage(msg); -} - -bool carla_pipe_client_flush(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); - - return ((CarlaPipeClientPlugin*)handle)->flushMessages(); -} - -bool carla_pipe_client_flush_and_unlock(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); - - CarlaPipeClientPlugin* const pipe((CarlaPipeClientPlugin*)handle); - const bool ret(pipe->flushMessages()); - pipe->unlockPipe(); - return ret; -} - -void carla_pipe_client_destroy(CarlaPipeClientHandle handle) -{ - CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); - carla_debug("carla_pipe_client_destroy(%p)", handle); - - CarlaPipeClientPlugin* const pipe((CarlaPipeClientPlugin*)handle); - pipe->closePipeClient(); - delete pipe; -} - -// ------------------------------------------------------------------------------------------------------------------- - -const char* carla_get_library_filename() -{ - carla_debug("carla_get_library_filename()"); - - static CarlaString ret; - - if (ret.isEmpty()) - { - using water::File; - ret = File(File::getSpecialLocation(File::currentExecutableFile)).getFullPathName().toRawUTF8(); - } - - return ret; -} - -const char* carla_get_library_folder() -{ - carla_debug("carla_get_library_folder()"); - - static CarlaString ret; - - if (ret.isEmpty()) - { - using water::File; - ret = File(File::getSpecialLocation(File::currentExecutableFile).getParentDirectory()).getFullPathName().toRawUTF8(); - } - - return ret; -} - -// ------------------------------------------------------------------------------------------------------------------- - -void carla_x11_reparent_window(uintptr_t winId1, uintptr_t winId2) -{ - CARLA_SAFE_ASSERT_RETURN(winId1 != 0,); - CARLA_SAFE_ASSERT_RETURN(winId2 != 0,); - -#ifdef HAVE_X11 - if (::Display* const disp = XOpenDisplay(nullptr)) - { - XReparentWindow(disp, winId1, winId2, 0, 0); - XMapWindow(disp, winId1); - XCloseDisplay(disp); - } -#endif -} - -void carla_x11_move_window(uintptr_t winId, int x, int y) -{ - CARLA_SAFE_ASSERT_RETURN(winId != 0,); - -#ifdef HAVE_X11 - if (::Display* const disp = XOpenDisplay(nullptr)) - { - XMoveWindow(disp, winId, x, y); - XCloseDisplay(disp); - } -#else - // unused - return; (void)x; (void)y; -#endif -} - -int* carla_x11_get_window_pos(uintptr_t winId) -{ - static int pos[2]; - - if (winId == 0) - { - pos[0] = 0; - pos[1] = 0; - } -#ifdef HAVE_X11 - else if (::Display* const disp = XOpenDisplay(nullptr)) - { - int x, y; - Window child; - XWindowAttributes xwa; - XTranslateCoordinates(disp, winId, XRootWindow(disp, 0), 0, 0, &x, &y, &child); - XGetWindowAttributes(disp, winId, &xwa); - XCloseDisplay(disp); - pos[0] = x - xwa.x; - pos[1] = y - xwa.y; - } -#endif - else - { - pos[0] = 0; - pos[1] = 0; - } - - return pos; -} - -int carla_cocoa_get_window(void* nsViewPtr) -{ - CARLA_SAFE_ASSERT_RETURN(nsViewPtr != nullptr, 0); - -#ifdef CARLA_OS_MAC - NSView* nsView = (NSView*)nsViewPtr; - return [[nsView window] windowNumber]; -#else - return 0; -#endif -} - // ------------------------------------------------------------------------------------------------------------------- -#include "CarlaPipeUtils.cpp" - -#if !(defined(DEBUG) || defined(BUILDING_CARLA_FOR_WINDOWS)) -# include "water/misc/Time.cpp" -#endif +#include "../native-plugins/_data.all.cpp" // ------------------------------------------------------------------------------------------------------------------- -#endif // CARLA_UTILS_CACHED_PLUGINS_ONLY diff --git a/source/backend/utils/Information.cpp b/source/backend/utils/Information.cpp new file mode 100644 index 000000000..fe4a5e9d8 --- /dev/null +++ b/source/backend/utils/Information.cpp @@ -0,0 +1,186 @@ +/* + * Carla Plugin Host + * Copyright (C) 2011-2018 Filipe Coelho + * + * 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 doc/GPL.txt file. + */ + +#include "CarlaUtils.h" + +#include "CarlaString.hpp" + +#include "rtaudio/RtAudio.h" +#include "rtmidi/RtMidi.h" + +#include "water/files/File.h" + +// ------------------------------------------------------------------------------------------------------------------- + +const char* carla_get_complete_license_text() +{ + carla_debug("carla_get_complete_license_text()"); + + static CarlaString retText; + + if (retText.isEmpty()) + { + retText = + "

This current Carla build is using the following features and 3rd-party code:

" + "
    " + + // Plugin formats + "
  • LADSPA plugin support
  • " + "
  • DSSI plugin support
  • " + "
  • LV2 plugin support
  • " + "
  • VST2 plugin support using VeSTige header by Javier Serrano Polo
  • " + + // Sample kit libraries +#ifdef HAVE_FLUIDSYNTH + "
  • FluidSynth library for SF2/3 support
  • " +#endif + "
  • SFZero module for SFZ support
  • " + + // misc libs + "
  • base64 utilities based on code by Ren\u00E9 Nyffenegger
  • " + "
  • liblo library for OSC support
  • " + "
  • rtmempool library by Nedko Arnaudov" + "
  • serd, sord, sratom and lilv libraries for LV2 discovery
  • " + "
  • RtAudio v" RTAUDIO_VERSION " and RtMidi v" RTMIDI_VERSION " for native Audio and MIDI support
  • " + + // Internal plugins + "
  • MIDI Sequencer UI code by Perry Nguyen
  • " + + // External plugins +#ifdef HAVE_EXTERNAL_PLUGINS + "
  • Nekobi plugin code based on nekobee by Sean Bolton and others
  • " + "
  • VectorJuice and WobbleJuice plugin code by Andre Sklenar
  • " +# ifdef HAVE_ZYN_DEPS + "
  • ZynAddSubFX plugin code by Mark McCurry and Nasca Octavian Paul
  • " +# endif +#endif // HAVE_EXTERNAL_PLUGINS + + // end + "
"; + } + + return retText; +} + +const char* const* carla_get_supported_file_extensions() +{ + carla_debug("carla_get_supported_file_extensions()"); + + // NOTE: please keep in sync with CarlaEngine::loadFile!! + static const char* const extensions[] = { + // Base types + "carxp", "carxs", + + // plugin files and resources +#ifdef HAVE_FLUIDSYNTH + "sf2", "sf3", +#endif +#ifdef HAVE_ZYN_DEPS + "xmz", "xiz", +#endif +#if defined(CARLA_OS_MAC) + "vst", +#else + "dll", + "so", +#endif + + // Audio files +#ifdef HAVE_SNDFILE + "aif", "aifc", "aiff", "au", "bwf", "flac", "htk", "iff", "mat4", "mat5", "oga", "ogg", + "paf", "pvf", "pvf5", "sd2", "sf", "snd", "svx", "vcc", "w64", "wav", "xi", +#endif +#ifdef HAVE_FFMPEG + "3g2", "3gp", "aac", "ac3", "amr", "ape", "mp2", "mp3", "mpc", "wma", +# ifdef HAVE_SNDFILE + // FFmpeg without sndfile + "flac", "oga", "ogg", "w64", "wav", +# endif +#endif + + // MIDI files + "mid", "midi", + + // SFZ + "sfz", + + // terminator + nullptr + }; + + return extensions; +} + +const char* const* carla_get_supported_features() +{ + carla_debug("carla_get_supported_features()"); + + static const char* const features[] = { +#ifdef HAVE_FLUIDSYNTH + "sf2", +#endif +#ifdef HAVE_HYLIA + "link", +#endif +#ifdef HAVE_LIBLO + "osc", +#endif +#if defined(HAVE_LIBMAGIC) || defined(CARLA_OS_WIN) + "bridges", +#endif +#ifdef HAVE_PYQT + "gui", +#endif + nullptr + }; + + return features; +} + +// ------------------------------------------------------------------------------------------------------------------- + +const char* carla_get_library_filename() +{ + carla_debug("carla_get_library_filename()"); + + static CarlaString ret; + + if (ret.isEmpty()) + { + using water::File; + ret = File(File::getSpecialLocation(File::currentExecutableFile)).getFullPathName().toRawUTF8(); + } + + return ret; +} + +const char* carla_get_library_folder() +{ + carla_debug("carla_get_library_folder()"); + + static CarlaString ret; + + if (ret.isEmpty()) + { + using water::File; + ret = File(File::getSpecialLocation(File::currentExecutableFile).getParentDirectory()).getFullPathName().toRawUTF8(); + } + + return ret; +} + +// ------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/utils/Makefile b/source/backend/utils/Makefile new file mode 100644 index 000000000..65b959e6c --- /dev/null +++ b/source/backend/utils/Makefile @@ -0,0 +1,72 @@ +#!/usr/bin/make -f +# Makefile for carla-plugin # +# ------------------------- # +# Created by falkTX +# + +CWD=../.. +include ../Makefile.mk + +# ---------------------------------------------------------------------------------------------------------------------------- + +OBJS = \ + $(OBJDIR)/CachedPlugins.cpp.o \ + $(OBJDIR)/Information.cpp.o \ + $(OBJDIR)/PipeClient.cpp.o \ + $(OBJDIR)/System.cpp.o \ + $(OBJDIR)/Windows.cpp.o + +TARGETS = $(BINDIR)/libcarla_utils$(LIB_EXT) + +# ---------------------------------------------------------------------------------------------------------------------------- + +LIBS = $(MODULEDIR)/lilv.a +LIBS += $(MODULEDIR)/water.files.a + +LINK_FLAGS += $(LILV_LIBS) +LINK_FLAGS += $(WATER_LIBS) + +ifeq ($(HAVE_X11),true) +LINK_FLAGS += $(X11_LIBS) +endif + +ifneq ($(HAIKU),true) +LINK_FLAGS += -lpthread +endif + +# ---------------------------------------------------------------------------------------------------------------------------- + +all: $(TARGETS) + +# ---------------------------------------------------------------------------------------------------------------------------- + +clean: + rm -f $(OBJS) $(TARGETS) + +debug: + $(MAKE) DEBUG=true + +# ---------------------------------------------------------------------------------------------------------------------------- + +$(BINDIR)/libcarla_utils$(LIB_EXT): $(OBJS) $(LIBS) + -@mkdir -p $(BINDIR) + @echo "Linking libcarla_utils$(LIB_EXT)" + @$(CXX) $(OBJS) $(LIBS_START) $(LIBS) $(LIBS_END) $(LINK_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ + +# ---------------------------------------------------------------------------------------------------------------------------- + +ifeq ($(MACOS),true) +$(OBJDIR)/Windows.cpp.o: Windows.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ +endif + +$(OBJDIR)/%.cpp.o: %.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ + +-include $(OBJS:%.o=%.d) + +# ---------------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/utils/PipeClient.cpp b/source/backend/utils/PipeClient.cpp new file mode 100644 index 000000000..05e4c18db --- /dev/null +++ b/source/backend/utils/PipeClient.cpp @@ -0,0 +1,170 @@ +/* + * Carla Plugin Host + * Copyright (C) 2011-2018 Filipe Coelho + * + * 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 doc/GPL.txt file. + */ + +#include "CarlaUtils.h" + +#include "CarlaPipeUtils.hpp" + +namespace CB = CarlaBackend; + +// ------------------------------------------------------------------------------------------------------------------- + +class CarlaPipeClientPlugin : public CarlaPipeClient +{ +public: + CarlaPipeClientPlugin(const CarlaPipeCallbackFunc callbackFunc, void* const callbackPtr) noexcept + : CarlaPipeClient(), + fCallbackFunc(callbackFunc), + fCallbackPtr(callbackPtr), + fLastReadLine(nullptr) + { + CARLA_SAFE_ASSERT(fCallbackFunc != nullptr); + } + + ~CarlaPipeClientPlugin() override + { + if (fLastReadLine != nullptr) + { + delete[] fLastReadLine; + fLastReadLine = nullptr; + } + } + + const char* readlineblock(const uint timeout) noexcept + { + delete[] fLastReadLine; + fLastReadLine = CarlaPipeClient::_readlineblock(timeout); + return fLastReadLine; + } + + bool msgReceived(const char* const msg) noexcept override + { + if (fCallbackFunc != nullptr) + { + try { + fCallbackFunc(fCallbackPtr, msg); + } CARLA_SAFE_EXCEPTION("msgReceived"); + } + + return true; + } + +private: + const CarlaPipeCallbackFunc fCallbackFunc; + void* const fCallbackPtr; + const char* fLastReadLine; + + CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClientPlugin) +}; + +CarlaPipeClientHandle carla_pipe_client_new(const char* argv[], CarlaPipeCallbackFunc callbackFunc, void* callbackPtr) +{ + carla_debug("carla_pipe_client_new(%p, %p, %p)", argv, callbackFunc, callbackPtr); + + CarlaPipeClientPlugin* const pipe(new CarlaPipeClientPlugin(callbackFunc, callbackPtr)); + + if (! pipe->initPipeClient(argv)) + { + delete pipe; + return nullptr; + } + + return pipe; +} + +void carla_pipe_client_idle(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); + + ((CarlaPipeClientPlugin*)handle)->idlePipe(); +} + +bool carla_pipe_client_is_running(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); + + return ((CarlaPipeClientPlugin*)handle)->isPipeRunning(); +} + +void carla_pipe_client_lock(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); + + return ((CarlaPipeClientPlugin*)handle)->lockPipe(); +} + +void carla_pipe_client_unlock(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); + + return ((CarlaPipeClientPlugin*)handle)->unlockPipe(); +} + +const char* carla_pipe_client_readlineblock(CarlaPipeClientHandle handle, uint timeout) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, nullptr); + + return ((CarlaPipeClientPlugin*)handle)->readlineblock(timeout); +} + +bool carla_pipe_client_write_msg(CarlaPipeClientHandle handle, const char* msg) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); + + return ((CarlaPipeClientPlugin*)handle)->writeMessage(msg); +} + +bool carla_pipe_client_write_and_fix_msg(CarlaPipeClientHandle handle, const char* msg) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); + + return ((CarlaPipeClientPlugin*)handle)->writeAndFixMessage(msg); +} + +bool carla_pipe_client_flush(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); + + return ((CarlaPipeClientPlugin*)handle)->flushMessages(); +} + +bool carla_pipe_client_flush_and_unlock(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr, false); + + CarlaPipeClientPlugin* const pipe((CarlaPipeClientPlugin*)handle); + const bool ret(pipe->flushMessages()); + pipe->unlockPipe(); + return ret; +} + +void carla_pipe_client_destroy(CarlaPipeClientHandle handle) +{ + CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); + carla_debug("carla_pipe_client_destroy(%p)", handle); + + CarlaPipeClientPlugin* const pipe((CarlaPipeClientPlugin*)handle); + pipe->closePipeClient(); + delete pipe; +} + +// ------------------------------------------------------------------------------------------------------------------- + +#include "CarlaPipeUtils.cpp" +#include "water/misc/Time.cpp" + +// ------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/utils/System.cpp b/source/backend/utils/System.cpp new file mode 100644 index 000000000..3bd3ba5f0 --- /dev/null +++ b/source/backend/utils/System.cpp @@ -0,0 +1,41 @@ +/* + * Carla Plugin Host + * Copyright (C) 2011-2018 Filipe Coelho + * + * 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 doc/GPL.txt file. + */ + +#include "CarlaUtils.h" + +#include "CarlaThread.hpp" + +// ------------------------------------------------------------------------------------------------------------------- + +void carla_fflush(bool err) +{ + std::fflush(err ? stderr : stdout); +} + +void carla_fputs(bool err, const char* string) +{ + std::fputs(string, err ? stderr : stdout); +} + +void carla_set_process_name(const char* name) +{ + carla_debug("carla_set_process_name(\"%s\")", name); + + CarlaThread::setCurrentThreadName(name); +} + +// ------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/utils/Windows.cpp b/source/backend/utils/Windows.cpp new file mode 100644 index 000000000..e84e064ad --- /dev/null +++ b/source/backend/utils/Windows.cpp @@ -0,0 +1,108 @@ +/* + * Carla Plugin Host + * Copyright (C) 2011-2018 Filipe Coelho + * + * 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 doc/GPL.txt file. + */ + +#include "CarlaUtils.h" + +#include "CarlaUtils.hpp" + +#ifdef CARLA_OS_MAC +# import +#endif + +#ifdef HAVE_X11 +# include +#endif + +namespace CB = CarlaBackend; + +// ------------------------------------------------------------------------------------------------------------------- + +void carla_x11_reparent_window(uintptr_t winId1, uintptr_t winId2) +{ + CARLA_SAFE_ASSERT_RETURN(winId1 != 0,); + CARLA_SAFE_ASSERT_RETURN(winId2 != 0,); + +#ifdef HAVE_X11 + if (::Display* const disp = XOpenDisplay(nullptr)) + { + XReparentWindow(disp, winId1, winId2, 0, 0); + XMapWindow(disp, winId1); + XCloseDisplay(disp); + } +#endif +} + +void carla_x11_move_window(uintptr_t winId, int x, int y) +{ + CARLA_SAFE_ASSERT_RETURN(winId != 0,); + +#ifdef HAVE_X11 + if (::Display* const disp = XOpenDisplay(nullptr)) + { + XMoveWindow(disp, winId, x, y); + XCloseDisplay(disp); + } +#else + // unused + return; (void)x; (void)y; +#endif +} + +int* carla_x11_get_window_pos(uintptr_t winId) +{ + static int pos[2]; + + if (winId == 0) + { + pos[0] = 0; + pos[1] = 0; + } +#ifdef HAVE_X11 + else if (::Display* const disp = XOpenDisplay(nullptr)) + { + int x, y; + Window child; + XWindowAttributes xwa; + XTranslateCoordinates(disp, winId, XRootWindow(disp, 0), 0, 0, &x, &y, &child); + XGetWindowAttributes(disp, winId, &xwa); + XCloseDisplay(disp); + pos[0] = x - xwa.x; + pos[1] = y - xwa.y; + } +#endif + else + { + pos[0] = 0; + pos[1] = 0; + } + + return pos; +} + +int carla_cocoa_get_window(void* nsViewPtr) +{ + CARLA_SAFE_ASSERT_RETURN(nsViewPtr != nullptr, 0); + +#ifdef CARLA_OS_MAC + NSView* const nsView = (NSView*)nsViewPtr; + return [[nsView window] windowNumber]; +#else + return 0; +#endif +} + +// -------------------------------------------------------------------------------------------------------------------