From c3a91e88628c5c7ce9e4396f8cf7650cf42bd208 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 9 May 2015 19:08:44 +0200 Subject: [PATCH] carla-vst: Check if bufsize or srate changed during resume; Build fix --- source/plugin/Makefile | 4 +++ source/plugin/carla-vst.cpp | 50 ++++++++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/source/plugin/Makefile b/source/plugin/Makefile index 4a5f35cf7..1a8e2e526 100644 --- a/source/plugin/Makefile +++ b/source/plugin/Makefile @@ -53,6 +53,10 @@ ifeq ($(MACOS),true) LIBS += $(MODULEDIR)/juce_gui_extra.a endif +ifeq ($(HAVE_ZYN_DEPS),true) +LIBS += $(MODULEDIR)/rtosc.a +endif + # ---------------------------------------------------------------------------------------------------------------------------- # Link flags diff --git a/source/plugin/carla-vst.cpp b/source/plugin/carla-vst.cpp index 688e56d19..34ddb8331 100644 --- a/source/plugin/carla-vst.cpp +++ b/source/plugin/carla-vst.cpp @@ -191,7 +191,7 @@ public: fSampleRate = opt; if (fDescriptor->dispatcher != nullptr) - fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, (float)fSampleRate); + fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, opt); break; case effSetBlockSize: @@ -211,9 +211,31 @@ public: carla_zeroStruct(fTimeInfo); // tell host we want MIDI events - fAudioMaster(fEffect, audioMasterWantMidi, 0, 0, nullptr, 0.0f); + masterCallback(audioMasterWantMidi); - CARLA_SAFE_ASSERT_BREAK(! fIsActive); + // deactivate for possible changes + if (fDescriptor->deactivate != nullptr && fIsActive) + fDescriptor->deactivate(fHandle); + + // check if something changed + const uint32_t bufferSize = static_cast(masterCallback(audioMasterGetBlockSize)); + const double sampleRate = static_cast(masterCallback(audioMasterGetSampleRate)); + + if (fBufferSize != bufferSize) + { + fBufferSize = bufferSize; + + if (fDescriptor->dispatcher != nullptr) + fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_BUFFER_SIZE_CHANGED, 0, (int32_t)value, nullptr, 0.0f); + } + + if (! carla_compareFloats(fSampleRate, sampleRate)) + { + fSampleRate = sampleRate; + + if (fDescriptor->dispatcher != nullptr) + fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, (float)sampleRate); + } if (fDescriptor->activate != nullptr) fDescriptor->activate(fHandle); @@ -248,14 +270,14 @@ public: // check if vst host is tracktion carla_zeroChar(strBuf, 0xff+1); - fAudioMaster(fEffect, audioMasterGetProductString, 0, 0, strBuf, 0); + masterCallback(audioMasterGetProductString, 0, 0, strBuf, 0.0f); const bool isTracktion(std::strcmp(strBuf, "Tracktion") == 0); // if vst host is tracktion, delay UI appearance for a bit (part 1) if (isTracktion) { - fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_NULL, 0xDEADF00D, 0xC0C0B00B, nullptr, 0.0f); + fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_NULL, (int32_t)0xDEADF00D, 0xC0C0B00B, nullptr, 0.0f); } // show UI now @@ -271,7 +293,7 @@ public: for (int x=10; --x>=0;) { - fAudioMaster(fEffect, audioMasterIdle, 0, 0, nullptr, 0); + masterCallback(audioMasterIdle); carla_msleep(25); } } @@ -401,7 +423,7 @@ public: static const int kWantVstTimeFlags(kVstTransportPlaying|kVstPpqPosValid|kVstTempoValid|kVstTimeSigValid); - if (const VstTimeInfo* const vstTimeInfo = (const VstTimeInfo*)fAudioMaster(fEffect, audioMasterGetTime, 0, kWantVstTimeFlags, nullptr, 0.0f)) + if (const VstTimeInfo* const vstTimeInfo = (const VstTimeInfo*)masterCallback(audioMasterGetTime, 0, kWantVstTimeFlags)) { fTimeInfo.frame = static_cast(vstTimeInfo->samplePos); fTimeInfo.playing = (vstTimeInfo->flags & kVstTransportPlaying); @@ -447,7 +469,7 @@ public: fMidiEventCount = 0; if (fMidiOutEvents.numEvents > 0) - fAudioMaster(fEffect, audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f); + masterCallback(audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f); } protected: @@ -536,7 +558,7 @@ protected: break; case NATIVE_HOST_OPCODE_HOST_IDLE: - fAudioMaster(fEffect, audioMasterIdle, 0, 0, nullptr, 0.0f); + masterCallback(audioMasterIdle); break; } @@ -567,6 +589,16 @@ private: NativeTimeInfo fTimeInfo; ERect fVstRect; + // host callback + intptr_t masterCallback(const int32_t opcode, + const int32_t index = 0, + const intptr_t value = 0, + void* const ptr = nullptr, + const float opt = 0.0f) + { + return fAudioMaster(fEffect, opcode, index, value, ptr, opt); + } + struct FixedVstEvents { int32_t numEvents; intptr_t reserved;