int main() { const char* const filename = carla_get_library_filename(); CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', 1); const char* const folder = carla_get_library_folder(); CARLA_SAFE_ASSERT_RETURN(folder != nullptr && folder[0] != '\0', 1); const NativePluginDescriptor* const rack = carla_get_native_rack_plugin(); CARLA_SAFE_ASSERT_RETURN(rack != nullptr, 1); const NativePluginDescriptor* const patchbay = carla_get_native_patchbay_plugin(); CARLA_SAFE_ASSERT_RETURN(patchbay != nullptr, 1); const NativeHostDescriptor host = { nullptr, "", // resourceDir "Carla Plugin UI", 0, get_buffer_size, get_sample_rate, is_offline, nullptr, // get_time_info nullptr, // write_midi_event nullptr, // ui_parameter_changed nullptr, // ui_midi_program_changed nullptr, // ui_custom_data_changed nullptr, // ui_closed nullptr, // ui_open_file nullptr, // ui_save_file nullptr, // dispatcher }; const NativePluginHandle handle = rack->instantiate(&host); CARLA_SAFE_ASSERT_RETURN(handle != nullptr, 1); CarlaEngine* const engine = carla_get_native_plugin_engine(rack, handle); CARLA_SAFE_ASSERT_RETURN(engine != nullptr, 1); carla_stdout("Got Engine %p, %s, %i, %f", engine, engine->getName(), engine->getBufferSize(), engine->getSampleRate()); rack->cleanup(handle); return 0; }
CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const Descriptor* const descriptor, const bool isPatchbay) : Instrument(instrumentTrack, descriptor), kIsPatchbay(isPatchbay), fHandle(NULL), fDescriptor(isPatchbay ? carla_get_native_patchbay_plugin() : carla_get_native_rack_plugin()), fMidiEventCount(0) { fHost.handle = this; fHost.uiName = NULL; fHost.uiParentId = 0; // figure out prefix from dll filename QString dllName(carla_get_library_filename()); #if defined(CARLA_OS_LINUX) fHost.resourceDir = strdup(QString(dllName.split("/lib/carla")[0] + "/share/carla/resources/").toUtf8().constData()); #else fHost.resourceDir = NULL; #endif fHost.get_buffer_size = host_get_buffer_size; fHost.get_sample_rate = host_get_sample_rate; fHost.is_offline = host_is_offline; fHost.get_time_info = host_get_time_info; fHost.write_midi_event = host_write_midi_event; fHost.ui_parameter_changed = host_ui_parameter_changed; fHost.ui_custom_data_changed = host_ui_custom_data_changed; fHost.ui_closed = host_ui_closed; fHost.ui_open_file = host_ui_open_file; fHost.ui_save_file = host_ui_save_file; fHost.dispatcher = host_dispatcher; std::memset(&fTimeInfo, 0, sizeof(NativeTimeInfo)); fTimeInfo.bbt.valid = true; // always valid fHandle = fDescriptor->instantiate(&fHost); Q_ASSERT(fHandle != NULL); if (fHandle != NULL && fDescriptor->activate != NULL) fDescriptor->activate(fHandle); // we need a play-handle which cares for calling play() InstrumentPlayHandle * iph = new InstrumentPlayHandle( this, instrumentTrack ); Engine::mixer()->addPlayHandle( iph ); connect(Engine::mixer(), SIGNAL(sampleRateChanged()), this, SLOT(sampleRateChanged())); }