From b3d7f1bbae973b7d5f2616ef0619a80810f918f4 Mon Sep 17 00:00:00 2001 From: falkTX Date: Thu, 6 Sep 2012 21:49:44 +0100 Subject: [PATCH] Carla: Proper isProcessing value --- c++/carla-backend/carla_engine.h | 4 -- c++/carla-backend/carla_engine_jack.cpp | 11 ----- c++/carla-backend/vst.cpp | 58 +++++++++++++++++-------- c++/carla-bridge/Makefile | 2 +- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/c++/carla-backend/carla_engine.h b/c++/carla-backend/carla_engine.h index 4f5f1dd..d37a253 100644 --- a/c++/carla-backend/carla_engine.h +++ b/c++/carla-backend/carla_engine.h @@ -198,7 +198,6 @@ public: virtual bool init(const char* const clientName); virtual bool close(); - virtual bool isOnAudioThread() = 0; virtual bool isOffline() = 0; virtual bool isRunning() = 0; @@ -503,7 +502,6 @@ private: jack_transport_state_t state; jack_position_t pos; bool freewheel; - QThread* procThread; // ------------------------------------- @@ -534,7 +532,6 @@ public: bool init(const char* const clientName); bool close(); - bool isOnAudioThread(); bool isOffline(); bool isRunning(); @@ -546,7 +543,6 @@ public: private: RtAudio adac; - QThread* procThread; }; #endif diff --git a/c++/carla-backend/carla_engine_jack.cpp b/c++/carla-backend/carla_engine_jack.cpp index c493631..db76709 100644 --- a/c++/carla-backend/carla_engine_jack.cpp +++ b/c++/carla-backend/carla_engine_jack.cpp @@ -89,7 +89,6 @@ CarlaEngineJack::CarlaEngineJack() client = nullptr; state = JackTransportStopped; freewheel = false; - procThread = nullptr; memset(&pos, 0, sizeof(jack_position_t)); @@ -113,7 +112,6 @@ bool CarlaEngineJack::init(const char* const clientName) client = jackbridge_client_open(clientName, JackNullOption, nullptr); state = JackTransportStopped; freewheel = false; - procThread = nullptr; if (client) { @@ -212,11 +210,6 @@ bool CarlaEngineJack::close() return false; } -bool CarlaEngineJack::isOnAudioThread() -{ - return (QThread::currentThread() == procThread); -} - bool CarlaEngineJack::isOffline() { return freewheel; @@ -273,9 +266,6 @@ void CarlaEngineJack::handleFreewheelCallback(bool isFreewheel) void CarlaEngineJack::handleProcessCallback(uint32_t nframes) { - if (procThread == nullptr) - procThread = QThread::currentThread(); - if (maxPluginNumber == 0) return; @@ -598,7 +588,6 @@ void CarlaEngineJack::handleShutdownCallback() //} client = nullptr; - procThread = nullptr; callback(CALLBACK_QUIT, 0, 0, 0, 0.0); } diff --git a/c++/carla-backend/vst.cpp b/c++/carla-backend/vst.cpp index f0878c1..c3def71 100644 --- a/c++/carla-backend/vst.cpp +++ b/c++/carla-backend/vst.cpp @@ -27,10 +27,6 @@ CARLA_BACKEND_START_NAMESPACE -#if 0 -} /* adjust editor indent */ -#endif - /*! * @defgroup CarlaBackendVstPlugin Carla Backend VST Plugin * @@ -67,6 +63,8 @@ public: gui.width = 0; gui.height = 0; + isProcessing = false; + memset(midiEvents, 0, sizeof(VstMidiEvent)*MAX_MIDI_EVENTS*2); for (unsigned short i=0; i < MAX_MIDI_EVENTS*2; i++) @@ -1171,7 +1169,9 @@ public: //{ if (m_hints & PLUGIN_CAN_PROCESS_REPLACING) { + isProcessing = true; effect->processReplacing(effect, inBuffer, outBuffer, frames); + isProcessing = false; } else { @@ -1179,7 +1179,9 @@ public: memset(outBuffer[i], 0, sizeof(float)*frames); #if ! VST_FORCE_DEPRECATED + isProcessing = true; effect->process(effect, inBuffer, outBuffer, frames); + isProcessing = false; #endif } //} @@ -1396,20 +1398,20 @@ public: if (index >= param.count /*|| ! m_enabled*/) return; - if (x_engine->isOnAudioThread() && ! x_engine->isOffline()) + if (isProcessing && ! x_engine->isOffline()) { setParameterValue(index, value, false, false, false); postponeEvent(PluginPostEventParameterChange, index, 0, value); } else - setParameterValue(index, value, true, true, true); // FIXME - dont send to GUI? + setParameterValue(index, value, isProcessing, true, true); } intptr_t handleAudioMasterGetCurrentProcessLevel() { if (x_engine->isOffline()) return kVstProcessLevelOffline; - if (x_engine->isOnAudioThread()) + if (isProcessing) return kVstProcessLevelRealtime; return kVstProcessLevelUser; } @@ -1465,10 +1467,31 @@ public: vstTimeInfo.timeSigDenominator = timeInfo->bbt.beat_type; vstTimeInfo.flags |= kVstTimeSigValid; } + else + { + // Tempo + vstTimeInfo.tempo = 120.0; + vstTimeInfo.flags |= kVstTempoValid; + + // Time Signature + vstTimeInfo.timeSigNumerator = 4; + vstTimeInfo.timeSigDenominator = 4; + vstTimeInfo.flags |= kVstTimeSigValid; + } return &vstTimeInfo; } + intptr_t handleAudioMasterTempoAt() + { + const CarlaTimeInfo* const timeInfo = x_engine->getTimeInfo(); + + if (timeInfo->valid & CarlaEngineTimeBBT) + return timeInfo->bbt.beats_per_minute * 10000; + + return 0; + } + intptr_t handleAudioMasterIOChanged() { qDebug("VstPlugin::handleAudioMasterIOChanged()"); @@ -1513,6 +1536,8 @@ public: intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents) { Q_ASSERT(m_enabled); + Q_ASSERT(midi.portMout); + Q_ASSERT(isProcessing); if (! m_enabled) return 0; @@ -1520,7 +1545,7 @@ public: if (! midi.portMout) return 0; - if (! x_engine->isOnAudioThread()) + if (! isProcessing) { qCritical("VstPlugin:handleAudioMasterProcessEvents(%p) - received MIDI out events outside audio thread, ignoring", vstEvents); return 0; @@ -1533,23 +1558,13 @@ public: const VstMidiEvent* const vstMidiEvent = (const VstMidiEvent*)vstEvents->events[i]; - if (vstMidiEvent->type != kVstMidiType) + if (vstMidiEvent->type == kVstMidiType) memcpy(&midiEvents[events.numEvents++], vstMidiEvent, sizeof(VstMidiEvent)); } return 1; } - intptr_t handleAudioMasterTempoAt() - { - const CarlaTimeInfo* const timeInfo = x_engine->getTimeInfo(); - - if (timeInfo->valid & CarlaEngineTimeBBT) - return timeInfo->bbt.beats_per_minute * 10000; - - return 0; - } - intptr_t handleAdioMasterSizeWindow(int32_t width, int32_t height) { qDebug("VstPlugin::handleAudioMasterSizeWindow(%i, %i)", width, height); @@ -2055,7 +2070,10 @@ public: // special checks if (effect->dispatcher(effect, effCanDo, 0, 0, (void*)"hasCockosExtensions", 0.0f) == 0xbeef0000) + { + qDebug("Plugin has Cockos extensions!"); m_hints |= PLUGIN_HAS_COCKOS_EXTENSIONS; + } if (effect->dispatcher(effect, effGetVstVersion, 0, 0, nullptr, 0.0f) < kVstVersion) m_hints |= PLUGIN_USES_OLD_VSTSDK; @@ -2126,6 +2144,8 @@ private: int height; } gui; + bool isProcessing; + int unique2; }; diff --git a/c++/carla-bridge/Makefile b/c++/carla-bridge/Makefile index a7f6f33..c729b38 100644 --- a/c++/carla-bridge/Makefile +++ b/c++/carla-bridge/Makefile @@ -13,7 +13,7 @@ BASE_FLAGS = -O0 -g BUILD_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) BUILD_FLAGS += -I. -I../carla-includes $(shell pkg-config --cflags liblo QtCore) BUILD_FLAGS += -DBUILD_BRIDGE -DDEBUG # -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT # -DNDEBUG -BUILD_FLAGS += -DVESTIGE_HEADER -I../carla-includes/vestige # Comment this line to not use vestige header +BUILD_FLAGS += -DVESTIGE_HEADER # Comment this line to not use vestige header 32BIT_FLAGS = -m32 64BIT_FLAGS = -m64