Browse Source

Carla: Don't register master client for plugin-bridges

Makes plugin-bridges use a single client, which is more friendly to ladish
but also better way in general
tags/v0.9.0
falkTX 13 years ago
parent
commit
93f8315778
3 changed files with 58 additions and 35 deletions
  1. +6
    -8
      c++/carla-backend/carla_engine.cpp
  2. +36
    -10
      c++/carla-backend/carla_engine_jack.cpp
  3. +16
    -17
      c++/carla-bridge/carla_bridge_plugin.cpp

+ 6
- 8
c++/carla-backend/carla_engine.cpp View File

@@ -410,11 +410,11 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con
{ {
case PLUGIN_NONE: case PLUGIN_NONE:
break; break;
case PLUGIN_INTERNAL:
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
case PLUGIN_INTERNAL:
plugin = CarlaPlugin::newNative(init); plugin = CarlaPlugin::newNative(init);
#endif
break; break;
#endif
case PLUGIN_LADSPA: case PLUGIN_LADSPA:
plugin = CarlaPlugin::newLADSPA(init, extra); plugin = CarlaPlugin::newLADSPA(init, extra);
break; break;
@@ -427,12 +427,7 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con
case PLUGIN_VST: case PLUGIN_VST:
plugin = CarlaPlugin::newVST(init); plugin = CarlaPlugin::newVST(init);
break; break;
#ifdef BUILD_BRIDGE
case PLUGIN_GIG:
case PLUGIN_SF2:
case PLUGIN_SFZ:
break;
#else
#ifndef BUILD_BRIDGE
case PLUGIN_GIG: case PLUGIN_GIG:
plugin = CarlaPlugin::newGIG(init); plugin = CarlaPlugin::newGIG(init);
break; break;
@@ -442,6 +437,9 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con
case PLUGIN_SFZ: case PLUGIN_SFZ:
plugin = CarlaPlugin::newSFZ(init); plugin = CarlaPlugin::newSFZ(init);
break; break;
#else
default:
break;
#endif #endif
} }
} }


+ 36
- 10
c++/carla-backend/carla_engine_jack.cpp View File

@@ -64,9 +64,11 @@ public:
{ {
qDebug("CarlaEngineJack::init(\"%s\")", clientName); qDebug("CarlaEngineJack::init(\"%s\")", clientName);


client = jackbridge_client_open(clientName, JackNullOption, nullptr);
state = JackTransportStopped;
freewheel = false; freewheel = false;
state = JackTransportStopped;

#ifndef BUILD_BRIDGE
client = jackbridge_client_open(clientName, JackNullOption, nullptr);


if (client) if (client)
{ {
@@ -79,7 +81,6 @@ public:
jackbridge_set_process_callback(client, carla_jack_process_callback, this); jackbridge_set_process_callback(client, carla_jack_process_callback, this);
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);


#ifndef BUILD_BRIDGE
if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
{ {
rackJackPorts[rackPortAudioIn1] = jackbridge_port_register(client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); rackJackPorts[rackPortAudioIn1] = jackbridge_port_register(client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
@@ -91,7 +92,6 @@ public:
rackJackPorts[rackPortMidiIn] = jackbridge_port_register(client, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); rackJackPorts[rackPortMidiIn] = jackbridge_port_register(client, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
rackJackPorts[rackPortMidiOut] = jackbridge_port_register(client, "midi-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); rackJackPorts[rackPortMidiOut] = jackbridge_port_register(client, "midi-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
} }
#endif


if (jackbridge_activate(client) == 0) if (jackbridge_activate(client) == 0)
{ {
@@ -109,6 +109,11 @@ public:
setLastError("Failed to create new JACK client"); setLastError("Failed to create new JACK client");


return false; return false;
#else
name = getFixedClientName(clientName);
CarlaEngine::init(name);
return true;
#endif
} }


bool close() bool close()
@@ -122,9 +127,12 @@ public:
name = nullptr; name = nullptr;
} }


#ifdef BUILD_BRIDGE
client = nullptr;
return true;
#else
if (jackbridge_deactivate(client) == 0) if (jackbridge_deactivate(client) == 0)
{ {
#ifndef BUILD_BRIDGE
if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
{ {
jackbridge_port_unregister(client, rackJackPorts[rackPortAudioIn1]); jackbridge_port_unregister(client, rackJackPorts[rackPortAudioIn1]);
@@ -136,7 +144,6 @@ public:
jackbridge_port_unregister(client, rackJackPorts[rackPortMidiIn]); jackbridge_port_unregister(client, rackJackPorts[rackPortMidiIn]);
jackbridge_port_unregister(client, rackJackPorts[rackPortMidiOut]); jackbridge_port_unregister(client, rackJackPorts[rackPortMidiOut]);
} }
#endif


if (jackbridge_client_close(client) == 0) if (jackbridge_client_close(client) == 0)
{ {
@@ -150,6 +157,7 @@ public:
setLastError("Failed to deactivate the JACK client"); setLastError("Failed to deactivate the JACK client");


client = nullptr; client = nullptr;
#endif
return false; return false;
} }


@@ -168,17 +176,28 @@ public:
CarlaEngineClientNativeHandle handle; CarlaEngineClientNativeHandle handle;
handle.type = CarlaEngineTypeJack; handle.type = CarlaEngineTypeJack;


#ifndef BUILD_BRIDGE
#ifdef BUILD_BRIDGE
client = handle.jackClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);

sampleRate = jackbridge_get_sample_rate(client);
bufferSize = jackbridge_get_buffer_size(client);

jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
jackbridge_set_process_callback(handle.jackClient, carla_jack_process_callback, this);
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
#else
if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT) if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
{ {
handle.jackClient = client; handle.jackClient = client;
} }
else if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS) else if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
#endif
{ {
handle.jackClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr); handle.jackClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
jackbridge_set_process_callback(handle.jackClient, carla_jack_process_callback_plugin, plugin); jackbridge_set_process_callback(handle.jackClient, carla_jack_process_callback_plugin, plugin);
} }
#endif


return new CarlaEngineClient(handle); return new CarlaEngineClient(handle);
} }
@@ -212,7 +231,6 @@ protected:
if (maxPluginNumber() == 0) if (maxPluginNumber() == 0)
return; return;
#endif #endif

state = jackbridge_transport_query(client, &pos); state = jackbridge_transport_query(client, &pos);


timeInfo.playing = (state != JackTransportStopped); timeInfo.playing = (state != JackTransportStopped);
@@ -427,7 +445,15 @@ protected:
} }
} }
#else #else
Q_UNUSED(nframes);
CarlaPlugin* const plugin = getPluginUnchecked(0);

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




+ 16
- 17
c++/carla-bridge/carla_bridge_plugin.cpp View File

@@ -674,6 +674,7 @@ int main(int argc, char* argv[])


qargc = argc; qargc = argc;
qargv = argv; qargv = argv;
initSignalHandler();


const char* const oscUrl = argv[1]; const char* const oscUrl = argv[1];
const char* const stype = argv[2]; const char* const stype = argv[2];
@@ -715,34 +716,35 @@ int main(int argc, char* argv[])
} }


// Init backend engine // Init backend engine
CarlaBackend::CarlaEngineJack engine;
engine.setCallback(client.callback, &client);
CarlaBackend::CarlaEngine* engine = CarlaBackend::CarlaEngine::newDriverByName("JACK");
engine->setCallback(client.callback, &client);


// bridge client <-> engine // bridge client <-> engine
client.registerOscEngine(&engine);
client.registerOscEngine(engine);


// Init engine // Init engine
QString engName = QString("%1 (master)").arg(name ? name : label); QString engName = QString("%1 (master)").arg(name ? name : label);
engName.truncate(engine.maxClientNameSize());
engName.truncate(engine->maxClientNameSize());


if (! engine.init(engName.toUtf8().constData()))
if (! engine->init(engName.toUtf8().constData()))
{ {
const char* const lastError = CarlaBackend::getLastError(); const char* const lastError = CarlaBackend::getLastError();
qWarning("Bridge engine failed to start, error was:\n%s", lastError); qWarning("Bridge engine failed to start, error was:\n%s", lastError);
engine.close();
engine->close();
delete engine;
client.sendOscBridgeError(lastError); client.sendOscBridgeError(lastError);
client.quit(); client.quit();
return 2; return 2;
} }


/// Init plugin /// Init plugin
short id = engine.addPlugin(itype, filename, name, label);
short id = engine->addPlugin(itype, filename, name, label);
int ret; int ret;


if (id >= 0 && id < CarlaBackend::MAX_PLUGINS) if (id >= 0 && id < CarlaBackend::MAX_PLUGINS)
{ {
CarlaBackend::CarlaPlugin* const plugin = engine.getPlugin(id);
client.setStuff(&engine, plugin);
CarlaBackend::CarlaPlugin* const plugin = engine->getPlugin(id);
client.setStuff(engine, plugin);


// create window if needed // create window if needed
bool guiResizable; bool guiResizable;
@@ -757,6 +759,8 @@ int main(int argc, char* argv[])
if (! useOsc) if (! useOsc)
plugin->setActive(true, false, false); plugin->setActive(true, false, false);


client.exec(nullptr, !useOsc);

ret = 0; ret = 0;
} }
else else
@@ -770,14 +774,9 @@ int main(int argc, char* argv[])
ret = 1; ret = 1;
} }


if (ret == 0)
{
initSignalHandler();
client.exec(nullptr, !useOsc);
}

engine.removeAllPlugins();
engine.close();
engine->removeAllPlugins();
engine->close();
delete engine;


if (useOsc) if (useOsc)
{ {


Loading…
Cancel
Save