/* * Carla Plugin Host * Copyright (C) 2011-2022 Filipe Coelho * * 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, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #include "CarlaNativePlugin.h" #include "CarlaHostImpl.hpp" #include "CarlaEngine.hpp" #include "CarlaString.hpp" #include "water/files/File.h" // -------------------------------------------------------------------------------------------------------------------- // Expose info functions as needed #ifndef CARLA_HOST_PLUGIN_BUILD # include "utils/Information.cpp" #endif // -------------------------------------------------------------------------------------------------------------------- CARLA_BACKEND_USE_NAMESPACE // -------------------------------------------------------------------------------------------------------------------- CarlaHostHandle carla_create_native_plugin_host_handle(const NativePluginDescriptor* desc, NativePluginHandle handle) { CarlaEngine* const engine = carla_get_native_plugin_engine(desc, handle); CARLA_SAFE_ASSERT_RETURN(engine, nullptr); CarlaHostHandleImpl* hosthandle; try { hosthandle = new CarlaHostHandleImpl(); } CARLA_SAFE_EXCEPTION_RETURN("carla_create_native_plugin_host_handle()", nullptr); hosthandle->engine = engine; hosthandle->isPlugin = true; return hosthandle; } void carla_host_handle_free(CarlaHostHandle handle) { CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); CARLA_SAFE_ASSERT_RETURN(handle->isPlugin,); delete (CarlaHostHandleImpl*)handle; } // -------------------------------------------------------------------------------------------------------------------- CarlaEngine* carla_get_native_plugin_engine(const NativePluginDescriptor* desc, NativePluginHandle handle) { CARLA_SAFE_ASSERT_RETURN(desc != nullptr, nullptr); CARLA_SAFE_ASSERT_RETURN(handle != nullptr, nullptr); return (CarlaEngine*)static_cast(desc->dispatcher(handle, NATIVE_PLUGIN_OPCODE_GET_INTERNAL_HANDLE, 0, 0, nullptr, 0.0f)); } // -------------------------------------------------------------------------------------------------------------------- // testing purposes only #if 0 static uint32_t get_buffer_size(NativeHostHandle) { return 128; } static double get_sample_rate(NativeHostHandle) { return 44100.0; } static bool is_offline(NativeHostHandle) { return false; } 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; } #endif // --------------------------------------------------------------------------------------------------------------------