/* * Carla Engine * Copyright (C) 2012-2013 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 GPL.txt file */ #ifndef __CARLA_ENGINE_INTERNAL_HPP__ #define __CARLA_ENGINE_INTERNAL_HPP__ #include "CarlaEngineOsc.hpp" #include "CarlaEngineThread.hpp" #include "CarlaEngine.hpp" #include "CarlaPlugin.hpp" #include "RtList.hpp" class QMainWindow; CARLA_BACKEND_START_NAMESPACE // ------------------------------------------------------------------------------------------------------------------- static inline const char* EngineType2Str(const EngineType type) { switch (type) { case kEngineTypeNull: return "kEngineTypeNull"; case kEngineTypeJack: return "kEngineTypeJack"; case kEngineTypeRtAudio: return "kEngineTypeRtAudio"; case kEngineTypePlugin: return "kEngineTypePlugin"; case kEngineTypeBridge: return "kEngineTypeBridge"; } carla_stderr("CarlaBackend::EngineType2Str(%i) - invalid type", type); return nullptr; } static inline const char* EnginePortType2Str(const EnginePortType type) { switch (type) { case kEnginePortTypeNull: return "kEnginePortTypeNull"; case kEnginePortTypeAudio: return "kEnginePortTypeAudio"; case kEnginePortTypeEvent: return "kEnginePortTypeEvent"; } carla_stderr("CarlaBackend::EnginePortType2Str(%i) - invalid type", type); return nullptr; } static inline const char* EngineEventType2Str(const EngineEventType type) { switch (type) { case kEngineEventTypeNull: return "kEngineEventTypeNull"; case kEngineEventTypeControl: return "kEngineEventTypeControl"; case kEngineEventTypeMidi: return "kEngineEventTypeMidi"; } carla_stderr("CarlaBackend::EngineEventType2Str(%i) - invalid type", type); return nullptr; } static inline const char* EngineControlEventType2Str(const EngineControlEventType type) { switch (type) { case kEngineControlEventTypeNull: return "kEngineNullEvent"; case kEngineControlEventTypeParameter: return "kEngineControlEventTypeParameter"; case kEngineControlEventTypeMidiBank: return "kEngineControlEventTypeMidiBank"; case kEngineControlEventTypeMidiProgram: return "kEngineControlEventTypeMidiProgram"; case kEngineControlEventTypeAllSoundOff: return "kEngineControlEventTypeAllSoundOff"; case kEngineControlEventTypeAllNotesOff: return "kEngineControlEventTypeAllNotesOff"; } carla_stderr("CarlaBackend::EngineControlEventType2Str(%i) - invalid type", type); return nullptr; } // ------------------------------------------------------------------------------------------------------------------- const uint32_t PATCHBAY_BUFFER_SIZE = 128; const unsigned short PATCHBAY_EVENT_COUNT = 512; const unsigned short RACK_EVENT_COUNT = 512; enum EnginePostAction { EnginePostActionNull, EnginePostActionRemovePlugin, EnginePostActionSwitchPlugins }; struct EnginePluginData { CarlaPlugin* plugin; float insPeak[CarlaEngine::MAX_PEAKS]; float outsPeak[CarlaEngine::MAX_PEAKS]; EnginePluginData() : plugin(nullptr), insPeak{0.0f}, outsPeak{0.0f} {} }; // ------------------------------------------------------------------------------------------------------------------- struct CarlaEngineProtectedData { CarlaEngineOsc osc; CarlaEngineThread thread; const CarlaOscData* oscData; CallbackFunc callback; void* callbackPtr; CarlaString lastError; QMainWindow* hostWindow; bool aboutToClose; // don't re-activate thread if true unsigned int curPluginCount; // number of plugins loaded (0...max) unsigned int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255) struct NextAction { EnginePostAction opcode; unsigned int pluginId; unsigned int value; CarlaMutex mutex; NextAction() : opcode(EnginePostActionNull), pluginId(0), value(0) {} ~NextAction() { CARLA_ASSERT(opcode == EnginePostActionNull); } void ready() { mutex.lock(); mutex.unlock(); } } nextAction; #ifndef BUILD_BRIDGE struct Rack { EngineEvent* in; EngineEvent* out; Rack() : in(nullptr), out(nullptr) {} } rack; #endif struct Time { bool playing; uint32_t frame; Time() : playing(false), frame(0) {} } time; EnginePluginData* plugins; CarlaEngineProtectedData(CarlaEngine* const engine) : osc(engine), thread(engine), oscData(nullptr), callback(nullptr), callbackPtr(nullptr), hostWindow(nullptr), aboutToClose(false), curPluginCount(0), maxPluginNumber(0), plugins(nullptr) {} CarlaEngineProtectedData() = delete; CarlaEngineProtectedData(CarlaEngineProtectedData&) = delete; CarlaEngineProtectedData(const CarlaEngineProtectedData&) = delete; #ifndef BUILD_BRIDGE static void registerEnginePlugin(CarlaEngine* const engine, const unsigned int id, CarlaPlugin* const plugin) { CARLA_ASSERT(id == engine->kData->curPluginCount); if (id == engine->kData->curPluginCount) engine->kData->plugins[id].plugin = plugin; } #endif }; CARLA_BACKEND_END_NAMESPACE #endif // __CARLA_ENGINE_INTERNAL_HPP__