Browse Source

Split CarlaUtils.cpp into smaller files

tags/v1.9.11
falkTX 7 years ago
parent
commit
e7f61c6ffe
7 changed files with 582 additions and 454 deletions
  1. +3
    -31
      source/backend/Makefile
  2. +2
    -423
      source/backend/utils/CachedPlugins.cpp
  3. +186
    -0
      source/backend/utils/Information.cpp
  4. +72
    -0
      source/backend/utils/Makefile
  5. +170
    -0
      source/backend/utils/PipeClient.cpp
  6. +41
    -0
      source/backend/utils/System.cpp
  7. +108
    -0
      source/backend/utils/Windows.cpp

+ 3
- 31
source/backend/Makefile View File

@@ -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)

# ----------------------------------------------------------------------------------------------------------------------------

source/backend/CarlaUtils.cpp → source/backend/utils/CachedPlugins.cpp View File

@@ -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 <Cocoa/Cocoa.h>
#endif

#ifndef CARLA_UTILS_CACHED_PLUGINS_ONLY
# include "rtaudio/RtAudio.h"
# include "rtmidi/RtMidi.h"
# ifdef HAVE_X11
# include <X11/Xlib.h>
# 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 =
"<p>This current Carla build is using the following features and 3rd-party code:</p>"
"<ul>"

// Plugin formats
"<li>LADSPA plugin support</li>"
"<li>DSSI plugin support</li>"
"<li>LV2 plugin support</li>"
"<li>VST2 plugin support using VeSTige header by Javier Serrano Polo</li>"

// Sample kit libraries
#ifdef HAVE_FLUIDSYNTH
"<li>FluidSynth library for SF2/3 support</li>"
#endif
"<li>SFZero module for SFZ support</li>"

// misc libs
"<li>base64 utilities based on code by Ren\u00E9 Nyffenegger</li>"
"<li>liblo library for OSC support</li>"
"<li>rtmempool library by Nedko Arnaudov"
"<li>serd, sord, sratom and lilv libraries for LV2 discovery</li>"
"<li>RtAudio v" RTAUDIO_VERSION " and RtMidi v" RTMIDI_VERSION " for native Audio and MIDI support</li>"

// Internal plugins
"<li>MIDI Sequencer UI code by Perry Nguyen</li>"

// External plugins
#ifdef HAVE_EXTERNAL_PLUGINS
"<li>Nekobi plugin code based on nekobee by Sean Bolton and others</li>"
"<li>VectorJuice and WobbleJuice plugin code by Andre Sklenar</li>"
# ifdef HAVE_ZYN_DEPS
"<li>ZynAddSubFX plugin code by Mark McCurry and Nasca Octavian Paul</li>"
# endif
#endif // HAVE_EXTERNAL_PLUGINS

// end
"</ul>";
}

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

+ 186
- 0
source/backend/utils/Information.cpp View File

@@ -0,0 +1,186 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2018 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 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 =
"<p>This current Carla build is using the following features and 3rd-party code:</p>"
"<ul>"

// Plugin formats
"<li>LADSPA plugin support</li>"
"<li>DSSI plugin support</li>"
"<li>LV2 plugin support</li>"
"<li>VST2 plugin support using VeSTige header by Javier Serrano Polo</li>"

// Sample kit libraries
#ifdef HAVE_FLUIDSYNTH
"<li>FluidSynth library for SF2/3 support</li>"
#endif
"<li>SFZero module for SFZ support</li>"

// misc libs
"<li>base64 utilities based on code by Ren\u00E9 Nyffenegger</li>"
"<li>liblo library for OSC support</li>"
"<li>rtmempool library by Nedko Arnaudov"
"<li>serd, sord, sratom and lilv libraries for LV2 discovery</li>"
"<li>RtAudio v" RTAUDIO_VERSION " and RtMidi v" RTMIDI_VERSION " for native Audio and MIDI support</li>"

// Internal plugins
"<li>MIDI Sequencer UI code by Perry Nguyen</li>"

// External plugins
#ifdef HAVE_EXTERNAL_PLUGINS
"<li>Nekobi plugin code based on nekobee by Sean Bolton and others</li>"
"<li>VectorJuice and WobbleJuice plugin code by Andre Sklenar</li>"
# ifdef HAVE_ZYN_DEPS
"<li>ZynAddSubFX plugin code by Mark McCurry and Nasca Octavian Paul</li>"
# endif
#endif // HAVE_EXTERNAL_PLUGINS

// end
"</ul>";
}

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;
}

// -------------------------------------------------------------------------------------------------------------------

+ 72
- 0
source/backend/utils/Makefile View File

@@ -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)

# ----------------------------------------------------------------------------------------------------------------------------

+ 170
- 0
source/backend/utils/PipeClient.cpp View File

@@ -0,0 +1,170 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2018 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 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"

// -------------------------------------------------------------------------------------------------------------------

+ 41
- 0
source/backend/utils/System.cpp View File

@@ -0,0 +1,41 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2018 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 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);
}

// -------------------------------------------------------------------------------------------------------------------

+ 108
- 0
source/backend/utils/Windows.cpp View File

@@ -0,0 +1,108 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2018 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 doc/GPL.txt file.
*/

#include "CarlaUtils.h"

#include "CarlaUtils.hpp"

#ifdef CARLA_OS_MAC
# import <Cocoa/Cocoa.h>
#endif

#ifdef HAVE_X11
# include <X11/Xlib.h>
#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
}

// -------------------------------------------------------------------------------------------------------------------

Loading…
Cancel
Save