Browse Source

Carla: Prepare engine for future RtAudio support

tags/v0.9.0
falkTX 13 years ago
parent
commit
ed4d6ab3c2
5 changed files with 213 additions and 170 deletions
  1. +5
    -29
      c++/carla-backend/carla_backend_standalone.cpp
  2. +180
    -115
      c++/carla-backend/carla_engine.cpp
  3. +25
    -22
      c++/carla-backend/carla_engine.h
  4. +1
    -1
      c++/carla-backend/qtcreator/carla-backend.pro
  5. +2
    -3
      c++/carla-jackbridge/carla_jackbridge.h

+ 5
- 29
c++/carla-backend/carla_backend_standalone.cpp View File

@@ -1426,35 +1426,8 @@ void run_tests_standalone(short idMax)
get_output_peak_value(id, 1);
get_output_peak_value(id, 2);

qDebug("------------------- TEST @%i: set internal data --------------------", id);
set_active(id, false);
set_active(id, true);
set_active(id, true);

set_drywet(id, -999);
set_volume(id, -999);
set_balance_left(id, -999);
set_balance_right(id, 999);

qDebug("------------------- TEST @%i: set parameter data [-1] --------------------", id);
set_parameter_value(id, -1, -999);
set_parameter_midi_channel(id, -1, -1);
set_parameter_midi_cc(id, -1, -1);
set_program(id, -1);
set_midi_program(id, -1);

qDebug("------------------- TEST @%i: set parameter data [0] --------------------", id);
set_parameter_value(id, 0, -999);
set_parameter_midi_channel(id, 0, -1);
set_parameter_midi_channel(id, 0, 0);
set_parameter_midi_cc(id, 0, -1);
set_parameter_midi_cc(id, 0, 0);
set_program(id, 0);
set_midi_program(id, 0);

qDebug("------------------- TEST @%i: set extra data --------------------", id);
//set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, nullptr, nullptr);
set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, "", "");
set_custom_data(id, CarlaBackend::CUSTOM_DATA_STRING, "", "");
set_chunk_data(id, nullptr);
set_gui_data(id, (uintptr_t)1);

@@ -1535,7 +1508,10 @@ int main(int argc, char* argv[])
run_tests_standalone(id_dssi+1);

// lock
//app.exec();
app.exec();
delete vstGui;
vstGui = nullptr;

remove_plugin(id_ladspa);
remove_plugin(id_dssi);


+ 180
- 115
c++/carla-backend/carla_engine.cpp View File

@@ -416,6 +416,11 @@ void CarlaEngine::idlePluginGuis()
// -----------------------------------------------------------------------
// Information (base)

CarlaEngineType CarlaEngine::getType() const
{
return type;
}

const char* CarlaEngine::getName() const
{
Q_ASSERT(name);
@@ -654,15 +659,19 @@ bool CarlaEngineClient::isOk() const
#endif
{
#ifdef CARLA_ENGINE_JACK
return bool(handle.jackClient);
// FIXME
if (type == CarlaEngineTypeJack)
return bool(handle.jackClient);
#endif
#ifdef CARLA_ENGINE_RTAUDIO
if (type == CarlaEngineTypeRtAudio)
return bool(handle.rtAudioPtr);
#endif
}

return true;
}

const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType type, const char* const name, const bool isInput)
const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType portType, const char* const name, const bool isInput)
{
qDebug("CarlaEngineClient::addPort(%i, \"%s\", %s)", type, name, bool2str(isInput));

@@ -671,27 +680,35 @@ const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType
portHandle.jackClient = handle.jackClient;
#endif

#ifdef CARLA_ENGINE_JACK
# ifndef BUILD_BRIDGE
#ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
# endif
#endif
{
switch (type)
#ifdef CARLA_ENGINE_JACK
if (type == CarlaEngineTypeJack)
{
case CarlaEnginePortTypeAudio:
portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case CarlaEnginePortTypeControl:
case CarlaEnginePortTypeMIDI:
portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
switch (portType)
{
case CarlaEnginePortTypeAudio:
portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case CarlaEnginePortTypeControl:
case CarlaEnginePortTypeMIDI:
portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
}
}
#endif

#ifdef CARLA_ENGINE_RTAUDIO
if (type == CarlaEngineTypeRtAudio)
{
// TODO
}
}
#else
Q_UNUSED(name);
#endif
}

switch (type)
switch (portType)
{
case CarlaEnginePortTypeAudio:
return new CarlaEngineAudioPort(portHandle, isInput);
@@ -721,14 +738,18 @@ CarlaEngineBasePort::~CarlaEngineBasePort()
{
qDebug("CarlaEngineBasePort::~CarlaEngineBasePort()");

#ifndef BUILD_BRIDGE
if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
return;
#endif

#ifdef CARLA_ENGINE_JACK
# ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
# endif
{
if (handle.jackClient && handle.jackPort)
jackbridge_port_unregister(handle.jackClient, handle.jackPort);
}
if (handle.jackClient && handle.jackPort)
jackbridge_port_unregister(handle.jackClient, handle.jackPort);
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif
}

@@ -787,6 +808,10 @@ void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine)
jackbridge_midi_clear_buffer(buffer);
}
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif
}

uint32_t CarlaEngineControlPort::getEventCount()
@@ -815,10 +840,15 @@ uint32_t CarlaEngineControlPort::getEventCount()
#endif

#ifdef CARLA_ENGINE_JACK
return jackbridge_midi_get_event_count(buffer);
#else
return 0;
if (handle.jackPort)
return jackbridge_midi_get_event_count(buffer);
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif

return 0;
}

const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index)
@@ -842,56 +872,63 @@ const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index)
#endif

#ifdef CARLA_ENGINE_JACK
static jackbridge_midi_event_t jackEvent;
static CarlaEngineControlEvent carlaEvent;

if (jackbridge_midi_event_get(&jackEvent, buffer, index) != 0)
return nullptr;
if (handle.jackPort)
{
static jackbridge_midi_event_t jackEvent;
static CarlaEngineControlEvent carlaEvent;

memset(&carlaEvent, 0, sizeof(CarlaEngineControlEvent));
if (jackbridge_midi_event_get(&jackEvent, buffer, index) != 0)
return nullptr;

uint8_t midiStatus = jackEvent.buffer[0];
uint8_t midiChannel = midiStatus & 0x0F;
memset(&carlaEvent, 0, sizeof(CarlaEngineControlEvent));

carlaEvent.time = jackEvent.time;
carlaEvent.channel = midiChannel;
uint8_t midiStatus = jackEvent.buffer[0];
uint8_t midiChannel = midiStatus & 0x0F;

if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
{
uint8_t midiControl = jackEvent.buffer[1];
carlaEvent.time = jackEvent.time;
carlaEvent.channel = midiChannel;

if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
{
uint8_t midiBank = jackEvent.buffer[2];
carlaEvent.type = CarlaEngineEventMidiBankChange;
carlaEvent.value = midiBank;
}
else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
{
carlaEvent.type = CarlaEngineEventAllSoundOff;
}
else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
{
carlaEvent.type = CarlaEngineEventAllNotesOff;
uint8_t midiControl = jackEvent.buffer[1];

if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
{
uint8_t midiBank = jackEvent.buffer[2];
carlaEvent.type = CarlaEngineEventMidiBankChange;
carlaEvent.value = midiBank;
}
else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
{
carlaEvent.type = CarlaEngineEventAllSoundOff;
}
else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
{
carlaEvent.type = CarlaEngineEventAllNotesOff;
}
else
{
uint8_t midiValue = jackEvent.buffer[2];
carlaEvent.type = CarlaEngineEventControlChange;
carlaEvent.controller = midiControl;
carlaEvent.value = double(midiValue)/127;
}

return &carlaEvent;
}
else
else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
{
uint8_t midiValue = jackEvent.buffer[2];
carlaEvent.type = CarlaEngineEventControlChange;
carlaEvent.controller = midiControl;
carlaEvent.value = double(midiValue)/127;
}
uint8_t midiProgram = jackEvent.buffer[1];
carlaEvent.type = CarlaEngineEventMidiProgramChange;
carlaEvent.value = midiProgram;

return &carlaEvent;
return &carlaEvent;
}
}
else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
{
uint8_t midiProgram = jackEvent.buffer[1];
carlaEvent.type = CarlaEngineEventMidiProgramChange;
carlaEvent.value = midiProgram;
#endif

return &carlaEvent;
}
#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif

return nullptr;
@@ -928,44 +965,51 @@ void CarlaEngineControlPort::writeEvent(CarlaEngineControlEventType type, uint32
#endif

#ifdef CARLA_ENGINE_JACK
if (type == CarlaEngineEventControlChange && MIDI_IS_CONTROL_BANK_SELECT(controller))
type = CarlaEngineEventMidiBankChange;

uint8_t data[4] = { 0 };

switch (type)
{
case CarlaEngineEventNull:
break;
case CarlaEngineEventControlChange:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = controller;
data[2] = value * 127;
jackbridge_midi_event_write(buffer, time, data, 3);
break;
case CarlaEngineEventMidiBankChange:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_BANK_SELECT;
data[2] = value;
jackbridge_midi_event_write(buffer, time, data, 3);
break;
case CarlaEngineEventMidiProgramChange:
data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
data[1] = value;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
case CarlaEngineEventAllSoundOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
case CarlaEngineEventAllNotesOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
if (handle.jackPort)
{
if (type == CarlaEngineEventControlChange && MIDI_IS_CONTROL_BANK_SELECT(controller))
type = CarlaEngineEventMidiBankChange;

uint8_t data[4] = { 0 };

switch (type)
{
case CarlaEngineEventNull:
break;
case CarlaEngineEventControlChange:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = controller;
data[2] = value * 127;
jackbridge_midi_event_write(buffer, time, data, 3);
break;
case CarlaEngineEventMidiBankChange:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_BANK_SELECT;
data[2] = value;
jackbridge_midi_event_write(buffer, time, data, 3);
break;
case CarlaEngineEventMidiProgramChange:
data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
data[1] = value;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
case CarlaEngineEventAllSoundOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
case CarlaEngineEventAllNotesOff:
data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
jackbridge_midi_event_write(buffer, time, data, 2);
break;
}
}
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif
}

// -------------------------------------------------------------------------------------------------------------------
@@ -998,6 +1042,10 @@ void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine)
jackbridge_midi_clear_buffer(buffer);
}
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif
}

uint32_t CarlaEngineMidiPort::getEventCount()
@@ -1026,10 +1074,15 @@ uint32_t CarlaEngineMidiPort::getEventCount()
#endif

#ifdef CARLA_ENGINE_JACK
return jackbridge_midi_get_event_count(buffer);
#else
return 0;
if (handle.jackPort)
return jackbridge_midi_get_event_count(buffer);
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif

return 0;
}

const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
@@ -1054,18 +1107,25 @@ const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
#endif

#ifdef CARLA_ENGINE_JACK
static jackbridge_midi_event_t jackEvent;
static CarlaEngineMidiEvent carlaEvent;

if (jackbridge_midi_event_get(&jackEvent, buffer, index) == 0 && jackEvent.size <= 4)
if (handle.jackPort)
{
carlaEvent.time = jackEvent.time;
carlaEvent.size = jackEvent.size;
memcpy(carlaEvent.data, jackEvent.buffer, jackEvent.size);
return &carlaEvent;
static jackbridge_midi_event_t jackEvent;
static CarlaEngineMidiEvent carlaEvent;

if (jackbridge_midi_event_get(&jackEvent, buffer, index) == 0 && jackEvent.size <= 4)
{
carlaEvent.time = jackEvent.time;
carlaEvent.size = jackEvent.size;
memcpy(carlaEvent.data, jackEvent.buffer, jackEvent.size);
return &carlaEvent;
}
}
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif

return nullptr;
}

@@ -1102,7 +1162,12 @@ void CarlaEngineMidiPort::writeEvent(uint32_t time, const uint8_t* data, uint8_t
#endif

#ifdef CARLA_ENGINE_JACK
jackbridge_midi_event_write(buffer, time, data, size);
if (handle.jackPort)
jackbridge_midi_event_write(buffer, time, data, size);
#endif

#ifdef CARLA_ENGINE_RTAUDIO
// TODO
#endif
}



+ 25
- 22
c++/carla-backend/carla_engine.h View File

@@ -100,37 +100,39 @@ struct CarlaEngineMidiEvent {
#endif
};

struct CarlaTimeInfoBBT {
int32_t bar;
int32_t beat;
int32_t tick;
double bar_start_tick;
float beats_per_bar;
float beat_type;
double ticks_per_beat;
double beats_per_minute;
CarlaTimeInfoBBT()
: bar(0),
beat(0),
tick(0),
bar_start_tick(0.0),
beats_per_bar(0.0f),
beat_type(0.0f),
ticks_per_beat(0.0),
beats_per_minute(0.0) {}
};

struct CarlaTimeInfo {
bool playing;
uint32_t frame;
uint32_t time;
uint32_t valid;
struct {
int32_t bar;
int32_t beat;
int32_t tick;
double bar_start_tick;
float beats_per_bar;
float beat_type;
double ticks_per_beat;
double beats_per_minute;
} bbt;
CarlaTimeInfoBBT bbt;

CarlaTimeInfo()
: playing(false),
frame(0),
time(0),
#ifdef Q_COMPILER_INITIALIZER_LISTS
valid(0),
bbt{0, 0, 0, 0.0, 0.0f, 0.0f, 0.0, 0.0} {}
#else
valid(0)
{
bbt.bar = bbt.beat = bbt.tick = 0;
bbt.beats_per_bar = bbt.beat_type = 0.0f;
bbt.bar_start_tick = bbt.ticks_per_beat = bbt.beats_per_minute = 0.0;
}
#endif
valid(0) {}
};

struct CarlaEngineClientNativeHandle {
@@ -227,6 +229,7 @@ public:
// -------------------------------------------------------------------
// Information (base)

CarlaEngineType getType() const;
const char* getName() const;
double getSampleRate() const;
uint32_t getBufferSize() const;
@@ -406,7 +409,7 @@ public:
bool isActive() const;
bool isOk() const;

const CarlaEngineBasePort* addPort(const CarlaEnginePortType type, const char* const name, const bool isInput);
const CarlaEngineBasePort* addPort(const CarlaEnginePortType portType, const char* const name, const bool isInput);

private:
bool m_active;


+ 1
- 1
c++/carla-backend/qtcreator/carla-backend.pro View File

@@ -10,7 +10,7 @@ PKGCONFIG += fluidsynth linuxsampler
PKGCONFIG += suil-0

TARGET = carla_backend
TEMPLATE = lib #app
TEMPLATE = lib # app
VERSION = 0.5.0

SOURCES = \


+ 2
- 3
c++/carla-jackbridge/carla_jackbridge.h View File

@@ -24,12 +24,11 @@

typedef unsigned char jackbridge_midi_data_t;

typedef struct _jackbridge_midi_event
{
struct jackbridge_midi_event_t {
jack_nframes_t time;
size_t size;
jackbridge_midi_data_t* buffer;
} jackbridge_midi_event_t;
};

CARLA_EXPORT jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status);
CARLA_EXPORT int jackbridge_client_close(jack_client_t* client);


Loading…
Cancel
Save