Browse Source

Misc fixing for static analysis

tags/1.9.4
falkTX 12 years ago
parent
commit
88f1fa2d69
43 changed files with 1041 additions and 927 deletions
  1. +9
    -3
      source/Makefile.mk
  2. +19
    -11
      source/backend/carla_backend.hpp
  3. +23
    -15
      source/backend/carla_engine.hpp
  4. +5
    -5
      source/backend/carla_native.h
  5. +5
    -5
      source/backend/carla_native.hpp
  6. +60
    -40
      source/backend/carla_plugin.hpp
  7. +7
    -6
      source/backend/engine/Makefile
  8. +471
    -437
      source/backend/engine/carla_engine.cpp
  9. +2
    -1
      source/backend/engine/carla_engine.pro
  10. +32
    -31
      source/backend/engine/carla_engine_internal.hpp
  11. +5
    -5
      source/backend/engine/carla_engine_osc.hpp
  12. +5
    -5
      source/backend/engine/carla_engine_thread.hpp
  13. +108
    -106
      source/backend/engine/jack.cpp
  14. +21
    -21
      source/backend/engine/rtaudio.cpp
  15. +8
    -8
      source/backend/native/3bandeq/DistrhoPlugin3BandEQ.cpp
  16. +4
    -4
      source/backend/native/3bandeq/DistrhoUI3BandEQ.hpp
  17. +8
    -8
      source/backend/native/3bandsplitter/DistrhoPlugin3BandSplitter.cpp
  18. +2
    -2
      source/backend/native/3bandsplitter/DistrhoUI3BandSplitter.hpp
  19. +5
    -5
      source/backend/native/bypass.c
  20. +6
    -6
      source/backend/native/distrho-3bandeq.cpp
  21. +6
    -6
      source/backend/native/distrho-3bandsplitter.cpp
  22. +5
    -5
      source/backend/native/distrho-pingpongpan.cpp
  23. +2
    -3
      source/backend/native/distrho/DistrhoPluginCarla.cpp
  24. +6
    -6
      source/backend/native/midi-split.c
  25. +6
    -6
      source/backend/native/midi-through.c
  26. +3
    -3
      source/backend/native/pingpongpan/DistrhoPluginPingPongPan.cpp
  27. +2
    -2
      source/backend/native/pingpongpan/DistrhoUIPingPongPan.hpp
  28. +6
    -6
      source/backend/native/zynaddsubfx.cpp
  29. +7
    -5
      source/includes/carla_midi.h
  30. +1
    -1
      source/libs/distrho-plugin-toolkit/DistrhoPlugin.h
  31. +3
    -3
      source/libs/distrho-plugin-toolkit/DistrhoUI.h
  32. +3
    -3
      source/libs/distrho-plugin-toolkit/DistrhoUIOpenGL.h
  33. +3
    -3
      source/libs/distrho-plugin-toolkit/DistrhoUIOpenGLExt.h
  34. +1
    -1
      source/libs/distrho-plugin-toolkit/DistrhoUtils.h
  35. +1
    -1
      source/libs/distrho-plugin-toolkit/src/DistrhoUI.cpp
  36. +4
    -4
      source/libs/distrho-plugin-toolkit/src/DistrhoUIInternal.h
  37. +1
    -1
      source/libs/distrho-plugin-toolkit/src/DistrhoUIOpenGL.cpp
  38. +17
    -17
      source/libs/distrho-plugin-toolkit/src/DistrhoUIOpenGLExt.cpp
  39. +3
    -3
      source/libs/pugl/pugl.h
  40. +14
    -14
      source/libs/pugl/pugl_x11.c
  41. +4
    -2
      source/utils/carla_backend_utils.hpp
  42. +8
    -9
      source/utils/carla_osc_utils.hpp
  43. +130
    -99
      source/utils/carla_utils.hpp

+ 9
- 3
source/Makefile.mk View File

@@ -18,21 +18,27 @@ WINDRES ?= windres
DEBUG ?= false DEBUG ?= false


ifeq ($(DEBUG),true) ifeq ($(DEBUG),true)
BASE_FLAGS = -O0 -g -Wall -Wextra
BASE_FLAGS = -O0 -g
BASE_FLAGS += -DDEBUG BASE_FLAGS += -DDEBUG
STRIP = true # FIXME STRIP = true # FIXME
else else
BASE_FLAGS = -O2 -ffast-math -mtune=generic -msse -mfpmath=sse -Wall -Wextra
BASE_FLAGS = -O2 -ffast-math -mtune=generic -msse -mfpmath=sse
BASE_FLAGS += -DNDEBUG BASE_FLAGS += -DNDEBUG
endif endif


BASE_FLAGS += -ansi -pedantic -pedantic-errors -Wall -Wextra -Wformat=2 -Wunused-parameter -Wuninitialized
BASE_FLAGS += -Wcast-qual -Wconversion -Wsign-conversion -Wlogical-op -Waggregate-return
BASE_FLAGS += -fipa-pure-const -Wsuggest-attribute=noreturn #pure,const,noreturn
BASE_FLAGS += -Wno-vla -isystem /usr/include/qt4/
32BIT_FLAGS = -m32 32BIT_FLAGS = -m32
64BIT_FLAGS = -m64 64BIT_FLAGS = -m64


BUILD_C_FLAGS = $(BASE_FLAGS) -std=c99 $(CFLAGS)
BUILD_C_FLAGS = $(BASE_FLAGS) -std=c99 -Wc++-compat -Wunsuffixed-float-constants -Wwrite-strings $(CFLAGS)
BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS)
LINK_FLAGS = $(LDFLAGS) LINK_FLAGS = $(LDFLAGS)


# BUILD_CXX_FLAGS += -Wzero-as-null-pointer-constant

ifneq ($(DEBUG),true) ifneq ($(DEBUG),true)
BUILD_CXX_FLAGS += -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT BUILD_CXX_FLAGS += -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT
endif endif


+ 19
- 11
source/backend/carla_backend.hpp View File

@@ -217,7 +217,8 @@ enum InternalParametersIndex {
PARAMETER_VOLUME = -4, //!< Volume parameter, range 0.0...1.27; default is 1.0. PARAMETER_VOLUME = -4, //!< Volume parameter, range 0.0...1.27; default is 1.0.
PARAMETER_BALANCE_LEFT = -5, //!< Stereo Balance-Left parameter, range -1.0...1.0; default is -1.0. PARAMETER_BALANCE_LEFT = -5, //!< Stereo Balance-Left parameter, range -1.0...1.0; default is -1.0.
PARAMETER_BALANCE_RIGHT = -6, //!< Stereo Balance-Right parameter, range -1.0...1.0; default is 1.0. PARAMETER_BALANCE_RIGHT = -6, //!< Stereo Balance-Right parameter, range -1.0...1.0; default is 1.0.
PARAMETER_PANNING = -7 //!< Mono Panning parameter, range -1.0...1.0; default is 0.0.
PARAMETER_PANNING = -7, //!< Mono Panning parameter, range -1.0...1.0; default is 0.0.
PARAMETER_MAX = -8 //!< Max value, defined for convenience
}; };


/*! /*!
@@ -576,6 +577,19 @@ struct ParameterRanges {
step(0.01f), step(0.01f),
stepSmall(0.0001f), stepSmall(0.0001f),
stepLarge(0.1f) {} stepLarge(0.1f) {}

void fixDefault()
{
fixValue(def);
}

void fixValue(float& value) const
{
if (value < min)
value = min;
else if (value > max)
value = max;
}
}; };


/*! /*!
@@ -593,8 +607,7 @@ struct MidiProgramData {


~MidiProgramData() ~MidiProgramData()
{ {
if (name)
free((void*)name);
std::free((void*)name);
} }
}; };


@@ -616,14 +629,9 @@ struct CustomData {


~CustomData() ~CustomData()
{ {
if (type)
::free((void*)type);

if (key)
::free((void*)key);

if (value)
::free((void*)value);
std::free((void*)type);
std::free((void*)key);
std::free((void*)value);
} }
}; };




+ 23
- 15
source/backend/carla_engine.hpp View File

@@ -70,11 +70,13 @@ enum EnginePortType {


/*! /*!
* Audio port type. * Audio port type.
* \see CarlaEngineAudioPort
*/ */
kEnginePortTypeAudio = 1, kEnginePortTypeAudio = 1,


/*! /*!
* Event port type. * Event port type.
** \see CarlaEngineEventPort
*/ */
kEnginePortTypeEvent = 2 kEnginePortTypeEvent = 2
}; };
@@ -254,9 +256,9 @@ struct EngineOptions {
forceStereo(false), forceStereo(false),
preferPluginBridges(false), preferPluginBridges(false),
preferUiBridges(true), preferUiBridges(true),
#ifdef WANT_DSSI
#ifdef WANT_DSSI
useDssiVstChunks(false), useDssiVstChunks(false),
#endif
#endif
maxParameters(MAX_DEFAULT_PARAMETERS), maxParameters(MAX_DEFAULT_PARAMETERS),
oscUiTimeout(4000), oscUiTimeout(4000),
preferredBufferSize(512), preferredBufferSize(512),
@@ -340,9 +342,8 @@ public:
virtual void initBuffer(CarlaEngine* const engine) = 0; virtual void initBuffer(CarlaEngine* const engine) = 0;


protected: protected:
const bool isInput;
const ProcessMode processMode;
void* buffer;
const bool kIsInput;
const ProcessMode kProcessMode;


private: private:
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEnginePort) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEnginePort)
@@ -380,6 +381,9 @@ public:
*/ */
virtual void initBuffer(CarlaEngine* const engine); virtual void initBuffer(CarlaEngine* const engine);


protected:
float* fBuffer;

private: private:
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineAudioPort) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineAudioPort)
}; };
@@ -443,7 +447,8 @@ public:
virtual void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t* const data, const uint8_t size); virtual void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t* const data, const uint8_t size);


private: private:
const uint32_t m_maxEventCount;
const uint32_t kMaxEventCount;
EngineEvent* fBuffer;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineEventPort) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineEventPort)
}; };
@@ -512,12 +517,12 @@ public:
virtual const CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) = 0; virtual const CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) = 0;


protected: protected:
const EngineType engineType;
const ProcessMode processMode;
const EngineType kEngineType;
const ProcessMode kProcessMode;


private: private:
bool m_active;
uint32_t m_latency;
bool fActive;
uint32_t fLatency;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineClient) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineClient)
}; };
@@ -575,12 +580,12 @@ public:
/*! /*!
* Maximum client name size. * Maximum client name size.
*/ */
virtual int maxClientNameSize();
virtual unsigned int maxClientNameSize();


/*! /*!
* Maximum port name size. * Maximum port name size.
*/ */
virtual int maxPortNameSize();
virtual unsigned int maxPortNameSize();


/*! /*!
* Current number of plugins loaded. * Current number of plugins loaded.
@@ -658,13 +663,13 @@ public:
* Add new plugin.\n * Add new plugin.\n
* Returns the id of the plugin, or -1 if the operation failed. * Returns the id of the plugin, or -1 if the operation failed.
*/ */
short addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr);
int addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr);


/*! /*!
* Add new plugin, using native binary type.\n * Add new plugin, using native binary type.\n
* Returns the id of the plugin, or -1 if the operation failed. * Returns the id of the plugin, or -1 if the operation failed.
*/ */
short addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr)
int addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr)
{ {
return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra); return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
} }
@@ -672,7 +677,7 @@ public:
/*! /*!
* Remove plugin with id \a id. * Remove plugin with id \a id.
*/ */
bool removePlugin(const unsigned short id);
bool removePlugin(const unsigned int id);


/*! /*!
* Remove all plugins. * Remove all plugins.
@@ -842,6 +847,8 @@ protected:


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// Rack mode data // Rack mode data
EngineEvent* getRackEventBuffer(const bool isInput);

//static const unsigned short MAX_EVENTS = 1024; //static const unsigned short MAX_EVENTS = 1024;
//EngineEvent fRackEventsIn[MAX_EVENTS]; //EngineEvent fRackEventsIn[MAX_EVENTS];
//EngineEvent fRackEventsOut[MAX_EVENTS]; //EngineEvent fRackEventsOut[MAX_EVENTS];
@@ -919,6 +926,7 @@ private:
void osc_send_bridge_set_inpeak(const int32_t portId); void osc_send_bridge_set_inpeak(const int32_t portId);
void osc_send_bridge_set_outpeak(const int32_t portId); void osc_send_bridge_set_outpeak(const int32_t portId);
#else #else
public:
void osc_send_control_add_plugin_start(const int32_t pluginId, const char* const pluginName); void osc_send_control_add_plugin_start(const int32_t pluginId, const char* const pluginName);
void osc_send_control_add_plugin_end(const int32_t pluginId); void osc_send_control_add_plugin_end(const int32_t pluginId);
void osc_send_control_remove_plugin(const int32_t pluginId); void osc_send_control_remove_plugin(const int32_t pluginId);


+ 5
- 5
source/backend/carla_native.h View File

@@ -2,17 +2,17 @@
* Carla Native Plugin API * Carla Native Plugin API
* 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 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 __CARLA_NATIVE_H__ #ifndef __CARLA_NATIVE_H__


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

@@ -2,17 +2,17 @@
* Carla Native Plugin API * Carla Native Plugin API
* 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 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 __CARLA_NATIVE_HPP__ #ifndef __CARLA_NATIVE_HPP__


+ 60
- 40
source/backend/carla_plugin.hpp View File

@@ -22,11 +22,8 @@
#include "carla_native.h" #include "carla_native.h"
#include "carla_utils.hpp" #include "carla_utils.hpp"


#ifdef WANT_LADSPA
# include "ladspa_rdf.hpp"
#endif

// Avoid including liblo here
// Avoid including extra libs here
struct LADSPA_RDF_Descriptor;
typedef void* lo_address; typedef void* lo_address;


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE
@@ -35,7 +32,7 @@ CARLA_BACKEND_START_NAMESPACE
} // Fix editor indentation } // Fix editor indentation
#endif #endif


#ifndef BUILD_BRIDGE
#if 0 //ndef BUILD_BRIDGE
enum PluginBridgeInfoType { enum PluginBridgeInfoType {
kPluginBridgeAudioCount, kPluginBridgeAudioCount,
kPluginBridgeMidiCount, kPluginBridgeMidiCount,
@@ -60,14 +57,14 @@ enum PluginBridgeInfoType {
}; };
#endif #endif


enum PluginPostEventType {
kPluginPostEventNull,
kPluginPostEventDebug,
kPluginPostEventParameterChange, // param, N, value
kPluginPostEventProgramChange, // index
kPluginPostEventMidiProgramChange, // index
kPluginPostEventNoteOn, // channel, note, velo
kPluginPostEventNoteOff // channel, note
enum PluginPostRtEventType {
kPluginPostRtEventNull,
kPluginPostRtEventDebug,
kPluginPostRtEventParameterChange, // param, N, value
kPluginPostRtEventProgramChange, // index
kPluginPostRtEventMidiProgramChange, // index
kPluginPostRtEventNoteOn, // channel, note, velo
kPluginPostRtEventNoteOff // channel, note
}; };


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -97,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 short id);
CarlaPlugin(CarlaEngine* const engine, const unsigned int id);


/*! /*!
* This is the destructor of the base plugin class. * This is the destructor of the base plugin class.
@@ -167,13 +164,19 @@ public:
/*! /*!
* Get the plugin's category (delay, filter, synth, etc). * Get the plugin's category (delay, filter, synth, etc).
*/ */
virtual PluginCategory category();
virtual PluginCategory category()
{
return PLUGIN_CATEGORY_NONE;
}


/*! /*!
* Get the plugin's native unique Id.\n * Get the plugin's native unique Id.\n
* May return 0 on plugin types that don't support Ids. * May return 0 on plugin types that don't support Ids.
*/ */
virtual long uniqueId();
virtual long uniqueId()
{
return 0;
}


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Information (count) // Information (count)
@@ -372,7 +375,7 @@ public:
* *
* \see id() * \see id()
*/ */
void setId(const unsigned short id);
void setId(const unsigned int id);


/*! /*!
* Enable or disable the plugin according to \a yesNo. * Enable or disable the plugin according to \a yesNo.
@@ -416,6 +419,8 @@ public:
* *
* \param sendOsc Send message change over OSC * \param sendOsc Send message change over OSC
* \param sendCallback Send message change to registered callback * \param sendCallback Send message change to registered callback
*
* \note Pure-Stereo plugins only!
*/ */
void setBalanceLeft(double value, const bool sendOsc, const bool sendCallback); void setBalanceLeft(double value, const bool sendOsc, const bool sendCallback);


@@ -425,14 +430,27 @@ public:
* *
* \param sendOsc Send message change over OSC * \param sendOsc Send message change over OSC
* \param sendCallback Send message change to registered callback * \param sendCallback Send message change to registered callback
*
* \note Pure-Stereo plugins only!
*/ */
void setBalanceRight(double value, const bool sendOsc, const bool sendCallback); void setBalanceRight(double value, const bool sendOsc, const bool sendCallback);


#ifndef BUILD_BRIDGE
/*!
* Set the plugin's output panning value to \a value.\n
* \a value must be between -1.0 and 1.0.
*
* \param sendOsc Send message change over OSC
* \param sendCallback Send message change to registered callback
*
* \note Force-Stereo plugins only!
*/
void setPanning(double value, const bool sendOsc, const bool sendCallback);

#if 0 //ndef BUILD_BRIDGE
/*! /*!
* BridgePlugin call used to set internal data. * BridgePlugin call used to set internal data.
*/ */
//virtual int setOscBridgeInfo(const PluginBridgeInfoType type, const int argc, const lo_arg* const* const argv, const char* const types);
virtual int setOscBridgeInfo(const PluginBridgeInfoType type, const int argc, const lo_arg* const* const argv, const char* const types);
#endif #endif


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -536,13 +554,6 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set gui stuff // Set gui stuff


/*!
* Set the plugin's custom GUI container.\n
*
* \note This function must be always called from the main thread.
*/
//virtual void setGuiContainer(GuiContainer* const container);

/*! /*!
* Show (or hide) the plugin's custom GUI according to \a yesNo. * Show (or hide) the plugin's custom GUI according to \a yesNo.
* *
@@ -589,6 +600,11 @@ public:
*/ */
virtual void bufferSizeChanged(const uint32_t newBufferSize); virtual void bufferSizeChanged(const uint32_t newBufferSize);


/*!
* Tell the plugin the current sample rate has changed.
*/
virtual void sampleRateChanged(const double newSampleRate);

/*! /*!
* Recreate latency audio buffers. * Recreate latency audio buffers.
*/ */
@@ -641,7 +657,7 @@ 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 PluginPostEventType type, const int32_t value1, const int32_t value2, const double value3, const void* const cdata = nullptr);
void postponeEvent(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.
@@ -649,12 +665,6 @@ public:
*/ */
void postEventsRun(); void postEventsRun();


/*!
* Handle custom post event.\n
* Implementation depends on plugin type.
*/
virtual void postEventHandleCustom(const int32_t value1, const int32_t value2, const double value3, const void* const cdata);

/*! /*!
* Tell the UI a parameter has changed. * Tell the UI a parameter has changed.
*/ */
@@ -732,21 +742,31 @@ public:
}; };


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
static size_t getNativePluginCount();
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);
#endif #endif
#ifdef WANT_LADSPA
static CarlaPlugin* newLADSPA(const Initializer& init, const void* const extra); static CarlaPlugin* newLADSPA(const Initializer& init, const void* const extra);
#endif
#ifdef WANT_DSSI
static CarlaPlugin* newDSSI(const Initializer& init, const void* const extra); static CarlaPlugin* newDSSI(const Initializer& init, const void* const extra);
#endif
#ifdef WANT_LV2
static CarlaPlugin* newLV2(const Initializer& init); static CarlaPlugin* newLV2(const Initializer& init);
#endif
#ifdef WANT_VST
static CarlaPlugin* newVST(const Initializer& init); static CarlaPlugin* newVST(const Initializer& init);
#ifndef BUILD_BRIDGE
#endif
#ifdef WANT_LINUXSAMPLER
static CarlaPlugin* newGIG(const Initializer& init); static CarlaPlugin* newGIG(const Initializer& init);
static CarlaPlugin* newSF2(const Initializer& init);
static CarlaPlugin* newSFZ(const Initializer& init); static CarlaPlugin* newSFZ(const Initializer& init);
static CarlaPlugin* newBridge(const Initializer& init, const BinaryType btype, const PluginType ptype, const void* const extra);
#endif #endif
static size_t getNativePluginCount();
static const PluginDescriptor* getNativePluginDescriptor(const size_t index);
#ifdef WANT_FLUIDSYNTH
static CarlaPlugin* newSF2(const Initializer& init);
#endif


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




+ 7
- 6
source/backend/engine/Makefile View File

@@ -9,7 +9,7 @@ include ../../Makefile.mk
# -------------------------------------------------------------- # --------------------------------------------------------------


BUILD_CXX_FLAGS += -fvisibility=hidden -fPIC -I. -I.. -I../../includes -I../../libs -I../../utils BUILD_CXX_FLAGS += -fvisibility=hidden -fPIC -I. -I.. -I../../includes -I../../libs -I../../utils
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo QtCore)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) # liblo -isystem /opt/kxstudio/include/


LINK_FLAGS += -shared LINK_FLAGS += -shared
LINK_FLAGS += $(shell pkg-config --libs liblo QtCore) LINK_FLAGS += $(shell pkg-config --libs liblo QtCore)
@@ -49,16 +49,17 @@ endif
# -------------------------------------------------------------- # --------------------------------------------------------------


OBJS = \ OBJS = \
carla_engine.cpp.o
carla_engine.cpp.o \
jack.cpp.o

# carla_engine_osc.cpp.o \ # carla_engine_osc.cpp.o \
# carla_engine_thread.cpp.o \ # carla_engine_thread.cpp.o \
# jack.cpp.o \
# rtaudio.cpp.o # rtaudio.cpp.o


ifeq ($(WANT_RTAUDIO),true) ifeq ($(WANT_RTAUDIO),true)
OBJS += \
rtaudio-4.0.11/RtAudio.cpp.o \
rtmidi-2.0.1/RtMidi.cpp.o
# OBJS += \
# rtaudio-4.0.11/RtAudio.cpp.o \
# rtmidi-2.0.1/RtMidi.cpp.o
endif endif


TARGET = ../carla_engine.so TARGET = ../carla_engine.so


+ 471
- 437
source/backend/engine/carla_engine.cpp
File diff suppressed because it is too large
View File


+ 2
- 1
source/backend/engine/carla_engine.pro View File

@@ -56,7 +56,8 @@ HEADERS += \
../../includes/carla_midi.h \ ../../includes/carla_midi.h \
../../utils/carla_utils.hpp \ ../../utils/carla_utils.hpp \
../../utils/carla_backend_utils.hpp \ ../../utils/carla_backend_utils.hpp \
../../utils/carla_juce_utils.hpp
../../utils/carla_juce_utils.hpp \
../../utils/carla_osc_utils.hpp


HEADERS += \ HEADERS += \
plugin/DistrhoPluginInfo.h plugin/DistrhoPluginInfo.h


+ 32
- 31
source/backend/engine/carla_engine_internal.hpp View File

@@ -2,17 +2,17 @@
* Carla Engine * Carla Engine
* 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 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 __CARLA_ENGINE_INTERNAL_HPP__ #ifndef __CARLA_ENGINE_INTERNAL_HPP__
@@ -39,14 +39,14 @@ const char* EngineType2Str(const EngineType type)
{ {
switch (type) switch (type)
{ {
case EngineTypeNull:
return "EngineTypeNull";
case EngineTypeJack:
return "EngineTypeJack";
case EngineTypeRtAudio:
return "EngineTypeRtAudio";
case EngineTypePlugin:
return "EngineTypePlugin";
case kEngineTypeNull:
return "kEngineTypeNull";
case kEngineTypeJack:
return "kEngineTypeJack";
case kEngineTypeRtAudio:
return "kEngineTypeRtAudio";
case kEngineTypePlugin:
return "kEngineTypePlugin";
} }


qWarning("CarlaBackend::EngineType2Str(%i) - invalid type", type); qWarning("CarlaBackend::EngineType2Str(%i) - invalid type", type);
@@ -58,12 +58,12 @@ const char* EnginePortType2Str(const EnginePortType type)
{ {
switch (type) switch (type)
{ {
case EnginePortTypeNull:
return "EnginePortTypeNull";
case EnginePortTypeAudio:
return "EnginePortTypeAudio";
case EnginePortTypeEvent:
return "EnginePortTypeEvent";
case kEnginePortTypeNull:
return "kEnginePortTypeNull";
case kEnginePortTypeAudio:
return "kEnginePortTypeAudio";
case kEnginePortTypeEvent:
return "kEnginePortTypeEvent";
} }


qWarning("CarlaBackend::EnginePortType2Str(%i) - invalid type", type); qWarning("CarlaBackend::EnginePortType2Str(%i) - invalid type", type);
@@ -75,18 +75,18 @@ const char* EngineControlEventType2Str(const EngineControlEventType type)
{ {
switch (type) switch (type)
{ {
case EngineControlEventTypeNull:
return "EngineNullEvent";
case EngineControlEventTypeParameter:
return "EngineControlEventTypeParameter";
case EngineControlEventTypeMidiBank:
return "EngineControlEventTypeMidiBank";
case EngineControlEventTypeMidiProgram:
return "EngineControlEventTypeMidiProgram";
case EngineControlEventTypeAllSoundOff:
return "EngineControlEventTypeAllSoundOff";
case EngineControlEventTypeAllNotesOff:
return "EngineControlEventTypeAllNotesOff";
case kEngineControlEventTypeNull:
return "kEngineNullEvent";
case kEngineControlEventTypeParameter:
return "kEngineControlEventTypeParameter";
case kEngineControlEventTypeMidiBank:
return "kEngineControlEventTypeMidiBank";
case kEngineControlEventTypeMidiProgram:
return "kEngineControlEventTypeMidiProgram";
case kEngineControlEventTypeAllSoundOff:
return "kEngineControlEventTypeAllSoundOff";
case kEngineControlEventTypeAllNotesOff:
return "kEngineControlEventTypeAllNotesOff";
} }


qWarning("CarlaBackend::EngineControlEventType2Str(%i) - invalid type", type); qWarning("CarlaBackend::EngineControlEventType2Str(%i) - invalid type", type);
@@ -103,6 +103,7 @@ const char* EngineControlEventType2Str(const EngineControlEventType type)


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;
const unsigned short RACK_EVENT_COUNT = 1024;


#if 0 #if 0
enum EnginePostEventType { enum EnginePostEventType {


+ 5
- 5
source/backend/engine/carla_engine_osc.hpp View File

@@ -2,17 +2,17 @@
* Carla Engine OSC * Carla Engine OSC
* 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 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 __CARLA_ENGINE_OSC_HPP__ #ifndef __CARLA_ENGINE_OSC_HPP__


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

@@ -2,17 +2,17 @@
* Carla Engine Thread * Carla Engine Thread
* 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 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 __CARLA_ENGINE_THREAD_HPP__ #ifndef __CARLA_ENGINE_THREAD_HPP__


+ 108
- 106
source/backend/engine/jack.cpp View File

@@ -66,24 +66,24 @@ public:


if (! engine) if (! engine)
{ {
buffer = nullptr;
fBuffer = nullptr;
return; return;
} }


if (! m_port) if (! m_port)
return CarlaEngineAudioPort::initBuffer(engine); return CarlaEngineAudioPort::initBuffer(engine);


buffer = jackbridge_port_get_buffer(m_port, engine->getBufferSize());
fBuffer = (float*)jackbridge_port_get_buffer(m_port, engine->getBufferSize());
} }


float* getBuffer() const float* getBuffer() const
{ {
return (float*)buffer;
return fBuffer;
} }


private: private:
jack_client_t* const m_client; jack_client_t* const m_client;
jack_port_t* const m_port;
jack_port_t* const m_port;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort)
}; };
@@ -125,17 +125,17 @@ public:


if (! engine) if (! engine)
{ {
buffer = nullptr;
fBuffer = nullptr;
return; return;
} }


if (! m_port) if (! m_port)
return CarlaEngineEventPort::initBuffer(engine); return CarlaEngineEventPort::initBuffer(engine);


buffer = jackbridge_port_get_buffer(m_port, engine->getBufferSize());
fBuffer = jackbridge_port_get_buffer(m_port, engine->getBufferSize());


if (! isInput)
jackbridge_midi_clear_buffer(buffer);
if (! kIsInput)
jackbridge_midi_clear_buffer(fBuffer);
} }


uint32_t getEventCount() uint32_t getEventCount()
@@ -143,15 +143,15 @@ public:
if (! m_port) if (! m_port)
return CarlaEngineEventPort::getEventCount(); return CarlaEngineEventPort::getEventCount();


if (! isInput)
if (! kIsInput)
return 0; return 0;


CARLA_ASSERT(buffer);
CARLA_ASSERT(fBuffer);


if (! buffer)
if (! fBuffer)
return 0; return 0;


return jackbridge_midi_get_event_count(buffer);
return jackbridge_midi_get_event_count(fBuffer);
} }


const EngineEvent* getEvent(const uint32_t index) const EngineEvent* getEvent(const uint32_t index)
@@ -159,17 +159,17 @@ public:
if (! m_port) if (! m_port)
return CarlaEngineEventPort::getEvent(index); return CarlaEngineEventPort::getEvent(index);


if (! isInput)
if (! kIsInput)
return nullptr; return nullptr;


CARLA_ASSERT(buffer);
CARLA_ASSERT(fBuffer);


if (! buffer)
if (! fBuffer)
return nullptr; return nullptr;


jack_midi_event_t jackEvent; jack_midi_event_t jackEvent;


if (jackbridge_midi_event_get(&jackEvent, buffer, index) != 0 || jackEvent.size > 3)
if (jackbridge_midi_event_get(&jackEvent, fBuffer, index) != 0 || jackEvent.size > 3)
return nullptr; return nullptr;


m_retEvent.clear(); m_retEvent.clear();
@@ -183,25 +183,25 @@ public:
if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus)) if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
{ {
const uint8_t midiControl = jackEvent.buffer[1]; const uint8_t midiControl = jackEvent.buffer[1];
m_retEvent.type = EngineEventTypeControl;
m_retEvent.type = kEngineEventTypeControl;


if (MIDI_IS_CONTROL_BANK_SELECT(midiControl)) if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
{ {
const uint8_t midiBank = jackEvent.buffer[2]; const uint8_t midiBank = jackEvent.buffer[2];


m_retEvent.ctrl.type = EngineControlEventTypeMidiBank;
m_retEvent.ctrl.type = kEngineControlEventTypeMidiBank;
m_retEvent.ctrl.parameter = midiBank; m_retEvent.ctrl.parameter = midiBank;
m_retEvent.ctrl.value = 0.0; m_retEvent.ctrl.value = 0.0;
} }
else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF) else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
{ {
m_retEvent.ctrl.type = EngineControlEventTypeAllSoundOff;
m_retEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
m_retEvent.ctrl.parameter = 0; m_retEvent.ctrl.parameter = 0;
m_retEvent.ctrl.value = 0.0; m_retEvent.ctrl.value = 0.0;
} }
else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF) else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
{ {
m_retEvent.ctrl.type = EngineControlEventTypeAllNotesOff;
m_retEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
m_retEvent.ctrl.parameter = 0; m_retEvent.ctrl.parameter = 0;
m_retEvent.ctrl.value = 0.0; m_retEvent.ctrl.value = 0.0;
} }
@@ -209,7 +209,7 @@ public:
{ {
const uint8_t midiValue = jackEvent.buffer[2]; const uint8_t midiValue = jackEvent.buffer[2];


m_retEvent.ctrl.type = EngineControlEventTypeParameter;
m_retEvent.ctrl.type = kEngineControlEventTypeParameter;
m_retEvent.ctrl.parameter = midiControl; m_retEvent.ctrl.parameter = midiControl;
m_retEvent.ctrl.value = double(midiValue)/127; m_retEvent.ctrl.value = double(midiValue)/127;
} }
@@ -217,15 +217,15 @@ public:
else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus)) else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
{ {
const uint8_t midiProgram = jackEvent.buffer[1]; const uint8_t midiProgram = jackEvent.buffer[1];
m_retEvent.type = EngineEventTypeControl;
m_retEvent.type = kEngineEventTypeControl;


m_retEvent.ctrl.type = EngineControlEventTypeMidiProgram;
m_retEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
m_retEvent.ctrl.parameter = midiProgram; m_retEvent.ctrl.parameter = midiProgram;
m_retEvent.ctrl.value = 0.0; m_retEvent.ctrl.value = 0.0;
} }
else else
{ {
m_retEvent.type = EngineEventTypeMidi;
m_retEvent.type = kEngineEventTypeMidi;


m_retEvent.midi.data[0] = midiStatus; m_retEvent.midi.data[0] = midiStatus;
m_retEvent.midi.data[1] = jackEvent.buffer[1]; m_retEvent.midi.data[1] = jackEvent.buffer[1];
@@ -241,20 +241,20 @@ public:
if (! m_port) if (! m_port)
return CarlaEngineEventPort::writeControlEvent(time, channel, type, parameter, value); return CarlaEngineEventPort::writeControlEvent(time, channel, type, parameter, value);


if (isInput)
if (kIsInput)
return; return;


CARLA_ASSERT(buffer);
CARLA_ASSERT(type != EngineControlEventTypeNull);
CARLA_ASSERT(fBuffer);
CARLA_ASSERT(type != kEngineControlEventTypeNull);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS); CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);


if (! buffer)
if (! fBuffer)
return; return;
if (type == EngineControlEventTypeNull)
if (type == kEngineControlEventTypeNull)
return; return;
if (channel >= MAX_MIDI_CHANNELS) if (channel >= MAX_MIDI_CHANNELS)
return; return;
if (type == EngineControlEventTypeParameter)
if (type == kEngineControlEventTypeParameter)
{ {
CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(parameter)); CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(parameter));
} }
@@ -264,31 +264,31 @@ public:


switch (type) switch (type)
{ {
case EngineControlEventTypeNull:
case kEngineControlEventTypeNull:
break; break;
case EngineControlEventTypeParameter:
case kEngineControlEventTypeParameter:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel; data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = parameter; data[1] = parameter;
data[2] = value * 127; data[2] = value * 127;
size = 3; size = 3;
break; break;
case EngineControlEventTypeMidiBank:
case kEngineControlEventTypeMidiBank:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel; data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_BANK_SELECT; data[1] = MIDI_CONTROL_BANK_SELECT;
data[2] = value; data[2] = value;
size = 3; size = 3;
break; break;
case EngineControlEventTypeMidiProgram:
case kEngineControlEventTypeMidiProgram:
data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel; data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
data[1] = value; data[1] = value;
size = 2; size = 2;
break; break;
case EngineControlEventTypeAllSoundOff:
case kEngineControlEventTypeAllSoundOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel; data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_SOUND_OFF; data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
size = 2; size = 2;
break; break;
case EngineControlEventTypeAllNotesOff:
case kEngineControlEventTypeAllNotesOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel; data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_NOTES_OFF; data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
size = 2; size = 2;
@@ -296,7 +296,7 @@ public:
} }


if (size > 0) if (size > 0)
jackbridge_midi_event_write(buffer, time, data, size);
jackbridge_midi_event_write(fBuffer, time, data, size);
} }


void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t* const data, const uint8_t size) void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t* const data, const uint8_t size)
@@ -304,15 +304,15 @@ public:
if (! m_port) if (! m_port)
return CarlaEngineEventPort::writeMidiEvent(time, channel, data, size); return CarlaEngineEventPort::writeMidiEvent(time, channel, data, size);


if (isInput)
if (kIsInput)
return; return;


CARLA_ASSERT(buffer);
CARLA_ASSERT(fBuffer);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS); CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
CARLA_ASSERT(data); CARLA_ASSERT(data);
CARLA_ASSERT(size > 0); CARLA_ASSERT(size > 0);


if (! buffer)
if (! fBuffer)
return; return;
if (channel >= MAX_MIDI_CHANNELS) if (channel >= MAX_MIDI_CHANNELS)
return; return;
@@ -324,12 +324,14 @@ public:


jdata[0] = data[0] + channel; jdata[0] = data[0] + channel;


jackbridge_midi_event_write(buffer, time, jdata, size);
jackbridge_midi_event_write(fBuffer, time, jdata, size);
} }


private: private:
void* fBuffer;

jack_client_t* const m_client; jack_client_t* const m_client;
jack_port_t* const m_port;
jack_port_t* const m_port;


EngineEvent m_retEvent; EngineEvent m_retEvent;


@@ -359,7 +361,7 @@ public:
{ {
qDebug("CarlaEngineClient::~CarlaEngineClient()"); qDebug("CarlaEngineClient::~CarlaEngineClient()");


if (processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
if (m_client) if (m_client)
jackbridge_client_close(m_client); jackbridge_client_close(m_client);
@@ -370,7 +372,7 @@ public:
{ {
qDebug("CarlaEngineClient::activate()"); qDebug("CarlaEngineClient::activate()");


if (processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_ASSERT(m_client && ! isActive()); CARLA_ASSERT(m_client && ! isActive());


@@ -385,7 +387,7 @@ public:
{ {
qDebug("CarlaEngineClient::deactivate()"); qDebug("CarlaEngineClient::deactivate()");


if (processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_ASSERT(m_client && isActive()); CARLA_ASSERT(m_client && isActive());


@@ -425,12 +427,12 @@ public:
{ {
switch (portType) switch (portType)
{ {
case EnginePortTypeNull:
case kEnginePortTypeNull:
break; break;
case EnginePortTypeAudio:
case kEnginePortTypeAudio:
port = jackbridge_port_register(m_client, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); port = jackbridge_port_register(m_client, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break; break;
case EnginePortTypeEvent:
case kEnginePortTypeEvent:
port = jackbridge_port_register(m_client, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); port = jackbridge_port_register(m_client, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break; break;
} }
@@ -439,12 +441,12 @@ public:
// Create Engine port // Create Engine port
switch (portType) switch (portType)
{ {
case EnginePortTypeNull:
case kEnginePortTypeNull:
break; break;
case EnginePortTypeAudio:
return new CarlaEngineJackAudioPort(isInput, processMode, m_client, port);
case EnginePortTypeEvent:
return new CarlaEngineJackEventPort(isInput, processMode, m_client, port);
case kEnginePortTypeAudio:
return new CarlaEngineJackAudioPort(isInput, kProcessMode, m_client, port);
case kEnginePortTypeEvent:
return new CarlaEngineJackEventPort(isInput, kProcessMode, m_client, port);
} }


qCritical("CarlaJackEngineClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput)); qCritical("CarlaJackEngineClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
@@ -467,7 +469,7 @@ public:
CarlaEngineJack() CarlaEngineJack()
: CarlaEngine() : CarlaEngine()
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
, m_rackPorts{nullptr}
, fRackPorts{nullptr}
#endif #endif
{ {
qDebug("CarlaEngineJack::CarlaEngineJack()"); qDebug("CarlaEngineJack::CarlaEngineJack()");
@@ -492,22 +494,22 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Maximum values // Maximum values


int maxClientNameSize()
unsigned int maxClientNameSize()
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (options.processMode == PROCESS_MODE_SINGLE_CLIENT || options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
#endif #endif
return jackbridge_client_name_size() - 3; // reserve space for "_2" forced-stereo ports
return (unsigned int)jackbridge_client_name_size() - 3; // reserve space for "_2" forced-stereo ports


return CarlaEngine::maxClientNameSize(); return CarlaEngine::maxClientNameSize();
} }


int maxPortNameSize()
unsigned int maxPortNameSize()
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (options.processMode == PROCESS_MODE_SINGLE_CLIENT || options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
#endif #endif
return jackbridge_port_name_size();
return (unsigned int)jackbridge_port_name_size();


return CarlaEngine::maxPortNameSize(); return CarlaEngine::maxPortNameSize();
} }
@@ -527,8 +529,8 @@ public:


if (m_client) if (m_client)
{ {
bufferSize = jackbridge_get_buffer_size(m_client);
sampleRate = jackbridge_get_sample_rate(m_client);
fBufferSize = jackbridge_get_buffer_size(m_client);
fSampleRate = jackbridge_get_sample_rate(m_client);


jackbridge_set_buffer_size_callback(m_client, carla_jack_bufsize_callback, this); jackbridge_set_buffer_size_callback(m_client, carla_jack_bufsize_callback, this);
jackbridge_set_sample_rate_callback(m_client, carla_jack_srate_callback, this); jackbridge_set_sample_rate_callback(m_client, carla_jack_srate_callback, this);
@@ -537,22 +539,22 @@ public:
jackbridge_set_latency_callback(m_client, carla_jack_latency_callback, this); jackbridge_set_latency_callback(m_client, carla_jack_latency_callback, this);
jackbridge_on_shutdown(m_client, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(m_client, carla_jack_shutdown_callback, this);


if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
{ {
m_rackPorts[rackPortAudioIn1] = jackbridge_port_register(m_client, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
m_rackPorts[rackPortAudioIn2] = jackbridge_port_register(m_client, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
m_rackPorts[rackPortAudioOut1] = jackbridge_port_register(m_client, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
m_rackPorts[rackPortAudioOut2] = jackbridge_port_register(m_client, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
m_rackPorts[rackPortEventIn] = jackbridge_port_register(m_client, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
m_rackPorts[rackPortEventOut] = jackbridge_port_register(m_client, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
fRackPorts[rackPortAudioIn1] = jackbridge_port_register(m_client, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
fRackPorts[rackPortAudioIn2] = jackbridge_port_register(m_client, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
fRackPorts[rackPortAudioOut1] = jackbridge_port_register(m_client, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
fRackPorts[rackPortAudioOut2] = jackbridge_port_register(m_client, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
fRackPorts[rackPortEventIn] = jackbridge_port_register(m_client, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
fRackPorts[rackPortEventOut] = jackbridge_port_register(m_client, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
} }


if (jackbridge_activate(m_client) == 0) if (jackbridge_activate(m_client) == 0)
{ {
name = jackbridge_get_client_name(m_client);
name.toBasic();
fName = jackbridge_get_client_name(m_client);
fName.toBasic();


CarlaEngine::init(name);
CarlaEngine::init(fName);
return true; return true;
} }
else else
@@ -601,14 +603,14 @@ public:
#else #else
if (jackbridge_deactivate(m_client) == 0) if (jackbridge_deactivate(m_client) == 0)
{ {
if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
{ {
jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioIn1]);
jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioIn2]);
jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioOut1]);
jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioOut2]);
jackbridge_port_unregister(m_client, m_rackPorts[rackPortEventIn]);
jackbridge_port_unregister(m_client, m_rackPorts[rackPortEventOut]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortAudioIn1]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortAudioIn2]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortAudioOut1]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortAudioOut2]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortEventIn]);
jackbridge_port_unregister(m_client, fRackPorts[rackPortEventOut]);
} }


if (jackbridge_client_close(m_client) == 0) if (jackbridge_client_close(m_client) == 0)
@@ -643,7 +645,7 @@ public:


EngineType type() const EngineType type() const
{ {
return EngineTypeJack;
return kEngineTypeJack;
} }


CarlaEngineClient* addClient(CarlaPlugin* const plugin) CarlaEngineClient* addClient(CarlaPlugin* const plugin)
@@ -663,11 +665,11 @@ public:
jackbridge_set_latency_callback(client, carla_jack_latency_callback, this); jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
#else #else
if (options.processMode == PROCESS_MODE_SINGLE_CLIENT)
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
{ {
client = m_client; client = m_client;
} }
else if (options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr); client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin); jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
@@ -676,9 +678,9 @@ public:
#endif #endif


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
return new CarlaEngineJackClient(EngineTypeJack, PROCESS_MODE_MULTIPLE_CLIENTS, client);
return new CarlaEngineJackClient(kEngineTypeJack, PROCESS_MODE_MULTIPLE_CLIENTS, client);
#else #else
return new CarlaEngineJackClient(EngineTypeJack, options.processMode, client);
return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client);
#endif #endif
} }


@@ -687,10 +689,10 @@ public:
protected: protected:
void handleJackBufferSizeCallback(const uint32_t newBufferSize) void handleJackBufferSizeCallback(const uint32_t newBufferSize)
{ {
bufferSize = newBufferSize;
fBufferSize = newBufferSize;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (options.processHighPrecision)
if (fOptions.processHighPrecision)
return; return;
#endif #endif


@@ -699,7 +701,7 @@ protected:


void handleJackSampleRateCallback(const double newSampleRate) void handleJackSampleRateCallback(const double newSampleRate)
{ {
sampleRate = newSampleRate;
fSampleRate = newSampleRate;
} }


void handleJackFreewheelCallback(const bool isFreewheel) void handleJackFreewheelCallback(const bool isFreewheel)
@@ -717,32 +719,32 @@ protected:
m_pos.unique_1 = m_pos.unique_2 + 1; // invalidate m_pos.unique_1 = m_pos.unique_2 + 1; // invalidate
m_state = jackbridge_transport_query(m_client, &m_pos); m_state = jackbridge_transport_query(m_client, &m_pos);


timeInfo.playing = (m_state != JackTransportStopped);
fTimeInfo.playing = (m_state != JackTransportStopped);


if (m_pos.unique_1 == m_pos.unique_2) if (m_pos.unique_1 == m_pos.unique_2)
{ {
timeInfo.frame = m_pos.frame;
timeInfo.time = m_pos.usecs;
fTimeInfo.frame = m_pos.frame;
fTimeInfo.time = m_pos.usecs;


if (m_pos.valid & JackPositionBBT) if (m_pos.valid & JackPositionBBT)
{ {
timeInfo.valid = timeInfo.ValidBBT;
timeInfo.bbt.bar = m_pos.bar;
timeInfo.bbt.beat = m_pos.beat;
timeInfo.bbt.tick = m_pos.tick;
timeInfo.bbt.barStartTick = m_pos.bar_start_tick;
timeInfo.bbt.beatsPerBar = m_pos.beats_per_bar;
timeInfo.bbt.beatType = m_pos.beat_type;
timeInfo.bbt.ticksPerBeat = m_pos.ticks_per_beat;
timeInfo.bbt.beatsPerMinute = m_pos.beats_per_minute;
fTimeInfo.valid = EngineTimeInfo::ValidBBT;
fTimeInfo.bbt.bar = m_pos.bar;
fTimeInfo.bbt.beat = m_pos.beat;
fTimeInfo.bbt.tick = m_pos.tick;
fTimeInfo.bbt.barStartTick = m_pos.bar_start_tick;
fTimeInfo.bbt.beatsPerBar = m_pos.beats_per_bar;
fTimeInfo.bbt.beatType = m_pos.beat_type;
fTimeInfo.bbt.ticksPerBeat = m_pos.ticks_per_beat;
fTimeInfo.bbt.beatsPerMinute = m_pos.beats_per_minute;
} }
else else
timeInfo.valid = 0;
fTimeInfo.valid = 0;
} }
else else
{ {
timeInfo.frame = 0;
timeInfo.valid = 0;
fTimeInfo.frame = 0;
fTimeInfo.valid = 0;
} }


#if 0 #if 0
@@ -940,7 +942,7 @@ protected:
void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (options.processMode != PROCESS_MODE_SINGLE_CLIENT)
if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
return; return;
#endif #endif


@@ -992,7 +994,7 @@ private:
rackPortCount = 8 rackPortCount = 8
}; };


jack_port_t* m_rackPorts[rackPortCount];
jack_port_t* fRackPorts[rackPortCount];
#endif #endif


// ------------------------------------- // -------------------------------------
@@ -1119,10 +1121,10 @@ private:


if (plugin && plugin->enabled()) if (plugin && plugin->enabled())
{ {
plugin->engineProcessLock();
//plugin->engineProcessLock();
plugin->initBuffers(); plugin->initBuffers();
processPlugin(plugin, nframes); processPlugin(plugin, nframes);
plugin->engineProcessUnlock();
//plugin->engineProcessUnlock();
} }


return 0; return 0;


+ 21
- 21
source/backend/engine/rtaudio.cpp View File

@@ -53,12 +53,12 @@ public:


switch (portType) switch (portType)
{ {
case EnginePortTypeNull:
case kEnginePortTypeNull:
break; break;
case EnginePortTypeAudio:
return new CarlaEngineAudioPort(isInput, processMode);
case EnginePortTypeEvent:
return new CarlaEngineEventPort(isInput, processMode);
case kEnginePortTypeAudio:
return new CarlaEngineAudioPort(isInput, kProcessMode);
case kEnginePortTypeEvent:
return new CarlaEngineEventPort(isInput, kProcessMode);
} }


qCritical("CarlaEngineRtAudioClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput)); qCritical("CarlaEngineRtAudioClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
@@ -91,8 +91,8 @@ public:
m_outBuf2 = nullptr; m_outBuf2 = nullptr;


// just to make sure // just to make sure
options.forceStereo = true;
options.processMode = PROCESS_MODE_CONTINUOUS_RACK;
fOptions.forceStereo = true;
fOptions.processMode = PROCESS_MODE_CONTINUOUS_RACK;
} }


~CarlaEngineRtAudio() ~CarlaEngineRtAudio()
@@ -112,8 +112,8 @@ public:
return false; return false;
} }


bufferSize = options.preferredBufferSize;
sampleRate = options.preferredSampleRate;
fBufferSize = fOptions.preferredBufferSize;
fSampleRate = fOptions.preferredSampleRate;


RtAudio::StreamParameters iParams, oParams; RtAudio::StreamParameters iParams, oParams;
iParams.deviceId = audio.getDefaultInputDevice(); iParams.deviceId = audio.getDefaultInputDevice();
@@ -139,7 +139,7 @@ public:
m_audioInterleaved = true; m_audioInterleaved = true;


try { try {
audio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, sampleRate, &bufferSize, carla_rtaudio_process_callback, this, &rtOptions);
audio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, fSampleRate, &fBufferSize, carla_rtaudio_process_callback, this, &rtOptions);
} }
catch (RtError& e) catch (RtError& e)
{ {
@@ -156,12 +156,12 @@ public:
return false; return false;
} }


sampleRate = audio.getStreamSampleRate();
fSampleRate = audio.getStreamSampleRate();


m_inBuf1 = new float [bufferSize];
m_inBuf2 = new float [bufferSize];
m_outBuf1 = new float [bufferSize];
m_outBuf2 = new float [bufferSize];
m_inBuf1 = new float[fBufferSize];
m_inBuf2 = new float[fBufferSize];
m_outBuf1 = new float[fBufferSize];
m_outBuf2 = new float[fBufferSize];


//midiIn = new MidiInAlsa(clientName, 512); //midiIn = new MidiInAlsa(clientName, 512);
//midiIn->openVirtualPort("control-in"); //midiIn->openVirtualPort("control-in");
@@ -171,10 +171,10 @@ public:
//midiOut->openVirtualPort("control-out"); //midiOut->openVirtualPort("control-out");
//midiOut->openVirtualPort("midi-out"); //midiOut->openVirtualPort("midi-out");


name = clientName;
name.toBasic();
fName = clientName;
fName.toBasic();


CarlaEngine::init(name);
CarlaEngine::init(fName);
return true; return true;
} }


@@ -245,12 +245,12 @@ public:


EngineType type() const EngineType type() const
{ {
return EngineTypeRtAudio;
return kEngineTypeRtAudio;
} }


CarlaEngineClient* addClient(CarlaPlugin* const) CarlaEngineClient* addClient(CarlaPlugin* const)
{ {
return new CarlaEngineRtAudioClient(EngineTypeRtAudio, options.processMode);
return new CarlaEngineRtAudioClient(kEngineTypeRtAudio, fOptions.processMode);
} }


// ------------------------------------- // -------------------------------------
@@ -294,7 +294,7 @@ protected:
float* outBuf[2] = { m_outBuf1, m_outBuf2 }; float* outBuf[2] = { m_outBuf1, m_outBuf2 };


// initialize events input // initialize events input
memset(rackEventsIn, 0, sizeof(EngineEvent)*MAX_EVENTS);
//memset(rackEventsIn, 0, sizeof(EngineEvent)*MAX_EVENTS);
{ {
// TODO // TODO
} }


+ 8
- 8
source/backend/native/3bandeq/DistrhoPlugin3BandEQ.cpp View File

@@ -166,17 +166,17 @@ void DistrhoPlugin3BandEQ::d_setParameterValue(uint32_t index, float value)
outVol = std::exp( (fMaster/48.0f) * 48 / cfAMP_DB); outVol = std::exp( (fMaster/48.0f) * 48 / cfAMP_DB);
break; break;
case paramLowMidFreq: case paramLowMidFreq:
fLowMidFreq = std::min<float>(value, fMidHighFreq);
fLowMidFreq = std::fmin(value, fMidHighFreq);
freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f); freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f);
xLP = std::exp(-2.0 * cfPI * freqLP / d_sampleRate());
a0LP = 1.0 - xLP;
xLP = std::exp(-2.0f * cfPI * freqLP / (float)d_sampleRate());
a0LP = 1.0f - xLP;
b1LP = -xLP; b1LP = -xLP;
break; break;
case paramMidHighFreq: case paramMidHighFreq:
fMidHighFreq = std::max<float>(value, fLowMidFreq);
fMidHighFreq = std::fmax(value, fLowMidFreq);
freqHP = fMidHighFreq; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f); freqHP = fMidHighFreq; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f);
xHP = std::exp(-2.0 * cfPI * freqHP / d_sampleRate());
a0HP = 1.0 - xHP;
xHP = std::exp(-2.0f * cfPI * freqHP / (float)d_sampleRate());
a0HP = 1.0f - xHP;
b1HP = -xHP; b1HP = -xHP;
break; break;
} }
@@ -209,11 +209,11 @@ void DistrhoPlugin3BandEQ::d_setProgram(uint32_t index)
void DistrhoPlugin3BandEQ::d_activate() void DistrhoPlugin3BandEQ::d_activate()
{ {
xLP = std::exp(-2.0 * cfPI * freqLP / d_sampleRate());
xLP = std::exp(-2.0f * cfPI * freqLP / (float)d_sampleRate());
a0LP = 1.0f - xLP; a0LP = 1.0f - xLP;
b1LP = -xLP; b1LP = -xLP;
xHP = std::exp(-2.0 * cfPI * freqHP / d_sampleRate());
xHP = std::exp(-2.0f * cfPI * freqHP / (float)d_sampleRate());
a0HP = 1.0f - xHP; a0HP = 1.0f - xHP;
b1HP = -xHP; b1HP = -xHP;
} }


+ 4
- 4
source/backend/native/3bandeq/DistrhoUI3BandEQ.hpp View File

@@ -36,14 +36,14 @@ public:
protected: protected:


// Information // Information
unsigned int d_width()
int d_width()
{ {
return DistrhoArtwork3BandEQ::backgroundWidth;
return (int)DistrhoArtwork3BandEQ::backgroundWidth;
} }


unsigned int d_height()
int d_height()
{ {
return DistrhoArtwork3BandEQ::backgroundHeight;
return (int)DistrhoArtwork3BandEQ::backgroundHeight;
} }


// DSP Callbacks // DSP Callbacks


+ 8
- 8
source/backend/native/3bandsplitter/DistrhoPlugin3BandSplitter.cpp View File

@@ -166,17 +166,17 @@ void DistrhoPlugin3BandSplitter::d_setParameterValue(uint32_t index, float value
outVol = std::exp( (fMaster/48.0f) * 48 / cfAMP_DB); outVol = std::exp( (fMaster/48.0f) * 48 / cfAMP_DB);
break; break;
case paramLowMidFreq: case paramLowMidFreq:
fLowMidFreq = std::min<float>(value, fMidHighFreq);
fLowMidFreq = std::fmin(value, fMidHighFreq);
freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f); freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f);
xLP = std::exp(-2.0 * cfPI * freqLP / d_sampleRate());
a0LP = 1.0 - xLP;
xLP = std::exp(-2.0f * cfPI * freqLP / (float)d_sampleRate());
a0LP = 1.0f - xLP;
b1LP = -xLP; b1LP = -xLP;
break; break;
case paramMidHighFreq: case paramMidHighFreq:
fMidHighFreq = std::max<float>(value, fLowMidFreq);
fMidHighFreq = std::fmax(value, fLowMidFreq);
freqHP = fMidHighFreq; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f); freqHP = fMidHighFreq; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f);
xHP = std::exp(-2.0 * cfPI * freqHP / d_sampleRate());
a0HP = 1.0 - xHP;
xHP = std::exp(-2.0f * cfPI * freqHP / (float)d_sampleRate());
a0HP = 1.0f - xHP;
b1HP = -xHP; b1HP = -xHP;
break; break;
} }
@@ -209,11 +209,11 @@ void DistrhoPlugin3BandSplitter::d_setProgram(uint32_t index)
void DistrhoPlugin3BandSplitter::d_activate() void DistrhoPlugin3BandSplitter::d_activate()
{ {
xLP = std::exp(-2.0 * cfPI * freqLP / d_sampleRate());
xLP = std::exp(-2.0f * cfPI * freqLP / (float)d_sampleRate());
a0LP = 1.0f - xLP; a0LP = 1.0f - xLP;
b1LP = -xLP; b1LP = -xLP;
xHP = std::exp(-2.0 * cfPI * freqHP / d_sampleRate());
xHP = std::exp(-2.0f * cfPI * freqHP / (float)d_sampleRate());
a0HP = 1.0f - xHP; a0HP = 1.0f - xHP;
b1HP = -xHP; b1HP = -xHP;
} }


+ 2
- 2
source/backend/native/3bandsplitter/DistrhoUI3BandSplitter.hpp View File

@@ -36,12 +36,12 @@ public:
protected: protected:


// Information // Information
unsigned int d_width()
int d_width()
{ {
return DistrhoArtwork3BandSplitter::backgroundWidth; return DistrhoArtwork3BandSplitter::backgroundWidth;
} }


unsigned int d_height()
int d_height()
{ {
return DistrhoArtwork3BandSplitter::backgroundHeight; return DistrhoArtwork3BandSplitter::backgroundHeight;
} }


+ 5
- 5
source/backend/native/bypass.c View File

@@ -2,17 +2,17 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_native.h" #include "carla_native.h"


+ 6
- 6
source/backend/native/distrho-3bandeq.cpp View File

@@ -2,17 +2,17 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_native.hpp" #include "carla_native.hpp"
@@ -29,7 +29,7 @@ START_NAMESPACE_DISTRHO


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


static PluginDescriptor tBandEqDesc = {
static const PluginDescriptor tBandEqDesc = {
/* category */ ::PLUGIN_CATEGORY_EQ, /* category */ ::PLUGIN_CATEGORY_EQ,
/* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE | ::PLUGIN_HAS_GUI), /* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE | ::PLUGIN_HAS_GUI),
/* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS,


+ 6
- 6
source/backend/native/distrho-3bandsplitter.cpp View File

@@ -2,17 +2,17 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_native.hpp" #include "carla_native.hpp"
@@ -29,7 +29,7 @@ START_NAMESPACE_DISTRHO


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


static PluginDescriptor tBandSplitterDesc = {
static const PluginDescriptor tBandSplitterDesc = {
/* category */ ::PLUGIN_CATEGORY_EQ, /* category */ ::PLUGIN_CATEGORY_EQ,
/* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE | ::PLUGIN_HAS_GUI), /* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE | ::PLUGIN_HAS_GUI),
/* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS,


+ 5
- 5
source/backend/native/distrho-pingpongpan.cpp View File

@@ -2,17 +2,17 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_native.hpp" #include "carla_native.hpp"


+ 2
- 3
source/backend/native/distrho/DistrhoPluginCarla.cpp View File

@@ -46,7 +46,6 @@ public:
setCentralWidget(&widget); setCentralWidget(&widget);
setFixedSize(ui.getWidth(), ui.getHeight()); setFixedSize(ui.getWidth(), ui.getHeight());
setWindowTitle(DISTRHO_PLUGIN_NAME); setWindowTitle(DISTRHO_PLUGIN_NAME);

} }


~UICarla() ~UICarla()
@@ -111,7 +110,7 @@ protected:
} }
# endif # endif


void uiResize(unsigned int width, unsigned int height)
void uiResize(int width, int height)
{ {
setFixedSize(width, height); setFixedSize(width, height);
} }
@@ -182,7 +181,7 @@ private:
# endif # endif
} }


static void uiResizeCallback(void* ptr, unsigned int width, unsigned int height)
static void uiResizeCallback(void* ptr, int width, int height)
{ {
if (UICarla* _this_ = (UICarla*)ptr) if (UICarla* _this_ = (UICarla*)ptr)
_this_->uiResize(width, height); _this_->uiResize(width, height);


+ 6
- 6
source/backend/native/midi-split.c View File

@@ -2,21 +2,21 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_midi.h"
#include "carla_native.h" #include "carla_native.h"
#include "carla_midi.h"


#include <stdlib.h> #include <stdlib.h>




+ 6
- 6
source/backend/native/midi-through.c View File

@@ -2,21 +2,21 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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_midi.h"
#include "carla_native.h" #include "carla_native.h"
#include "carla_midi.h"


#include <stdlib.h> #include <stdlib.h>




+ 3
- 3
source/backend/native/pingpongpan/DistrhoPluginPingPongPan.cpp View File

@@ -100,7 +100,7 @@ void DistrhoPluginPingPongPan::d_setParameterValue(uint32_t index, float value)
{ {
case paramFreq: case paramFreq:
fFreq = value; fFreq = value;
waveSpeed = (cf2PI * fFreq / 100.0f)/d_sampleRate();
waveSpeed = (cf2PI * fFreq / 100.0f)/(float)d_sampleRate();
break; break;
case paramWidth: case paramWidth:
fWidth = value; fWidth = value;
@@ -126,7 +126,7 @@ void DistrhoPluginPingPongPan::d_setProgram(uint32_t index)
void DistrhoPluginPingPongPan::d_activate() void DistrhoPluginPingPongPan::d_activate()
{ {
waveSpeed = (cf2PI * fFreq / 100.0f)/d_sampleRate();
waveSpeed = (cf2PI * fFreq / 100.0f)/(float)d_sampleRate();
} }
void DistrhoPluginPingPongPan::d_deactivate() void DistrhoPluginPingPongPan::d_deactivate()
@@ -143,7 +143,7 @@ void DistrhoPluginPingPongPan::d_run(float** inputs, float** outputs, uint32_t f
for (uint32_t i=0; i < frames; i++) for (uint32_t i=0; i < frames; i++)
{ {
pan = std::min<float>(std::max<float>(sin(wavePos) * (fWidth/100.0f), -1.0f), 1.0f);
pan = std::fmin(std::fmax(std::sin(wavePos) * (fWidth/100.0f), -1.0f), 1.0f);
if ((wavePos += waveSpeed) >= cf2PI) if ((wavePos += waveSpeed) >= cf2PI)
wavePos -= cf2PI; wavePos -= cf2PI;


+ 2
- 2
source/backend/native/pingpongpan/DistrhoUIPingPongPan.hpp View File

@@ -36,12 +36,12 @@ public:
protected: protected:


// Information // Information
unsigned int d_width()
int d_width()
{ {
return DistrhoArtworkPingPongPan::backgroundWidth; return DistrhoArtworkPingPongPan::backgroundWidth;
} }


unsigned int d_height()
int d_height()
{ {
return DistrhoArtworkPingPongPan::backgroundHeight; return DistrhoArtworkPingPongPan::backgroundHeight;
} }


+ 6
- 6
source/backend/native/zynaddsubfx.cpp View File

@@ -2,25 +2,25 @@
* Carla Native Plugins * Carla Native Plugins
* 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 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
*/ */


// for UINT32_MAX // for UINT32_MAX
#define __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS
#include <cstdint> #include <cstdint>


#include "carla_midi.h"
#include "carla_native.hpp" #include "carla_native.hpp"
#include "carla_midi.h"


#include "zynaddsubfx/Misc/Master.h" #include "zynaddsubfx/Misc/Master.h"
#include "zynaddsubfx/Misc/Util.h" #include "zynaddsubfx/Misc/Util.h"


+ 7
- 5
source/includes/carla_midi.h View File

@@ -2,23 +2,25 @@
* Carla common MIDI code * Carla common MIDI code
* 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 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 __CARLA_MIDI_H__ #ifndef __CARLA_MIDI_H__
#define __CARLA_MIDI_H__ #define __CARLA_MIDI_H__


#define MAX_MIDI_CHANNELS 16 #define MAX_MIDI_CHANNELS 16
#define MAX_MIDI_NOTE 128
#define MAX_MIDI_VALUE 128


// MIDI Messages List // MIDI Messages List
#define MIDI_STATUS_NOTE_OFF 0x80 // note (0-127), velocity (0-127) #define MIDI_STATUS_NOTE_OFF 0x80 // note (0-127), velocity (0-127)


+ 1
- 1
source/libs/distrho-plugin-toolkit/DistrhoPlugin.h View File

@@ -69,7 +69,7 @@ struct ParameterRanges {
this->stepLarge = stepLarge; this->stepLarge = stepLarge;
} }


void fixRange(float& value) const
void fixValue(float& value) const
{ {
if (value < min) if (value < min)
value = min; value = min;


+ 3
- 3
source/libs/distrho-plugin-toolkit/DistrhoUI.h View File

@@ -45,14 +45,14 @@ public:
#if DISTRHO_PLUGIN_IS_SYNTH #if DISTRHO_PLUGIN_IS_SYNTH
void d_uiSendNote(bool onOff, uint8_t channel, uint8_t note, uint8_t velocity); void d_uiSendNote(bool onOff, uint8_t channel, uint8_t note, uint8_t velocity);
#endif #endif
void d_uiResize(unsigned int width, unsigned int height);
void d_uiResize(int width, int height);


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


protected: protected:
// Information // Information
virtual unsigned int d_width() = 0;
virtual unsigned int d_height() = 0;
virtual int d_width() = 0;
virtual int d_height() = 0;


// DSP Callbacks // DSP Callbacks
virtual void d_parameterChanged(uint32_t index, float value) = 0; virtual void d_parameterChanged(uint32_t index, float value) = 0;


+ 3
- 3
source/libs/distrho-plugin-toolkit/DistrhoUIOpenGL.h View File

@@ -17,7 +17,7 @@
#ifndef __DISTRHO_UI_OPENGL_H__ #ifndef __DISTRHO_UI_OPENGL_H__
#define __DISTRHO_UI_OPENGL_H__ #define __DISTRHO_UI_OPENGL_H__


#include "src/DistrhoDefines.h"
#include "src/DistrhoMacros.h"


#ifdef DISTRHO_UI_OPENGL #ifdef DISTRHO_UI_OPENGL


@@ -101,8 +101,8 @@ public:


protected: protected:
// Information // Information
virtual unsigned int d_width() = 0;
virtual unsigned int d_height() = 0;
virtual int d_width() = 0;
virtual int d_height() = 0;


// DSP Callbacks // DSP Callbacks
virtual void d_parameterChanged(uint32_t index, float value) = 0; virtual void d_parameterChanged(uint32_t index, float value) = 0;


+ 3
- 3
source/libs/distrho-plugin-toolkit/DistrhoUIOpenGLExt.h View File

@@ -17,7 +17,7 @@
#ifndef __DISTRHO_UI_OPENGL_EXT_H__ #ifndef __DISTRHO_UI_OPENGL_EXT_H__
#define __DISTRHO_UI_OPENGL_EXT_H__ #define __DISTRHO_UI_OPENGL_EXT_H__


#include "src/DistrhoDefines.h"
#include "src/DistrhoMacros.h"


#ifdef DISTRHO_UI_OPENGL #ifdef DISTRHO_UI_OPENGL


@@ -249,8 +249,8 @@ public:


protected: protected:
// Information // Information
virtual unsigned int d_width() = 0;
virtual unsigned int d_height() = 0;
virtual int d_width() = 0;
virtual int d_height() = 0;


// DSP Callbacks // DSP Callbacks
virtual void d_parameterChanged(uint32_t index, float value) = 0; virtual void d_parameterChanged(uint32_t index, float value) = 0;


+ 1
- 1
source/libs/distrho-plugin-toolkit/DistrhoUtils.h View File

@@ -102,7 +102,7 @@ public:


d_string(int value) d_string(int value)
{ {
size_t strBufSize = abs(value/10) + 3;
size_t strBufSize = (unsigned int)abs(value/10) + 3;
char strBuf[strBufSize]; char strBuf[strBufSize];
snprintf(strBuf, strBufSize, "%d", value); snprintf(strBuf, strBufSize, "%d", value);




+ 1
- 1
source/libs/distrho-plugin-toolkit/src/DistrhoUI.cpp View File

@@ -81,7 +81,7 @@ void UI::d_uiSendNote(bool onOff, uint8_t channel, uint8_t note, uint8_t velocit
} }
#endif #endif


void UI::d_uiResize(unsigned int width, unsigned int height)
void UI::d_uiResize(int width, int height)
{ {
data->uiResizeCallback(width, height); data->uiResizeCallback(width, height);
} }


+ 4
- 4
source/libs/distrho-plugin-toolkit/src/DistrhoUIInternal.h View File

@@ -51,7 +51,7 @@ typedef void (*setParamFunc) (void* ptr, uint32_t index, float value);
typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); typedef void (*setStateFunc) (void* ptr, const char* key, const char* value);
typedef void (*uiEditParamFunc) (void* ptr, uint32_t index, bool started); typedef void (*uiEditParamFunc) (void* ptr, uint32_t index, bool started);
typedef void (*uiSendNoteFunc) (void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velo); typedef void (*uiSendNoteFunc) (void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velo);
typedef void (*uiResizeFunc) (void* ptr, unsigned int width, unsigned int height);
typedef void (*uiResizeFunc) (void* ptr, int width, int height);


extern double d_lastUiSampleRate; extern double d_lastUiSampleRate;


@@ -140,7 +140,7 @@ struct UIPrivateData {
uiSendNoteCallbackFunc(ptr, onOff, channel, note, velocity); uiSendNoteCallbackFunc(ptr, onOff, channel, note, velocity);
} }


void uiResizeCallback(unsigned int width, unsigned int height)
void uiResizeCallback(int width, int height)
{ {
if (uiResizeCallbackFunc) if (uiResizeCallbackFunc)
uiResizeCallbackFunc(ptr, width, height); uiResizeCallbackFunc(ptr, width, height);
@@ -201,13 +201,13 @@ public:
ui->d_uiIdle(); ui->d_uiIdle();
} }


unsigned int getWidth()
int getWidth()
{ {
assert(ui); assert(ui);
return ui ? ui->d_width() : 0; return ui ? ui->d_width() : 0;
} }


unsigned int getHeight()
int getHeight()
{ {
assert(ui); assert(ui);
return ui ? ui->d_height() : 0; return ui ? ui->d_height() : 0;


+ 1
- 1
source/libs/distrho-plugin-toolkit/src/DistrhoUIOpenGL.cpp View File

@@ -14,7 +14,7 @@
* For a full copy of the license see the LGPL.txt file * For a full copy of the license see the LGPL.txt file
*/ */


#include "DistrhoDefines.h"
#include "DistrhoMacros.h"


#ifdef DISTRHO_UI_OPENGL #ifdef DISTRHO_UI_OPENGL




+ 17
- 17
source/libs/distrho-plugin-toolkit/src/DistrhoUIOpenGLExt.cpp View File

@@ -14,7 +14,7 @@
* For a full copy of the license see the LGPL.txt file * For a full copy of the license see the LGPL.txt file
*/ */


#include "DistrhoDefines.h"
#include "DistrhoMacros.h"


#ifdef DISTRHO_UI_OPENGL #ifdef DISTRHO_UI_OPENGL


@@ -168,15 +168,15 @@ Size& Size::operator/=(int d)


Size& Size::operator*=(float m) Size& Size::operator*=(float m)
{ {
_width *= m;
_height *= m;
_width = (int)((float)_width * m);
_height = (int)((float)_height * m);
return *this; return *this;
} }


Size& Size::operator/=(float d) Size& Size::operator/=(float d)
{ {
_width /= d;
_height /= d;
_width = (int)((float)_width / d);
_height = (int)((float)_height / d);
return *this; return *this;
} }


@@ -729,7 +729,7 @@ public:
if (view) if (view)
{ {
#if DISTRHO_OS_LINUX #if DISTRHO_OS_LINUX
PuglInternals* impl = puglGetInternalsImpl(view);
PuglInternals* impl = puglGetInternalsImpl(view);
Display* display = impl->display; Display* display = impl->display;
Window window = impl->win; Window window = impl->win;
XRaiseWindow(display, window); XRaiseWindow(display, window);
@@ -1073,7 +1073,7 @@ void OpenGLExtUI::d_onDisplay()


int layerDataSize = knob->_layerSize * knob->_layerSize * 4; int layerDataSize = knob->_layerSize * knob->_layerSize * 4;
int imageDataSize = layerDataSize * knob->_layerCount; int imageDataSize = layerDataSize * knob->_layerCount;
int imageDataOffset = imageDataSize - layerDataSize - layerDataSize * rint(vper*(knob->_layerCount-1));
int imageDataOffset = imageDataSize - layerDataSize - layerDataSize * int(vper * float(knob->_layerCount-1));


glRasterPos2i(knob->_pos.getX(), knob->_pos.getY()+knob->_area.getHeight()); glRasterPos2i(knob->_pos.getX(), knob->_pos.getY()+knob->_area.getHeight());
glDrawPixels(knob->_layerSize, knob->_layerSize, knob->_image.getFormat(), knob->_image.getType(), knob->_image.getData() + imageDataOffset); glDrawPixels(knob->_layerSize, knob->_layerSize, knob->_image.getFormat(), knob->_image.getType(), knob->_image.getData() + imageDataOffset);
@@ -1093,10 +1093,10 @@ void OpenGLExtUI::d_onDisplay()


if (slider->_endPos.getX() > slider->_startPos.getX()) if (slider->_endPos.getX() > slider->_startPos.getX())
// horizontal // horizontal
x += rint(vper * (slider->_area.getWidth()-slider->getWidth()));
x += int(vper * float(slider->_area.getWidth() - slider->getWidth()));
else else
// vertical // vertical
y += slider->_area.getHeight() - rint(vper * (slider->_area.getHeight()-slider->getHeight()));
y += slider->_area.getHeight() - int(vper * float(slider->_area.getHeight() - slider->getHeight()));


#if 0 // DEBUG #if 0 // DEBUG
glColor3i(160, 90, 161); glColor3i(160, 90, 161);
@@ -1175,8 +1175,8 @@ void OpenGLExtUI::d_onMotion(int x, int y)


if (movX != 0) if (movX != 0)
{ {
int d = (d_uiGetModifiers() & MODIFIER_SHIFT) ? 2000 : 200;
float value = knob->_value + (knob->_max - knob->_min) / d * movX;
float d = (d_uiGetModifiers() & MODIFIER_SHIFT) ? 2000 : 200;
float value = knob->_value + float(knob->_max - knob->_min) / d * float(movX);


if (value < knob->_min) if (value < knob->_min)
value = knob->_min; value = knob->_min;
@@ -1198,8 +1198,8 @@ void OpenGLExtUI::d_onMotion(int x, int y)


if (movY != 0) if (movY != 0)
{ {
int d = (d_uiGetModifiers() & MODIFIER_SHIFT) ? 2000 : 200;
float value = knob->_value + (knob->_max - knob->_min) / d * movY;
float d = (d_uiGetModifiers() & MODIFIER_SHIFT) ? 2000 : 200;
float value = knob->_value + float(knob->_max - knob->_min) / d * float(movY);


if (value < knob->_min) if (value < knob->_min)
value = knob->_min; value = knob->_min;
@@ -1241,10 +1241,10 @@ void OpenGLExtUI::d_onMotion(int x, int y)


if (horizontal) if (horizontal)
// horizontal // horizontal
vper = float(x - slider->_area.getX()) / slider->_area.getWidth();
vper = float(x - slider->_area.getX()) / float(slider->_area.getWidth());
else else
// vertical // vertical
vper = float(y - slider->_area.getY()) / slider->_area.getHeight();
vper = float(y - slider->_area.getY()) / float(slider->_area.getHeight());


float value = slider->_max - vper * (slider->_max - slider->_min); float value = slider->_max - vper * (slider->_max - slider->_min);


@@ -1397,10 +1397,10 @@ void OpenGLExtUI::d_onMouse(int button, bool press, int x, int y)


if (slider->_endPos.getX() > slider->_startPos.getX()) if (slider->_endPos.getX() > slider->_startPos.getX())
// horizontal // horizontal
vper = float(x - slider->_area.getX()) / slider->_area.getWidth();
vper = float(x - slider->_area.getX()) / float(slider->_area.getWidth());
else else
// vertical // vertical
vper = float(y - slider->_area.getY()) / slider->_area.getHeight();
vper = float(y - slider->_area.getY()) / float(slider->_area.getHeight());


float value = slider->_max - vper * (slider->_max - slider->_min); float value = slider->_max - vper * (slider->_max - slider->_min);




+ 3
- 3
source/libs/pugl/pugl.h View File

@@ -122,7 +122,7 @@ typedef enum {
PUGL_KEY_SHIFT, PUGL_KEY_SHIFT,
PUGL_KEY_CTRL, PUGL_KEY_CTRL,
PUGL_KEY_ALT, PUGL_KEY_ALT,
PUGL_KEY_SUPER,
PUGL_KEY_SUPER
} PuglKey; } PuglKey;


/** /**
@@ -132,7 +132,7 @@ typedef enum {
PUGL_MOD_SHIFT = 1, /**< Shift key */ PUGL_MOD_SHIFT = 1, /**< Shift key */
PUGL_MOD_CTRL = 1 << 1, /**< Control key */ PUGL_MOD_CTRL = 1 << 1, /**< Control key */
PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */
PUGL_MOD_SUPER = 1 << 3, /**< Mod4/Command/Windows key */
PUGL_MOD_SUPER = 1 << 3 /**< Mod4/Command/Windows key */
} PuglMod; } PuglMod;


/** /**
@@ -225,7 +225,7 @@ puglCreate(PuglNativeWindow parent,
int height, int height,
bool resizable, bool resizable,
bool addToDesktop = true, bool addToDesktop = true,
const char* x11Display = NULL);
const char* x11Display = nullptr);


/** /**
Set the handle to be passed to all callbacks. Set the handle to be passed to all callbacks.


+ 14
- 14
source/libs/pugl/pugl_x11.c View File

@@ -64,7 +64,7 @@ puglCreate(PuglNativeWindow parent,
PuglView* view = (PuglView*)calloc(1, sizeof(PuglView)); PuglView* view = (PuglView*)calloc(1, sizeof(PuglView));
PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals)); PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals));
if (!view || !impl) { if (!view || !impl) {
return NULL;
return nullptr;
} }


view->impl = impl; view->impl = impl;
@@ -88,7 +88,7 @@ puglCreate(PuglNativeWindow parent,
glXQueryVersion(impl->display, &glxMajor, &glxMinor); glXQueryVersion(impl->display, &glxMajor, &glxMinor);
printf("GLX-Version %d.%d\n", glxMajor, glxMinor); printf("GLX-Version %d.%d\n", glxMajor, glxMinor);


impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE);
impl->ctx = glXCreateContext(impl->display, vi, nullptr, GL_TRUE);


Window xParent = parent Window xParent = parent
? (Window)parent ? (Window)parent
@@ -108,7 +108,7 @@ puglCreate(PuglNativeWindow parent,


impl->win = XCreateWindow( impl->win = XCreateWindow(
impl->display, xParent, impl->display, xParent,
0, 0, view->width, view->height, 0, vi->depth, InputOutput, vi->visual,
0, 0, (unsigned int)view->width, (unsigned int)view->height, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &attr); CWBorderPixel | CWColormap | CWEventMask, &attr);


XSizeHints sizeHints; XSizeHints sizeHints;
@@ -267,13 +267,13 @@ puglProcessEvents(PuglView* view)
view->redisplay = false; view->redisplay = false;
break; break;
case MotionNotify: case MotionNotify:
setModifiers(view, event.xmotion.state);
setModifiers(view, (int)event.xmotion.state);
if (view->motionFunc) { if (view->motionFunc) {
view->motionFunc(view, event.xmotion.x, event.xmotion.y); view->motionFunc(view, event.xmotion.x, event.xmotion.y);
} }
break; break;
case ButtonPress: case ButtonPress:
setModifiers(view, event.xbutton.state);
setModifiers(view, (int)event.xbutton.state);
if (event.xbutton.button >= 4 && event.xbutton.button <= 7) { if (event.xbutton.button >= 4 && event.xbutton.button <= 7) {
if (view->scrollFunc) { if (view->scrollFunc) {
float dx = 0, dy = 0; float dx = 0, dy = 0;
@@ -289,23 +289,23 @@ puglProcessEvents(PuglView* view)
} }
// nobreak // nobreak
case ButtonRelease: case ButtonRelease:
setModifiers(view, event.xbutton.state);
setModifiers(view, (int)event.xbutton.state);
if (view->mouseFunc && if (view->mouseFunc &&
(event.xbutton.button < 4 || event.xbutton.button > 7)) { (event.xbutton.button < 4 || event.xbutton.button > 7)) {
view->mouseFunc(view, view->mouseFunc(view,
event.xbutton.button, event.type == ButtonPress,
(int)event.xbutton.button, event.type == ButtonPress,
event.xbutton.x, event.xbutton.y); event.xbutton.x, event.xbutton.y);
} }
break; break;
case KeyPress: { case KeyPress: {
setModifiers(view, event.xkey.state);
setModifiers(view, (int)event.xkey.state);
KeySym sym; KeySym sym;
char str[5]; char str[5];
int n = XLookupString(&event.xkey, str, 4, &sym, NULL);
int n = XLookupString(&event.xkey, str, 4, &sym, nullptr);
PuglKey key = keySymToSpecial(sym); PuglKey key = keySymToSpecial(sym);
if (!key && view->keyboardFunc) { if (!key && view->keyboardFunc) {
if (n == 1) { if (n == 1) {
view->keyboardFunc(view, true, str[0]);
view->keyboardFunc(view, true, (uint32_t)str[0]);
} else { } else {
fprintf(stderr, "warning: Unknown key %X\n", (int)sym); fprintf(stderr, "warning: Unknown key %X\n", (int)sym);
} }
@@ -314,7 +314,7 @@ puglProcessEvents(PuglView* view)
} }
} break; } break;
case KeyRelease: { case KeyRelease: {
setModifiers(view, event.xkey.state);
setModifiers(view, (int)event.xkey.state);
bool repeated = false; bool repeated = false;
if (view->ignoreKeyRepeat && if (view->ignoreKeyRepeat &&
XEventsQueued(view->impl->display, QueuedAfterReading)) { XEventsQueued(view->impl->display, QueuedAfterReading)) {
@@ -330,10 +330,10 @@ puglProcessEvents(PuglView* view)


if (!repeated && view->keyboardFunc) { if (!repeated && view->keyboardFunc) {
KeySym sym = XKeycodeToKeysym( KeySym sym = XKeycodeToKeysym(
view->impl->display, event.xkey.keycode, 0);
view->impl->display, (KeyCode)event.xkey.keycode, 0);
PuglKey special = keySymToSpecial(sym); PuglKey special = keySymToSpecial(sym);
if (!special) { if (!special) {
view->keyboardFunc(view, false, sym);
view->keyboardFunc(view, false, (uint32_t)sym);
} else if (view->specialFunc) { } else if (view->specialFunc) {
view->specialFunc(view, false, special); view->specialFunc(view, false, special);
} }
@@ -369,7 +369,7 @@ puglPostRedisplay(PuglView* view)
PuglNativeWindow PuglNativeWindow
puglGetNativeWindow(PuglView* view) puglGetNativeWindow(PuglView* view)
{ {
return view->impl->win;
return static_cast<PuglNativeWindow>(view->impl->win);
} }


PuglInternals* PuglInternals*


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

@@ -152,6 +152,8 @@ const char* InternalParametersIndex2Str(const InternalParametersIndex& index)
return "PARAMETER_BALANCE_RIGHT"; return "PARAMETER_BALANCE_RIGHT";
case PARAMETER_PANNING: case PARAMETER_PANNING:
return "PARAMETER_PANNING"; return "PARAMETER_PANNING";
case PARAMETER_MAX:
return "PARAMETER_MAX";
} }


qWarning("CarlaBackend::InternalParametersIndex2Str(%i) - invalid index", index); qWarning("CarlaBackend::InternalParametersIndex2Str(%i) - invalid index", index);
@@ -300,7 +302,7 @@ const char* ProcessMode2Str(const ProcessMode& mode)
// ------------------------------------------------- // -------------------------------------------------


static inline static inline
uintptr_t getAddressFromPointer(void* const ptr)
uintptr_t getAddressFromPointer(void* ptr)
{ {
qDebug("CarlaBackend::getAddressFromPointer(%p)", ptr); qDebug("CarlaBackend::getAddressFromPointer(%p)", ptr);
CARLA_ASSERT(ptr != nullptr); CARLA_ASSERT(ptr != nullptr);
@@ -310,7 +312,7 @@ uintptr_t getAddressFromPointer(void* const ptr)
} }


static inline static inline
void* getPointerFromAddress(const uintptr_t& addr)
void* getPointerFromAddress(uintptr_t& addr)
{ {
CARLA_ASSERT(addr != 0); CARLA_ASSERT(addr != 0);




+ 8
- 9
source/utils/carla_osc_utils.hpp View File

@@ -2,17 +2,17 @@
* Carla OSC utils * Carla OSC utils
* 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 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 __CARLA_OSC_UTILS_HPP__ #ifndef __CARLA_OSC_UTILS_HPP__
@@ -42,14 +42,13 @@ struct CarlaOscData {


void free() void free()
{ {
if (path)
::free((void*)path);
std::free((void*)path);


if (source) if (source)
::lo_address_free(source);
lo_address_free(source);


if (target) if (target)
::lo_address_free(target);
lo_address_free(target);


path = nullptr; path = nullptr;
source = nullptr; source = nullptr;


+ 130
- 99
source/utils/carla_utils.hpp View File

@@ -2,17 +2,17 @@
* Carla common utils * Carla common utils
* 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 __CARLA_UTILS_HPP__ #ifndef __CARLA_UTILS_HPP__
@@ -103,8 +103,8 @@ void carla_usleep(const unsigned int usecs)
static inline static inline
void carla_setenv(const char* const key, const char* const value) void carla_setenv(const char* const key, const char* const value)
{ {
CARLA_ASSERT(key);
CARLA_ASSERT(value);
CARLA_ASSERT(key != nullptr);
CARLA_ASSERT(value != nullptr);


#ifdef Q_OS_WIN #ifdef Q_OS_WIN
SetEnvironmentVariableA(key, value); SetEnvironmentVariableA(key, value);
@@ -119,7 +119,7 @@ void carla_setenv(const char* const key, const char* const value)
static inline static inline
void carla_setprocname(const char* const name) void carla_setprocname(const char* const name)
{ {
CARLA_ASSERT(name);
CARLA_ASSERT(name != nullptr);


#if defined(Q_OS_HAIKU) #if defined(Q_OS_HAIKU)
if ((thread_id this_thread = find_thread(nullptr)) != B_NAME_NOT_FOUND) if ((thread_id this_thread = find_thread(nullptr)) != B_NAME_NOT_FOUND)
@@ -145,9 +145,12 @@ template<typename T>
static inline static inline
void carla_fill(T* data, const unsigned int size, const T v) void carla_fill(T* data, const unsigned int size, const T v)
{ {
CARLA_ASSERT(data);
CARLA_ASSERT(data != nullptr);
CARLA_ASSERT(size > 0); CARLA_ASSERT(size > 0);


if (data == nullptr)
return;

for (unsigned int i=0; i < size; i++) for (unsigned int i=0; i < size; i++)
*data++ = v; *data++ = v;
} }
@@ -170,7 +173,10 @@ void carla_zeroFloat(float* data, const unsigned size)
static inline static inline
void carla_zeroMem(void* const memory, const size_t numBytes) void carla_zeroMem(void* const memory, const size_t numBytes)
{ {
CARLA_ASSERT(memory);
CARLA_ASSERT(memory != nullptr);

if (memory == nullptr)
return;


std::memset(memory, 0, numBytes); std::memset(memory, 0, numBytes);
} }
@@ -278,8 +284,6 @@ private:
// ------------------------------------------------- // -------------------------------------------------
// CarlaString class // CarlaString class


// TODO - use "size_t bufferLen"

class CarlaString class CarlaString
{ {
public: public:
@@ -288,94 +292,77 @@ public:


explicit CarlaString() explicit CarlaString()
{ {
buffer = ::strdup("");
bufferLen = 0;
_init();
_dup(nullptr);
} }


explicit CarlaString(char* const strBuf) explicit CarlaString(char* const strBuf)
{ {
if (strBuf)
{
buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
}
else
{
buffer = ::strdup("");
bufferLen = 0;
}
_init();
_dup(strBuf);
} }


explicit CarlaString(const char* const strBuf) explicit CarlaString(const char* const strBuf)
{ {
if (strBuf)
{
buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
}
else
{
buffer = ::strdup("");
bufferLen = 0;
}
_init();
_dup(strBuf);
} }


explicit CarlaString(const int value) explicit CarlaString(const int value)
{ {
const size_t strBufSize = ::abs(value/10) + 3;
const size_t strBufSize = (unsigned int)std::abs(value/10) + 3;
char strBuf[strBufSize]; char strBuf[strBufSize];
::snprintf(strBuf, strBufSize, "%d", value);
std::snprintf(strBuf, strBufSize, "%d", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_init();
_dup(strBuf, strBufSize);
} }


explicit CarlaString(const unsigned int value, const bool hexadecimal = false) explicit CarlaString(const unsigned int value, const bool hexadecimal = false)
{ {
const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0); const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0);
char strBuf[strBufSize]; char strBuf[strBufSize];
::snprintf(strBuf, strBufSize, hexadecimal ? "%u" : "0x%x", value);
std::snprintf(strBuf, strBufSize, hexadecimal ? "0x%x" : "%u", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_init();
_dup(strBuf, strBufSize);
} }


explicit CarlaString(const long int value) explicit CarlaString(const long int value)
{ {
const size_t strBufSize = ::labs(value/10) + 3;
const size_t strBufSize = (unsigned long)std::abs(value/10) + 3;
char strBuf[strBufSize]; char strBuf[strBufSize];
::snprintf(strBuf, strBufSize, "%ld", value);
std::snprintf(strBuf, strBufSize, "%ld", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_init();
_dup(strBuf, strBufSize);
} }


explicit CarlaString(const unsigned long int value, const bool hexadecimal = false) explicit CarlaString(const unsigned long int value, const bool hexadecimal = false)
{ {
const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0); const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0);
char strBuf[strBufSize]; char strBuf[strBufSize];
::snprintf(strBuf, strBufSize, hexadecimal ? "%lu" : "0x%lx", value);
std::snprintf(strBuf, strBufSize, hexadecimal ? "0x%lx" : "%lu", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_init();
_dup(strBuf, strBufSize);
} }


explicit CarlaString(const float value) explicit CarlaString(const float value)
{ {
char strBuf[0xff]; char strBuf[0xff];
::snprintf(strBuf, 0xff, "%f", value);
std::snprintf(strBuf, 0xff, "%f", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_dup(strBuf);
} }


explicit CarlaString(const double value) explicit CarlaString(const double value)
{ {
char strBuf[0xff]; char strBuf[0xff];
::snprintf(strBuf, 0xff, "%g", value);
std::snprintf(strBuf, 0xff, "%g", value);


buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
_init();
_dup(strBuf);
} }


// --------------------------------------------- // ---------------------------------------------
@@ -383,8 +370,8 @@ public:


CarlaString(const CarlaString& str) CarlaString(const CarlaString& str)
{ {
buffer = ::strdup(str.buffer);
bufferLen = ::strlen(buffer);
_init();
_dup(str.buffer);
} }


// --------------------------------------------- // ---------------------------------------------
@@ -393,7 +380,8 @@ public:
~CarlaString() ~CarlaString()
{ {
CARLA_ASSERT(buffer); CARLA_ASSERT(buffer);
::free(buffer);

delete[] buffer;
} }


// --------------------------------------------- // ---------------------------------------------
@@ -414,31 +402,35 @@ public:
return (bufferLen != 0); return (bufferLen != 0);
} }


#ifdef __USE_GNU
#if __USE_GNU && 0
bool contains(const char* const strBuf, const bool ignoreCase = false) const bool contains(const char* const strBuf, const bool ignoreCase = false) const
#else
bool contains(const char* const strBuf) const
#endif
{ {
if (! strBuf)
if (strBuf == nullptr)
return false; return false;
if (bufferLen == 0) if (bufferLen == 0)
return false; return false;


#ifdef __USE_GNU
if (ignoreCase) if (ignoreCase)
return (::strcasestr(buffer, strBuf) != nullptr);
return (std::strcasestr(buffer, strBuf) != nullptr);
else else
#endif
return (::strstr(buffer, strBuf) != nullptr);
return (std::strstr(buffer, strBuf) != nullptr);
} }


#ifdef __USE_GNU
bool contains(const CarlaString& str, const bool ignoreCase = false) const bool contains(const CarlaString& str, const bool ignoreCase = false) const
{ {
return contains(str.buffer, ignoreCase); return contains(str.buffer, ignoreCase);
} }
#else #else
bool contains(const char* const strBuf) const
{
if (strBuf == nullptr)
return false;
if (bufferLen == 0)
return false;

return (std::strstr(buffer, strBuf) != nullptr);
}

bool contains(const CarlaString& str) const bool contains(const CarlaString& str) const
{ {
return contains(str.buffer); return contains(str.buffer);
@@ -460,14 +452,14 @@ public:


void replace(const char before, const char after) void replace(const char before, const char after)
{ {
if (after == 0)
if (after == '\0')
return; return;


for (size_t i=0; i < bufferLen; i++) for (size_t i=0; i < bufferLen; i++)
{ {
if (buffer[i] == before) if (buffer[i] == before)
buffer[i] = after; buffer[i] = after;
else if (buffer[i] == 0)
else if (buffer[i] == '\0')
break; break;
} }
} }
@@ -475,7 +467,7 @@ public:
void truncate(const size_t n) void truncate(const size_t n)
{ {
for (size_t i=n; i < bufferLen; i++) for (size_t i=n; i < bufferLen; i++)
buffer[i] = 0;
buffer[i] = '\0';
} }


void toBasic() void toBasic()
@@ -497,19 +489,23 @@ public:


void toLower() void toLower()
{ {
static const char charDiff = 'a' - 'A';

for (size_t i=0; i < bufferLen; i++) for (size_t i=0; i < bufferLen; i++)
{ {
if (buffer[i] >= 'A' && buffer[i] <= 'Z') if (buffer[i] >= 'A' && buffer[i] <= 'Z')
buffer[i] += 32;
buffer[i] += charDiff;
} }
} }


void toUpper() void toUpper()
{ {
static const char charDiff = 'a' - 'A';

for (size_t i=0; i < bufferLen; i++) for (size_t i=0; i < bufferLen; i++)
{ {
if (buffer[i] >= 'a' && buffer[i] <= 'z') if (buffer[i] >= 'a' && buffer[i] <= 'z')
buffer[i] -= 32;
buffer[i] -= charDiff;
} }
} }


@@ -528,7 +524,7 @@ public:


bool operator==(const char* const strBuf) const bool operator==(const char* const strBuf) const
{ {
return (strBuf && ::strcmp(buffer, strBuf) == 0);
return (strBuf != nullptr && std::strcmp(buffer, strBuf) == 0);
} }


bool operator==(const CarlaString& str) const bool operator==(const CarlaString& str) const
@@ -548,18 +544,7 @@ public:


CarlaString& operator=(const char* const strBuf) CarlaString& operator=(const char* const strBuf)
{ {
::free(buffer);

if (strBuf)
{
buffer = ::strdup(strBuf);
bufferLen = ::strlen(buffer);
}
else
{
buffer = ::strdup("");
bufferLen = 0;
}
_dup(strBuf);


return *this; return *this;
} }
@@ -571,15 +556,13 @@ public:


CarlaString& operator+=(const char* const strBuf) CarlaString& operator+=(const char* const strBuf)
{ {
const size_t newBufSize = ::strlen(buffer) + (strBuf ? ::strlen(strBuf) : 0) + 1;
const size_t newBufSize = std::strlen(buffer) + ((strBuf != nullptr) ? std::strlen(strBuf) : 0) + 1;
char newBuf[newBufSize]; char newBuf[newBufSize];


::strcpy(newBuf, buffer);
::strcat(newBuf, strBuf);
::free(buffer);
std::strcpy(newBuf, buffer);
std::strcat(newBuf, strBuf);


buffer = ::strdup(newBuf);
bufferLen = ::strlen(buffer);
_dup(newBuf, newBufSize);


return *this; return *this;
} }
@@ -591,11 +574,11 @@ public:


CarlaString operator+(const char* const strBuf) CarlaString operator+(const char* const strBuf)
{ {
const size_t newBufSize = ::strlen(buffer) + (strBuf ? ::strlen(strBuf) : 0) + 1;
const size_t newBufSize = std::strlen(buffer) + ((strBuf != nullptr) ? std::strlen(strBuf) : 0) + 1;
char newBuf[newBufSize]; char newBuf[newBufSize];


::strcpy(newBuf, buffer);
::strcat(newBuf, strBuf);
std::strcpy(newBuf, buffer);
std::strcat(newBuf, strBuf);


return CarlaString(newBuf); return CarlaString(newBuf);
} }
@@ -610,10 +593,58 @@ public:
private: private:
char* buffer; char* buffer;
size_t bufferLen; size_t bufferLen;
bool firstInit;

void _init()
{
buffer = nullptr;
bufferLen = 0;
firstInit = true;
}


void _recalcLen()
// allocate string strBuf if not null
// size > 0 only if strBuf is valid
void _dup(const char* const strBuf, const size_t size = 0)
{ {
bufferLen = ::strlen(buffer);
if (strBuf != nullptr)
{
// don't recreate string if contents match
if (firstInit || std::strcmp(buffer, strBuf) != 0)
{
if (! firstInit)
{
CARLA_ASSERT(buffer);
delete[] buffer;
}

bufferLen = (size > 0) ? size : std::strlen(strBuf);
buffer = new char[bufferLen];

std::strcpy(buffer, strBuf);

firstInit = false;
}
}
else
{
CARLA_ASSERT(size == 0);

// don't recreate null string
if (firstInit || bufferLen != 0)
{
if (! firstInit)
{
CARLA_ASSERT(buffer);
delete[] buffer;
}

bufferLen = 0;
buffer = new char[1];
buffer[0] = 0;

firstInit = false;
}
}
} }


CARLA_LEAK_DETECTOR(CarlaString) CARLA_LEAK_DETECTOR(CarlaString)
@@ -624,11 +655,11 @@ static inline
CarlaString operator+(const char* const strBufBefore, const CarlaString& strAfter) CarlaString operator+(const char* const strBufBefore, const CarlaString& strAfter)
{ {
const char* const strBufAfter = (const char*)strAfter; const char* const strBufAfter = (const char*)strAfter;
const size_t newBufSize = (strBufBefore ? ::strlen(strBufBefore) : 0) + ::strlen(strBufAfter) + 1;
const size_t newBufSize = ((strBufBefore != nullptr) ? std::strlen(strBufBefore) : 0) + std::strlen(strBufAfter) + 1;
char newBuf[newBufSize]; char newBuf[newBufSize];


::strcpy(newBuf, strBufBefore);
::strcat(newBuf, strBufAfter);
std::strcpy(newBuf, strBufBefore);
std::strcat(newBuf, strBufAfter);


return CarlaString(newBuf); return CarlaString(newBuf);
} }


Loading…
Cancel
Save