Browse Source

More work

tags/1.9.4
falkTX 11 years ago
parent
commit
cae85ad282
19 changed files with 334 additions and 299 deletions
  1. +2
    -1
      source/backend/carla_backend.hpp
  2. +8
    -6
      source/backend/carla_engine.hpp
  3. +0
    -1
      source/backend/carla_native.h
  4. +29
    -29
      source/backend/carla_native.hpp
  5. +6
    -6
      source/backend/carla_plugin.hpp
  6. +5
    -5
      source/backend/engine/carla_engine.cpp
  7. +5
    -6
      source/backend/engine/carla_engine_internal.hpp
  8. +132
    -123
      source/backend/engine/carla_engine_osc.cpp
  9. +24
    -23
      source/backend/engine/carla_engine_osc.hpp
  10. +17
    -19
      source/backend/engine/carla_engine_thread.cpp
  11. +1
    -1
      source/backend/engine/carla_engine_thread.hpp
  12. +44
    -46
      source/backend/plugin/carla_plugin.cpp
  13. +12
    -4
      source/backend/plugin/carla_plugin_internal.hpp
  14. +24
    -17
      source/bridges/qtcreator/carla-bridge-plugin.pro
  15. +1
    -1
      source/carla_shared.py
  16. +5
    -5
      source/includes/ladspa_rdf.hpp
  17. +5
    -5
      source/includes/lv2_rdf.hpp
  18. +2
    -0
      source/utils/carla_backend_utils.hpp
  19. +12
    -1
      source/utils/rt_list.hpp

+ 2
- 1
source/backend/carla_backend.hpp View File

@@ -529,7 +529,8 @@ enum ProcessMode {
PROCESS_MODE_SINGLE_CLIENT = 0, //!< Single client mode (dynamic input/outputs as needed by plugins) PROCESS_MODE_SINGLE_CLIENT = 0, //!< Single client mode (dynamic input/outputs as needed by plugins)
PROCESS_MODE_MULTIPLE_CLIENTS = 1, //!< Multiple client mode (1 master client + 1 client per plugin) PROCESS_MODE_MULTIPLE_CLIENTS = 1, //!< Multiple client mode (1 master client + 1 client per plugin)
PROCESS_MODE_CONTINUOUS_RACK = 2, //!< Single client, 'rack' mode. Processes plugins in order of id, with forced stereo. PROCESS_MODE_CONTINUOUS_RACK = 2, //!< Single client, 'rack' mode. Processes plugins in order of id, with forced stereo.
PROCESS_MODE_PATCHBAY = 3 //!< Single client, 'patchbay' mode.
PROCESS_MODE_PATCHBAY = 3, //!< Single client, 'patchbay' mode.
PROCESS_MODE_BRIDGE = 4 //!< Special mode, used in plugin-bridges only. RT buffers come from shared memory in a separate host app.
}; };


/*! /*!


+ 8
- 6
source/backend/carla_engine.hpp View File

@@ -577,7 +577,7 @@ public:
static CarlaEngine* newDriverByName(const char* const driverName); static CarlaEngine* newDriverByName(const char* const driverName);


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Maximum values
// Constant values


/*! /*!
* Maximum client name size. * Maximum client name size.
@@ -592,13 +592,13 @@ public:
/*! /*!
* Current number of plugins loaded. * Current number of plugins loaded.
*/ */
unsigned int currentPluginCount() const;
int currentPluginCount() const;


/*! /*!
* Maximum number of loadable plugins allowed. * Maximum number of loadable plugins allowed.
* \note This function returns 0 if engine is not started. * \note This function returns 0 if engine is not started.
*/ */
unsigned int maxPluginNumber() const;
int maxPluginNumber() const;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Virtual, per-engine type calls // Virtual, per-engine type calls
@@ -679,7 +679,7 @@ public:
/*! /*!
* Remove plugin with id \a id. * Remove plugin with id \a id.
*/ */
bool removePlugin(const unsigned int id);
bool removePlugin(const int id);


/*! /*!
* Remove all plugins. * Remove all plugins.
@@ -838,9 +838,10 @@ public:
// ------------------------------------- // -------------------------------------


protected: protected:
uint32_t fBufferSize;
double fSampleRate;

CarlaString fName; CarlaString fName;
uint32_t fBufferSize;
double fSampleRate;


EngineOptions fOptions; EngineOptions fOptions;
EngineTimeInfo fTimeInfo; EngineTimeInfo fTimeInfo;
@@ -953,6 +954,7 @@ public:
void osc_send_control_exit(); void osc_send_control_exit();
#endif #endif


private:
friend class CarlaEngineEventPort; friend class CarlaEngineEventPort;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngine) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngine)


+ 0
- 1
source/backend/carla_native.h View File

@@ -19,7 +19,6 @@
#define __CARLA_NATIVE_H__ #define __CARLA_NATIVE_H__


#ifdef __cplusplus #ifdef __cplusplus
# include <cstddef>
# include <cstdint> # include <cstdint>
extern "C" { extern "C" {
#else #else


+ 29
- 29
source/backend/carla_native.hpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla Native Plugin API
* Carla Native Plugin API (C++)
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@@ -30,9 +30,9 @@ class PluginDescriptorClass
{ {
public: public:
PluginDescriptorClass(const HostDescriptor* const host) PluginDescriptorClass(const HostDescriptor* const host)
: fHost(host)
: kHost(host)
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(host);
} }


virtual ~PluginDescriptorClass() virtual ~PluginDescriptorClass()
@@ -44,77 +44,77 @@ public:


const HostDescriptor* getHostHandle() const const HostDescriptor* getHostHandle() const
{ {
return fHost;
return kHost;
} }


uint32_t getBufferSize() const uint32_t getBufferSize() const
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
return fHost->get_buffer_size(fHost->handle);
if (kHost)
return kHost->get_buffer_size(kHost->handle);


return 0; return 0;
} }


double getSampleRate() const double getSampleRate() const
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
return fHost->get_sample_rate(fHost->handle);
if (kHost)
return kHost->get_sample_rate(kHost->handle);


return 0.0; return 0.0;
} }


const TimeInfo* getTimeInfo() const const TimeInfo* getTimeInfo() const
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
return fHost->get_time_info(fHost->handle);
if (kHost)
return kHost->get_time_info(kHost->handle);


return nullptr; return nullptr;
} }


void writeMidiEvent(const MidiEvent* const event) void writeMidiEvent(const MidiEvent* const event)
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
fHost->write_midi_event(fHost->handle, event);
if (kHost)
kHost->write_midi_event(kHost->handle, event);
} }


void uiParameterChanged(const uint32_t index, const float value) void uiParameterChanged(const uint32_t index, const float value)
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
fHost->ui_parameter_changed(fHost->handle, index, value);
if (kHost)
kHost->ui_parameter_changed(kHost->handle, index, value);
} }


void uiMidiProgramChanged(const uint32_t bank, const uint32_t program) void uiMidiProgramChanged(const uint32_t bank, const uint32_t program)
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
fHost->ui_midi_program_changed(fHost->handle, bank, program);
if (kHost)
kHost->ui_midi_program_changed(kHost->handle, bank, program);
} }


void uiCustomDataChanged(const char* const key, const char* const value) void uiCustomDataChanged(const char* const key, const char* const value)
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
fHost->ui_custom_data_changed(fHost->handle, key, value);
if (kHost)
kHost->ui_custom_data_changed(kHost->handle, key, value);
} }


void uiClosed() void uiClosed()
{ {
CARLA_ASSERT(fHost);
CARLA_ASSERT(kHost);


if (fHost)
fHost->ui_closed(fHost->handle);
if (kHost)
kHost->ui_closed(kHost->handle);
} }


protected: protected:
@@ -271,7 +271,7 @@ protected:
// ------------------------------------------------------------------- // -------------------------------------------------------------------


private: private:
const HostDescriptor* const fHost;
const HostDescriptor* const kHost;


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




+ 6
- 6
source/backend/carla_plugin.hpp View File

@@ -94,7 +94,7 @@ public:
* \param engine The engine which this plugin belongs to, must not be null * \param engine The engine which this plugin belongs to, must not be null
* \param id The 'id' of this plugin, must be between 0 and CarlaEngine::maxPluginNumber() * \param id The 'id' of this plugin, must be between 0 and CarlaEngine::maxPluginNumber()
*/ */
CarlaPlugin(CarlaEngine* const engine, const unsigned int id);
CarlaPlugin(CarlaEngine* const engine, const int id);


/*! /*!
* This is the destructor of the base plugin class. * This is the destructor of the base plugin class.
@@ -657,13 +657,13 @@ public:
* Post pone an event of type \a type.\n * Post pone an event of type \a type.\n
* The event will be processed later, but as soon as possible. * The event will be processed later, but as soon as possible.
*/ */
void postponeEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const double value3);
void postponeRtEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const double value3);


/*! /*!
* Process all the post-poned events. * Process all the post-poned events.
* This function must be called from the main thread (ie, idleGui()) if PLUGIN_USES_SINGLE_THREAD is set. * This function must be called from the main thread (ie, idleGui()) if PLUGIN_USES_SINGLE_THREAD is set.
*/ */
void postEventsRun();
void postRtEventsRun();


/*! /*!
* Tell the UI a parameter has changed. * Tell the UI a parameter has changed.
@@ -746,13 +746,13 @@ public:
static const PluginDescriptor* getNativePluginDescriptor(const size_t index); static const PluginDescriptor* getNativePluginDescriptor(const size_t index);


static CarlaPlugin* newNative(const Initializer& init); static CarlaPlugin* newNative(const Initializer& init);
static CarlaPlugin* newBridge(const Initializer& init, const BinaryType btype, const PluginType ptype, const void* const extra);
static CarlaPlugin* newBridge(const Initializer& init, const BinaryType btype, const PluginType ptype, const char* const bridgeFilename);
#endif #endif
#ifdef WANT_LADSPA #ifdef WANT_LADSPA
static CarlaPlugin* newLADSPA(const Initializer& init, const void* const extra);
static CarlaPlugin* newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* const rdfDescriptor);
#endif #endif
#ifdef WANT_DSSI #ifdef WANT_DSSI
static CarlaPlugin* newDSSI(const Initializer& init, const void* const extra);
static CarlaPlugin* newDSSI(const Initializer& init, const char* const guiFilename);
#endif #endif
#ifdef WANT_LV2 #ifdef WANT_LV2
static CarlaPlugin* newLV2(const Initializer& init); static CarlaPlugin* newLV2(const Initializer& init);


+ 5
- 5
source/backend/engine/carla_engine.cpp View File

@@ -452,12 +452,12 @@ unsigned int CarlaEngine::maxPortNameSize() const
return STR_MAX; return STR_MAX;
} }


unsigned int CarlaEngine::currentPluginCount() const
int CarlaEngine::currentPluginCount() const
{ {
return fData->curPluginCount; return fData->curPluginCount;
} }


unsigned int CarlaEngine::maxPluginNumber() const
int CarlaEngine::maxPluginNumber() const
{ {
return fData->maxPluginNumber; return fData->maxPluginNumber;
} }
@@ -769,16 +769,16 @@ int CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const
if (! plugin) if (! plugin)
return -1; return -1;


const unsigned int id = fData->curPluginCount++;
const int id = fData->curPluginCount++;


#if 0 #if 0
plugin->setId(id); plugin->setId(id);
#endif #endif


return static_cast<int>(id);
return id;
} }


bool CarlaEngine::removePlugin(const unsigned int id)
bool CarlaEngine::removePlugin(const int id)
{ {
qDebug("CarlaEngine::removePlugin(%i)", id); qDebug("CarlaEngine::removePlugin(%i)", id);
CARLA_ASSERT(fData->curPluginCount > 0); CARLA_ASSERT(fData->curPluginCount > 0);


+ 5
- 6
source/backend/engine/carla_engine_internal.hpp View File

@@ -24,8 +24,6 @@


#include "carla_plugin.hpp" #include "carla_plugin.hpp"


//#include "rt_list.hpp"

#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
# include <QtCore/QProcessEnvironment> # include <QtCore/QProcessEnvironment>
#endif #endif
@@ -99,7 +97,8 @@ const char* EngineControlEventType2Str(const EngineControlEventType type)
* Maximum number of peaks per plugin.\n * Maximum number of peaks per plugin.\n
* \note There are both input and output peaks. * \note There are both input and output peaks.
*/ */
/*static*/ const unsigned short MAX_PEAKS = 2;
/*static*/
const unsigned short MAX_PEAKS = 2;


const uint32_t PATCHBAY_BUFFER_SIZE = 128; const uint32_t PATCHBAY_BUFFER_SIZE = 128;
const unsigned short PATCHBAY_EVENT_COUNT = 512; const unsigned short PATCHBAY_EVENT_COUNT = 512;
@@ -151,9 +150,9 @@ struct CarlaEngineProtectedData {
QProcessEnvironment procEnv; QProcessEnvironment procEnv;
#endif #endif


bool aboutToClose; // don't re-activate thread if true
unsigned int curPluginCount; // number of plugins loaded (0...max)
unsigned int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 999)
bool aboutToClose; // don't re-activate thread if true
int curPluginCount; // number of plugins loaded (0...max)
int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 999)


EnginePluginData* plugins; EnginePluginData* plugins;




+ 132
- 123
source/backend/engine/carla_engine_osc.cpp View File

@@ -1,18 +1,18 @@
/* /*
* Carla Engine OSC * Carla Engine OSC
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
* 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, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* For a full copy of the GNU General Public License see the COPYING file
* For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#include "carla_engine.hpp" #include "carla_engine.hpp"
@@ -20,31 +20,27 @@
#include "carla_plugin.hpp" #include "carla_plugin.hpp"
#include "carla_midi.h" #include "carla_midi.h"


#include <QtCore/QString>

CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


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


CarlaEngineOsc::CarlaEngineOsc(CarlaEngine* const engine_)
: engine(engine_)
CarlaEngineOsc::CarlaEngineOsc(CarlaEngine* const engine)
: kEngine(engine),
fServerTCP(nullptr),
fServerUDP(nullptr)
{ {
qDebug("CarlaEngineOsc::CarlaEngineOsc(%p)", engine); qDebug("CarlaEngineOsc::CarlaEngineOsc(%p)", engine);
CARLA_ASSERT(engine);

m_name = nullptr;
m_nameSize = 0;

m_serverTCP = nullptr;
m_serverUDP = nullptr;
CARLA_ASSERT(engine != nullptr);
} }


CarlaEngineOsc::~CarlaEngineOsc() CarlaEngineOsc::~CarlaEngineOsc()
{ {
qDebug("CarlaEngineOsc::~CarlaEngineOsc()"); qDebug("CarlaEngineOsc::~CarlaEngineOsc()");
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_serverTCP);
CARLA_ASSERT(! m_serverUDP);
CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPathTCP.isEmpty());
CARLA_ASSERT(fServerPathUDP.isEmpty());
CARLA_ASSERT(fServerTCP == nullptr);
CARLA_ASSERT(fServerUDP == nullptr);
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -52,117 +48,115 @@ CarlaEngineOsc::~CarlaEngineOsc()
void CarlaEngineOsc::init(const char* const name) void CarlaEngineOsc::init(const char* const name)
{ {
qDebug("CarlaEngineOsc::init(\"%s\")", name); qDebug("CarlaEngineOsc::init(\"%s\")", name);
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_serverTCP);
CARLA_ASSERT(! m_serverUDP);
CARLA_ASSERT(m_nameSize == 0);
CARLA_ASSERT(m_serverPathTCP.isEmpty());
CARLA_ASSERT(m_serverPathUDP.isEmpty());
CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPathTCP.isEmpty());
CARLA_ASSERT(fServerPathUDP.isEmpty());
CARLA_ASSERT(fServerTCP == nullptr);
CARLA_ASSERT(fServerUDP == nullptr);
CARLA_ASSERT(name); CARLA_ASSERT(name);


m_name = strdup(name ? name : "");
m_nameSize = strlen(m_name);
fName = name;
fName.toBasic();


m_serverTCP = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handlerTCP);
m_serverUDP = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handlerUDP);
fServerTCP = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler_TCP);


if (m_serverTCP)
if (fServerTCP != nullptr)
{ {
if (char* const serverPathTCP = lo_server_get_url(m_serverTCP))
if (char* const tmpServerPathTCP = lo_server_get_url(fServerTCP))
{ {
m_serverPathTCP = serverPathTCP;
m_serverPathTCP += m_name;
free(serverPathTCP);
fServerPathTCP = tmpServerPathTCP;
fServerPathTCP += fName;
free(tmpServerPathTCP);
} }


lo_server_add_method(m_serverTCP, nullptr, nullptr, osc_message_handler, this);
lo_server_add_method(fServerTCP, nullptr, nullptr, osc_message_handler, this);
} }


if (m_serverUDP)
fServerUDP = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handler_UDP);

if (fServerUDP != nullptr)
{ {
if (char* const serverPathUDP = lo_server_get_url(m_serverUDP))
if (char* const tmpServerPathUDP = lo_server_get_url(fServerUDP))
{ {
m_serverPathUDP = serverPathUDP;
m_serverPathUDP += m_name;
free(serverPathUDP);
fServerPathUDP = tmpServerPathUDP;
fServerPathUDP += fName;
free(tmpServerPathUDP);
} }


lo_server_add_method(m_serverUDP, nullptr, nullptr, osc_message_handler, this);
lo_server_add_method(fServerUDP, nullptr, nullptr, osc_message_handler, this);
} }
} }


void CarlaEngineOsc::idle() void CarlaEngineOsc::idle()
{ {
if (m_serverTCP)
if (fServerTCP != nullptr)
{ {
while (lo_server_recv_noblock(m_serverTCP, 0) != 0) {}
while (lo_server_recv_noblock(fServerTCP, 0) != 0) {}
} }


if (m_serverUDP)
if (fServerUDP != nullptr)
{ {
while (lo_server_recv_noblock(m_serverUDP, 0) != 0) {}
while (lo_server_recv_noblock(fServerUDP, 0) != 0) {}
} }
} }


void CarlaEngineOsc::close() void CarlaEngineOsc::close()
{ {
qDebug("CarlaEngineOsc::close()"); qDebug("CarlaEngineOsc::close()");
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_serverTCP);
CARLA_ASSERT(m_serverUDP);
CARLA_ASSERT(m_serverPathTCP.isNotEmpty());
CARLA_ASSERT(m_serverPathUDP.isNotEmpty());
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPathTCP.isNotEmpty());
CARLA_ASSERT(fServerPathUDP.isNotEmpty());
CARLA_ASSERT(fServerTCP != nullptr);
CARLA_ASSERT(fServerUDP != nullptr);


m_nameSize = 0;
fName.clear();


if (m_name)
if (fServerTCP != nullptr)
{ {
free(m_name);
m_name = nullptr;
lo_server_del_method(fServerTCP, nullptr, nullptr);
lo_server_free(fServerTCP);
fServerTCP = nullptr;
} }


if (m_serverTCP)
if (fServerUDP != nullptr)
{ {
lo_server_del_method(m_serverTCP, nullptr, nullptr);
lo_server_free(m_serverTCP);
m_serverTCP = nullptr;
lo_server_del_method(fServerUDP, nullptr, nullptr);
lo_server_free(fServerUDP);
fServerUDP = nullptr;
} }


if (m_serverUDP)
{
lo_server_del_method(m_serverUDP, nullptr, nullptr);
lo_server_free(m_serverUDP);
m_serverUDP = nullptr;
}

m_serverPathTCP.clear();
m_serverPathUDP.clear();
fServerPathTCP.clear();
fServerPathUDP.clear();


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
m_controlData.free();
fControlData.free();
#endif #endif
} }


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


bool isDigit(const char c)
{
return (c >= '0' && c <= '9');
}

int CarlaEngineOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) int CarlaEngineOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg)
{ {
#if DEBUG #if DEBUG
if (! QString(path).endsWith("peak"))
qDebug("CarlaEngineOsc::handleMessage(%s, %i, %p, %s, %p)", path, argc, argv, types, msg);
qDebug("CarlaEngineOsc::handleMessage(%s, %i, %p, %s, %p)", path, argc, argv, types, msg);
#endif #endif
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_serverTCP || m_serverUDP);
CARLA_ASSERT(m_serverPathTCP.isNotEmpty() || m_serverPathUDP.isNotEmpty());
CARLA_ASSERT(path);
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPathTCP.isNotEmpty() || fServerPathUDP.isNotEmpty());
CARLA_ASSERT(fServerTCP != nullptr || fServerUDP != nullptr);
CARLA_ASSERT(path != nullptr);


if (! path)
if (path == nullptr)
{ {
qCritical("CarlaEngineOsc::handleMessage() - got invalid path"); qCritical("CarlaEngineOsc::handleMessage() - got invalid path");
return 1; return 1;
} }


if (! m_name)
if (fName.isEmpty())
{ {
qCritical("CarlaEngineOsc::handleMessage(\"%s\", ...) - received message but client is offline", path); qCritical("CarlaEngineOsc::handleMessage(\"%s\", ...) - received message but client is offline", path);
return 1; return 1;
@@ -181,43 +175,69 @@ int CarlaEngineOsc::handleMessage(const char* const path, const int argc, const
} }
#endif #endif


const size_t nameSize = fName.length();

// Check if message is for this client // Check if message is for this client
if (strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0)
if (std::strlen(path) <= nameSize || std::strncmp(path+1, (const char*)fName, nameSize) != 0)
{ {
qWarning("CarlaEngineOsc::handleMessage() - message not for this client -> '%s' != '/%s/'", path, m_name);
qWarning("CarlaEngineOsc::handleMessage() - message not for this client -> '%s' != '/%s/'", path, (const char*)fName);
return 1; return 1;
} }


// Get plugin id from message // Get plugin id from message
int pluginId = 0;
// eg, /carla/23/method


if (std::isdigit(path[m_nameSize+2]))
pluginId += path[m_nameSize+2]-'0';
int pluginId = -1;


if (std::isdigit(path[m_nameSize+3]))
pluginId += (path[m_nameSize+3]-'0')*10;
if (isDigit(path[nameSize+2]))
{
if (isDigit(path[nameSize+3]))
{
if (isDigit(path[nameSize+5]))
{
qCritical("CarlaEngineOsc::handleMessage() - invalid plugin id, over 999? (value: \"%s\")", path+nameSize);
return 1;
}
else if (isDigit(path[nameSize+4]))
{
// 3 digits, /xyz/method
pluginId += (path[nameSize+2]-'0')*100;
pluginId += (path[nameSize+3]-'0')*10;
pluginId += (path[nameSize+4]-'0');
}
else
{
// 2 digits, /xy/method
pluginId += (path[nameSize+2]-'0')*10;
pluginId += (path[nameSize+3]-'0');
}
}
else
{
// single digit, /x/method
pluginId += path[nameSize+2]-'0';
}
}


if (pluginId < 0 || pluginId > static_cast<int>(engine->currentPluginCount()))
if (pluginId < 0 || pluginId > kEngine->currentPluginCount())
{ {
qCritical("CarlaEngineOsc::handleMessage() - failed to get plugin, wrong id '%i'", pluginId); qCritical("CarlaEngineOsc::handleMessage() - failed to get plugin, wrong id '%i'", pluginId);
return 1; return 1;
} }


// Get plugin // Get plugin
CarlaPlugin* const plugin = engine->getPluginUnchecked(pluginId);
CarlaPlugin* const plugin = kEngine->getPluginUnchecked(pluginId);


#if 0
if (plugin == nullptr || plugin->id() != pluginId) if (plugin == nullptr || plugin->id() != pluginId)
{ {
qWarning("CarlaEngineOsc::handleMessage() - invalid plugin id '%i', probably has been removed", pluginId); qWarning("CarlaEngineOsc::handleMessage() - invalid plugin id '%i', probably has been removed", pluginId);
return 1; return 1;
} }
#endif


// Get method from path, "/Carla/i/method"
// Get method from path, "/Carla/i/method" -> "method"
const int offset = (pluginId >= 10) ? 5 : 4; const int offset = (pluginId >= 10) ? 5 : 4;
char method[32] = { 0 }; char method[32] = { 0 };
strncpy(method, path + (m_nameSize + offset), 31);
strncpy(method, path + (nameSize + offset), 31);


if (method[0] == '\0') if (method[0] == '\0')
{ {
@@ -269,7 +289,7 @@ int CarlaEngineOsc::handleMessage(const char* const path, const int argc, const
if (strcmp(method, "note_off") == 0) if (strcmp(method, "note_off") == 0)
return handleMsgNoteOff(plugin, argc, argv, types); return handleMsgNoteOff(plugin, argc, argv, types);


#if 0
#if 0 // FIXME
// Plugin Bridges // Plugin Bridges
if ((plugin->hints() & PLUGIN_IS_BRIDGE) > 0 && strlen(method) > 11 && strncmp(method, "bridge_", 7) == 0) if ((plugin->hints() & PLUGIN_IS_BRIDGE) > 0 && strlen(method) > 11 && strncmp(method, "bridge_", 7) == 0)
{ {
@@ -321,14 +341,12 @@ int CarlaEngineOsc::handleMessage(const char* const path, const int argc, const
#endif #endif
#endif #endif


#if 0
// Plugin-specific methods
#ifdef WANT_LV2
// Plugin-specific methods, FIXME
#if 0 //def WANT_LV2
if (strcmp(method, "lv2_atom_transfer") == 0) if (strcmp(method, "lv2_atom_transfer") == 0)
return handleMsgLv2AtomTransfer(plugin, argc, argv, types); return handleMsgLv2AtomTransfer(plugin, argc, argv, types);
if (strcmp(method, "lv2_event_transfer") == 0) if (strcmp(method, "lv2_event_transfer") == 0)
return handleMsgLv2EventTransfer(plugin, argc, argv, types); return handleMsgLv2EventTransfer(plugin, argc, argv, types);
#endif
#endif #endif


qWarning("CarlaEngineOsc::handleMessage() - unsupported OSC method '%s'", method); qWarning("CarlaEngineOsc::handleMessage() - unsupported OSC method '%s'", method);
@@ -402,10 +420,9 @@ int CarlaEngineOsc::handleMsgUpdate(CARLA_ENGINE_OSC_HANDLE_ARGS2, const lo_addr
qDebug("CarlaEngineOsc::handleMsgUpdate()"); qDebug("CarlaEngineOsc::handleMsgUpdate()");
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "s"); CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "s");


#if 0
const char* const url = (const char*)&argv[0]->s; const char* const url = (const char*)&argv[0]->s;

plugin->updateOscData(source, url); plugin->updateOscData(source, url);
#endif


return 0; return 0;
} }
@@ -418,13 +435,8 @@ int CarlaEngineOsc::handleMsgConfigure(CARLA_ENGINE_OSC_HANDLE_ARGS2)
const char* const key = (const char*)&argv[0]->s; const char* const key = (const char*)&argv[0]->s;
const char* const value = (const char*)&argv[1]->s; const char* const value = (const char*)&argv[1]->s;


#ifdef DEBUG
qDebug("CarlaEngineOsc::handleMsgConfigure(\"%s\", \"%s\")", key, value);
#endif

#if 0
plugin->setCustomData(CUSTOM_DATA_STRING, key, value, false);
#endif
// FIXME
plugin->setCustomData("CUSTOM_DATA_STRING", key, value, false);


return 0; return 0;
} }
@@ -434,11 +446,10 @@ int CarlaEngineOsc::handleMsgControl(CARLA_ENGINE_OSC_HANDLE_ARGS2)
qDebug("CarlaEngineOsc::handleMsgControl()"); qDebug("CarlaEngineOsc::handleMsgControl()");
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "if"); CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "if");


#if 0
const int rindex = argv[0]->i;
const float value = argv[1]->f;
const int32_t rindex = argv[0]->i;
const float value = argv[1]->f;
plugin->setParameterValueByRIndex(rindex, value, false, true, true); plugin->setParameterValueByRIndex(rindex, value, false, true, true);
#endif


return 0; return 0;
} }
@@ -447,14 +458,14 @@ int CarlaEngineOsc::handleMsgProgram(CARLA_ENGINE_OSC_HANDLE_ARGS2)
{ {
qDebug("CarlaEngineOsc::handleMsgProgram()"); qDebug("CarlaEngineOsc::handleMsgProgram()");


#if 0
if (argc == 2) if (argc == 2)
{ {
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "ii"); CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "ii");


const uint32_t bank_id = argv[0]->i;
const uint32_t program_id = argv[1]->i;
plugin->setMidiProgramById(bank_id, program_id, false, true, true, true);
const uint32_t bank = argv[0]->i;
const uint32_t program = argv[1]->i;

plugin->setMidiProgramById(bank, program, false, true, true, true);


return 0; return 0;
} }
@@ -462,17 +473,16 @@ int CarlaEngineOsc::handleMsgProgram(CARLA_ENGINE_OSC_HANDLE_ARGS2)
{ {
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "i"); CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "i");


const uint32_t program_id = argv[0]->i;
const uint32_t program = argv[0]->i;


if (program_id < plugin->programCount())
if (program < plugin->programCount())
{ {
plugin->setProgram(program_id, false, true, true, true);
plugin->setProgram(program, false, true, true, true);
return 0; return 0;
} }


qCritical("CarlaEngineOsc::handleMsgProgram() - program_id '%i' out of bounds", program_id);
qCritical("CarlaEngineOsc::handleMsgProgram() - program_id '%i' out of bounds", program);
} }
#endif


return 1; return 1;
} }
@@ -482,9 +492,9 @@ int CarlaEngineOsc::handleMsgMidi(CARLA_ENGINE_OSC_HANDLE_ARGS2)
qDebug("CarlaEngineOsc::handleMsgMidi()"); qDebug("CarlaEngineOsc::handleMsgMidi()");
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "m"); CARLA_ENGINE_OSC_CHECK_OSC_TYPES(1, "m");


#if 0
if (plugin->midiInCount() > 0) if (plugin->midiInCount() > 0)
{ {
#if 0
const uint8_t* const data = argv[0]->m; const uint8_t* const data = argv[0]->m;
uint8_t status = data[1]; uint8_t status = data[1];
uint8_t channel = status & 0x0F; uint8_t channel = status & 0x0F;
@@ -504,10 +514,10 @@ int CarlaEngineOsc::handleMsgMidi(CARLA_ENGINE_OSC_HANDLE_ARGS2)
uint8_t velo = data[3]; uint8_t velo = data[3];
plugin->sendMidiSingleNote(channel, note, velo, false, true, true); plugin->sendMidiSingleNote(channel, note, velo, false, true, true);
} }
#endif


return 0; return 0;
} }
#endif


qWarning("CarlaEngineOsc::handleMsgMidi() - recived midi when plugin has no midi inputs"); qWarning("CarlaEngineOsc::handleMsgMidi() - recived midi when plugin has no midi inputs");
return 1; return 1;
@@ -517,11 +527,10 @@ int CarlaEngineOsc::handleMsgExiting(CARLA_ENGINE_OSC_HANDLE_ARGS1)
{ {
qDebug("CarlaEngineOsc::handleMsgExiting()"); qDebug("CarlaEngineOsc::handleMsgExiting()");


#if 0
// TODO - check for non-UIs (dssi-vst) and set to -1 instead // TODO - check for non-UIs (dssi-vst) and set to -1 instead
engine->callback(CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0, nullptr);
kEngine->callback(CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0, nullptr);

plugin->freeOscData(); plugin->freeOscData();
#endif


return 0; return 0;
} }


+ 24
- 23
source/backend/engine/carla_engine_osc.hpp View File

@@ -66,43 +66,44 @@ public:


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


#ifndef BUILD_BRIDGE
bool isControlRegistered() const
const char* getServerPathTCP() const
{ {
return bool(m_controlData.target);
return (const char*)fServerPathTCP;
} }


const CarlaOscData* getControlData() const
const char* getServerPathUDP() const
{ {
return &m_controlData;
return (const char*)fServerPathUDP;
} }
#endif


const char* getServerPathTCP() const
// -------------------------------------------------------------------

#ifndef BUILD_BRIDGE
bool isControlRegistered() const
{ {
return (const char*)m_serverPathTCP;
return bool(fControlData.target);
} }


const char* getServerPathUDP() const
const CarlaOscData* getControlData() const
{ {
return (const char*)m_serverPathUDP;
return &fControlData;
} }
#endif


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


private: private:
CarlaEngine* const engine;
CarlaEngine* const kEngine;


char* m_name;
size_t m_nameSize;
CarlaString fName;


lo_server m_serverTCP;
lo_server m_serverUDP;
CarlaString m_serverPathTCP;
CarlaString m_serverPathUDP;
CarlaString fServerPathTCP;
CarlaString fServerPathUDP;
lo_server fServerTCP;
lo_server fServerUDP;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
CarlaOscData m_controlData; // for carla-control
CarlaOscData fControlData; // for carla-control
#endif #endif


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -146,17 +147,17 @@ private:


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


static void osc_error_handlerTCP(const int num, const char* const msg, const char* const path)
static void osc_error_handler_TCP(int num, const char* msg, const char* path)
{ {
qWarning("CarlaEngineOsc::osc_error_handlerTCP(%i, \"%s\", \"%s\")", num, msg, path);
qWarning("CarlaEngineOsc::osc_error_handler_TCP(%i, \"%s\", \"%s\")", num, msg, path);
} }


static void osc_error_handlerUDP(const int num, const char* const msg, const char* const path)
static void osc_error_handler_UDP(int num, const char* msg, const char* path)
{ {
qWarning("CarlaEngineOsc::osc_error_handlerUDP(%i, \"%s\", \"%s\")", num, msg, path);
qWarning("CarlaEngineOsc::osc_error_handler_UDP(%i, \"%s\", \"%s\")", num, msg, path);
} }


static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const userData)
static int osc_message_handler(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* userData)
{ {
CARLA_ASSERT(userData); CARLA_ASSERT(userData);
if (CarlaEngineOsc* const _this_ = (CarlaEngineOsc*)userData) if (CarlaEngineOsc* const _this_ = (CarlaEngineOsc*)userData)


+ 17
- 19
source/backend/engine/carla_engine_thread.cpp View File

@@ -25,7 +25,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine, QObject* const parent) CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine, QObject* const parent)
: QThread(parent), : QThread(parent),
fEngine(engine)
kEngine(engine)
{ {
qDebug("CarlaEngineThread::CarlaEngineThread(%p, %p)", engine, parent); qDebug("CarlaEngineThread::CarlaEngineThread(%p, %p)", engine, parent);
CARLA_ASSERT(engine); CARLA_ASSERT(engine);
@@ -76,28 +76,27 @@ void CarlaEngineThread::stopNow()
void CarlaEngineThread::run() void CarlaEngineThread::run()
{ {
qDebug("CarlaEngineThread::run()"); qDebug("CarlaEngineThread::run()");
CARLA_ASSERT(fEngine->isRunning());
CARLA_ASSERT(kEngine->isRunning());


bool oscRegisted, usesSingleThread; bool oscRegisted, usesSingleThread;
int i, count; int i, count;
double value; double value;


while (fEngine->isRunning() && ! fStopNow)
while (kEngine->isRunning() && ! fStopNow)
{ {
const CarlaMutex::ScopedLocker sl(&fMutex); const CarlaMutex::ScopedLocker sl(&fMutex);


#ifndef BUILD_BRIDGE
oscRegisted = fEngine->isOscControlRegistered();
#ifdef BUILD_BRIDGE
oscRegisted = kEngine->isOscBridgeRegistered();
#else #else
oscRegisted = fEngine->isOscBridgeRegistered();
oscRegisted = kEngine->isOscControlRegistered();
#endif #endif


for (i=0, count = fEngine->currentPluginCount(); i < count; i++)
for (i=0, count = kEngine->currentPluginCount(); i < count; i++)
{ {
CarlaPlugin* const plugin = fEngine->getPluginUnchecked(i);
CarlaPlugin* const plugin = kEngine->getPluginUnchecked(i);


#if 0
if (! (plugin && plugin->enabled()))
if (plugin == nullptr || ! plugin->enabled())
continue; continue;


CARLA_ASSERT(i == plugin->id()); CARLA_ASSERT(i == plugin->id());
@@ -107,11 +106,11 @@ void CarlaEngineThread::run()
// ------------------------------------------------------- // -------------------------------------------------------
// Process postponed events // Process postponed events


if (! usesSingleThread)
plugin->postEventsRun();

if (oscRegisted || ! usesSingleThread) if (oscRegisted || ! usesSingleThread)
{ {
if (! usesSingleThread)
plugin->postRtEventsRun();

// --------------------------------------------------- // ---------------------------------------------------
// Update parameter outputs // Update parameter outputs


@@ -130,9 +129,9 @@ void CarlaEngineThread::run()
if (oscRegisted) if (oscRegisted)
{ {
#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
fEngine->osc_send_bridge_set_parameter_value(j, value);
kEngine->osc_send_bridge_set_parameter_value(j, value);
#else #else
fEngine->osc_send_control_set_parameter_value(i, j, value);
kEngine->osc_send_control_set_parameter_value(i, j, value);
#endif #endif
} }
} }
@@ -143,16 +142,15 @@ void CarlaEngineThread::run()
if (oscRegisted) if (oscRegisted)
{ {
#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
fEngine->osc_send_peaks(plugin);
kEngine->osc_send_peaks(plugin);
#else #else
fEngine->osc_send_peaks(plugin, i);
kEngine->osc_send_peaks(plugin, i);
#endif #endif
} }
} }
#endif
} }


fEngine->idleOsc();
kEngine->idleOsc();
msleep(oscRegisted ? 40 : 50); msleep(oscRegisted ? 40 : 50);
} }
} }


+ 1
- 1
source/backend/engine/carla_engine_thread.hpp View File

@@ -46,7 +46,7 @@ protected:
// ---------------------------------------------- // ----------------------------------------------


private: private:
CarlaEngine* const fEngine;
CarlaEngine* const kEngine;


CarlaMutex fMutex; CarlaMutex fMutex;
bool fStopNow; bool fStopNow;


+ 44
- 46
source/backend/plugin/carla_plugin.cpp View File

@@ -34,7 +34,7 @@ static const CustomData kCustomDataNull;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Constructor and destructor // Constructor and destructor


CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)
CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const int id)
: fData(new CarlaPluginProtectedData(engine, id)) : fData(new CarlaPluginProtectedData(engine, id))
{ {
CARLA_ASSERT(engine); CARLA_ASSERT(engine);
@@ -1216,7 +1216,7 @@ void CarlaPlugin::sendMidiAllNotesOff()
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Post-poned events // Post-poned events


void CarlaPlugin::postponeEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const double value3)
void CarlaPlugin::postponeRtEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const double value3)
{ {
PluginPostRtEvent event; PluginPostRtEvent event;
event.type = type; event.type = type;
@@ -1224,36 +1224,40 @@ void CarlaPlugin::postponeEvent(const PluginPostRtEventType type, const int32_t
event.value2 = value2; event.value2 = value2;
event.value3 = value3; event.value3 = value3;


fData->postRtEvents.append(event);
fData->postRtEvents.appendRT(event);
} }


#if 0
void CarlaPlugin::postEventsRun()
void CarlaPlugin::postRtEventsRun()
{ {
PluginPostEvent newPostEvents[MAX_POST_EVENTS];
int i = 0;
PluginPostRtEvent listData[512];


// Make a safe copy of events, and clear them
postEvents.mutex.lock();
memcpy(newPostEvents, postEvents.data, sizeof(PluginPostEvent)*MAX_POST_EVENTS);
for (unsigned short i=0; i < MAX_POST_EVENTS; i++)
postEvents.data[i].type = PluginPostEventNull;
postEvents.mutex.unlock();
// Make a safe copy of events while clearing them
fData->postRtEvents.mutex.lock();

while (! fData->postRtEvents.data.isEmpty())
{
PluginPostRtEvent& event = fData->postRtEvents.data.getFirst(true);
listData[i++] = event;
}

fData->postRtEvents.mutex.unlock();


// Handle events now // Handle events now
for (uint32_t i=0; i < MAX_POST_EVENTS; i++)
for (i=0; i < 512; i++)
{ {
const PluginPostEvent* const event = &newPostEvents[i];
const PluginPostRtEvent* const event = &listData[i];


switch (event->type) switch (event->type)
{ {
case PluginPostEventNull:
case kPluginPostRtEventNull:
break; break;


case PluginPostEventDebug:
x_engine->callback(CALLBACK_DEBUG, m_id, event->value1, event->value2, event->value3, nullptr);
case kPluginPostRtEventDebug:
fData->engine->callback(CALLBACK_DEBUG, fData->id, event->value1, event->value2, event->value3, nullptr);
break; break;


case PluginPostEventParameterChange:
case kPluginPostRtEventParameterChange:
// Update UI // Update UI
if (event->value1 >= 0) if (event->value1 >= 0)
uiParameterChange(event->value1, event->value3); uiParameterChange(event->value1, event->value3);
@@ -1261,89 +1265,83 @@ void CarlaPlugin::postEventsRun()
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Update OSC control client // Update OSC control client
if (x_engine->isOscControlRegistered()) if (x_engine->isOscControlRegistered())
x_engine->osc_send_control_set_parameter_value(m_id, event->value1, event->value3);
x_engine->osc_send_control_set_parameter_value(fData->id, event->value1, event->value3);
#endif #endif


// Update Host // Update Host
x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, event->value1, 0, event->value3, nullptr);
fData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fData->id, event->value1, 0, event->value3, nullptr);
break; break;


case PluginPostEventProgramChange:
case kPluginPostRtEventProgramChange:
// Update UI // Update UI
if (event->value1 >= 0) if (event->value1 >= 0)
uiProgramChange(event->value1); uiProgramChange(event->value1);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Update OSC control client // Update OSC control client
if (x_engine->isOscControlRegistered())
if (fData->engine->isOscControlRegistered())
{ {
x_engine->osc_send_control_set_program(m_id, event->value1);
fData->engine->osc_send_control_set_program(m_id, event->value1);


for (uint32_t j=0; j < param.count; j++)
x_engine->osc_send_control_set_default_value(m_id, j, param.ranges[j].def);
for (uint32_t j=0; j < fData->param.count; j++)
fData->engine->osc_send_control_set_default_value(fData->id, j, fData->param.ranges[j].def);
} }
#endif #endif


// Update Host // Update Host
x_engine->callback(CALLBACK_PROGRAM_CHANGED, m_id, event->value1, 0, 0.0, nullptr);
fData->engine->callback(CALLBACK_PROGRAM_CHANGED, fData->id, event->value1, 0, 0.0, nullptr);
break; break;


case PluginPostEventMidiProgramChange:
case kPluginPostRtEventMidiProgramChange:
// Update UI // Update UI
if (event->value1 >= 0) if (event->value1 >= 0)
uiMidiProgramChange(event->value1); uiMidiProgramChange(event->value1);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Update OSC control client // Update OSC control client
if (x_engine->isOscControlRegistered())
if (fData->engine->isOscControlRegistered())
{ {
x_engine->osc_send_control_set_midi_program(m_id, event->value1);
fData->engine->osc_send_control_set_midi_program(fData->id, event->value1);


for (uint32_t j=0; j < param.count; j++) for (uint32_t j=0; j < param.count; j++)
x_engine->osc_send_control_set_default_value(m_id, j, param.ranges[j].def);
fData->engine->osc_send_control_set_default_value(fData->id, j, fData->param.ranges[j].def);
} }
#endif #endif


// Update Host // Update Host
x_engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, m_id, event->value1, 0, 0.0, nullptr);
fData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fData->id, event->value1, 0, 0.0, nullptr);
break; break;


case PluginPostEventNoteOn:
case kPluginPostRtEventNoteOn:
// Update UI // Update UI
uiNoteOn(event->value1, event->value2, rint(event->value3));
uiNoteOn(event->value1, event->value2, int(event->value3));


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Update OSC control client // Update OSC control client
if (x_engine->isOscControlRegistered())
x_engine->osc_send_control_note_on(m_id, event->value1, event->value2, rint(event->value3));
if (fData->engine->isOscControlRegistered())
fData->engine->osc_send_control_note_on(fData->id, event->value1, event->value2, int(event->value3));
#endif #endif


// Update Host // Update Host
x_engine->callback(CALLBACK_NOTE_ON, m_id, event->value1, event->value2, rint(event->value3), nullptr);
fData->engine->callback(CALLBACK_NOTE_ON, fData->id, event->value1, event->value2, int(event->value3), nullptr);
break; break;


case PluginPostEventNoteOff:
case kPluginPostRtEventNoteOff:
// Update UI // Update UI
uiNoteOff(event->value1, event->value2); uiNoteOff(event->value1, event->value2);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Update OSC control client // Update OSC control client
if (x_engine->isOscControlRegistered())
x_engine->osc_send_control_note_off(m_id, event->value1, event->value2);
if (fData->engine->isOscControlRegistered())
fData->engine->osc_send_control_note_off(fData->id, event->value1, event->value2);
#endif #endif


// Update Host // Update Host
x_engine->callback(CALLBACK_NOTE_OFF, m_id, event->value1, event->value2, 0.0, nullptr);
break;

case PluginPostEventCustom:
// Handle custom event
postEventHandleCustom(event->value1, event->value2, event->value3, event->cdata);
fData->engine->callback(CALLBACK_NOTE_OFF, fData->id, event->value1, event->value2, 0.0, nullptr);
break; break;
} }
} }
} }
#endif


void CarlaPlugin::uiParameterChange(const uint32_t index, const double value) void CarlaPlugin::uiParameterChange(const uint32_t index, const double value)
{ {


+ 12
- 4
source/backend/plugin/carla_plugin_internal.hpp View File

@@ -286,7 +286,7 @@ const unsigned int PLUGIN_OPTION2_HAS_MIDI_IN = 0x1;
const unsigned int PLUGIN_OPTION2_HAS_MIDI_OUT = 0x2; const unsigned int PLUGIN_OPTION2_HAS_MIDI_OUT = 0x2;


struct CarlaPluginProtectedData { struct CarlaPluginProtectedData {
unsigned short id;
int id;


CarlaEngine* const engine; CarlaEngine* const engine;
CarlaEngineClient* client; CarlaEngineClient* client;
@@ -328,13 +328,21 @@ struct CarlaPluginProtectedData {
struct PostRtEvents { struct PostRtEvents {
CarlaMutex mutex; CarlaMutex mutex;
RtList<PluginPostRtEvent> data; RtList<PluginPostRtEvent> data;
RtList<PluginPostRtEvent> dataPendingRT;


PostRtEvents() PostRtEvents()
: data(152, 512) {}
: data(152, 512),
dataPendingRT(152, 256) {}


void append(const PluginPostRtEvent& event)
void appendRT(const PluginPostRtEvent& event)
{ {
data.append(event);
dataPendingRT.append(event);

if (mutex.tryLock())
{
dataPendingRT.splice(data, true);
mutex.unlock();
}
} }


} postRtEvents; } postRtEvents;


+ 24
- 17
source/bridges/qtcreator/carla-bridge-plugin.pro View File

@@ -25,12 +25,6 @@ HEADERS = \
../carla_bridge_osc.hpp \ ../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \ ../carla_bridge_toolkit.hpp \


# common
HEADERS += \
../../backend/carla_backend.hpp \
../../backend/carla_engine.hpp \
../../backend/carla_plugin.hpp

# carla-engine # carla-engine
SOURCES += \ SOURCES += \
../../backend/engine/carla_engine.cpp \ ../../backend/engine/carla_engine.cpp \
@@ -38,11 +32,6 @@ SOURCES += \
../../backend/engine/carla_engine_thread.cpp \ ../../backend/engine/carla_engine_thread.cpp \
../../backend/engine/jack.cpp ../../backend/engine/jack.cpp


HEADERS += \
../../backend/engine/carla_engine.hpp \
../../backend/engine/carla_engine_osc.hpp \
../../backend/engine/carla_engine_thread.hpp \

# carla-plugin # carla-plugin
SOURCES += \ SOURCES += \
../../backend/plugin/carla_plugin.cpp ../../backend/plugin/carla_plugin.cpp
@@ -52,13 +41,28 @@ SOURCES += \
# ../../backend/plugin/lv2.cpp \ # ../../backend/plugin/lv2.cpp \
# ../../backend/plugin/vst.cpp # ../../backend/plugin/vst.cpp


HEADERS += \
../../backend/plugin/carla_plugin_thread.hpp

# carla-utils # carla-utils
SOURCES += \ SOURCES += \
../../backend/utils/Shared.cpp ../../backend/utils/Shared.cpp


# common
HEADERS += \
../../backend/carla_backend.hpp \
../../backend/carla_engine.hpp \
../../backend/carla_native.h \
../../backend/carla_native.hpp \
../../backend/carla_plugin.hpp \
../../backend/carla_standalone.hpp

HEADERS += \
../../backend/engine/carla_engine_internal.hpp \
../../backend/engine/carla_engine_osc.hpp \
../../backend/engine/carla_engine_thread.hpp \

HEADERS += \
../../backend/plugin/carla_plugin_internal.hpp \
../../backend/plugin/carla_plugin_thread.hpp

HEADERS += \ HEADERS += \
../../backend/utils/Shared.hpp ../../backend/utils/Shared.hpp


@@ -71,12 +75,15 @@ HEADERS += \


# utils # utils
HEADERS += \ HEADERS += \
../../utils/carla_lib_utils.hpp \
../../utils/carla_osc_utils.hpp \
../../utils/carla_backend_utils.hpp\
../../utils/carla_juce_utils.hpp \
../../utils/carla_ladspa_utils.hpp \ ../../utils/carla_ladspa_utils.hpp \
../../utils/carla_lib_utils.hpp \
../../utils/carla_lv2_utils.hpp \ ../../utils/carla_lv2_utils.hpp \
../../utils/carla_osc_utils.hpp \
../../utils/carla_vst_utils.hpp \ ../../utils/carla_vst_utils.hpp \
../../utils/carla_backend_utils.hpp
../../utils/lv2_atom_queue.hpp \
../../utils/rt_list.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../backend \ ../../backend \


+ 1
- 1
source/carla_shared.py View File

@@ -886,7 +886,7 @@ class PluginParameter(QWidget):
# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# TESTING # TESTING


from PyQt4.QtGui import QApplication
#from PyQt4.QtGui import QApplication


#Carla.isControl = True #Carla.isControl = True




+ 5
- 5
source/includes/ladspa_rdf.hpp View File

@@ -2,17 +2,17 @@
* Custom types to store LADSPA-RDF information * Custom types to store LADSPA-RDF information
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
* This program is 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, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* For a full copy of the GNU General Public License see the COPYING file
* For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#ifndef LADSPA_RDF_INCLUDED #ifndef LADSPA_RDF_INCLUDED


+ 5
- 5
source/includes/lv2_rdf.hpp View File

@@ -2,17 +2,17 @@
* Custom types to store LV2 information * Custom types to store LV2 information
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
* This program is 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, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* For a full copy of the GNU General Public License see the COPYING file
* For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#ifndef LV2_RDF_INCLUDED #ifndef LV2_RDF_INCLUDED


+ 2
- 0
source/utils/carla_backend_utils.hpp View File

@@ -297,6 +297,8 @@ const char* ProcessMode2Str(const ProcessMode& mode)
return "PROCESS_MODE_CONTINUOUS_RACK"; return "PROCESS_MODE_CONTINUOUS_RACK";
case PROCESS_MODE_PATCHBAY: case PROCESS_MODE_PATCHBAY:
return "PROCESS_MODE_PATCHBAY"; return "PROCESS_MODE_PATCHBAY";
case PROCESS_MODE_BRIDGE:
return "PROCESS_MODE_BRIDGE";
} }


qWarning("CarlaBackend::ProcessModeType2Str(%i) - invalid type", mode); qWarning("CarlaBackend::ProcessModeType2Str(%i) - invalid type", mode);


+ 12
- 1
source/utils/rt_list.hpp View File

@@ -80,14 +80,17 @@ public:
return (fCount == 0); return (fCount == 0);
} }


void append(const T& value)
bool append(const T& value)
{ {
if (Data* const data = _allocate()) if (Data* const data = _allocate())
{ {
std::memcpy(&data->value, &value, sizeof(T)); std::memcpy(&data->value, &value, sizeof(T));
list_add_tail(&data->siblings, &fQueue); list_add_tail(&data->siblings, &fQueue);
fCount++; fCount++;
return true;
} }

return false;
} }


T& getAt(const size_t index, const bool remove = false) T& getAt(const size_t index, const bool remove = false)
@@ -173,6 +176,14 @@ public:
} }
} }


void splice(List& list, const bool init = false)
{
if (init)
list_splice_init(&fQueue, &list.fQueue);
else
list_splice(&fQueue, &list.fQueue);
}

protected: protected:
const size_t fDataSize; const size_t fDataSize;
size_t fCount; size_t fCount;


Loading…
Cancel
Save