diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp index 68644c63..13eca4bf 100644 --- a/distrho/src/DistrhoPluginVST3.cpp +++ b/distrho/src/DistrhoPluginVST3.cpp @@ -54,7 +54,7 @@ * - append MIDI input events in a sorted way * == BUSES * - bus arrangements - * - optional audio buses, create dummy buffer of max_block_size length for them + * - optional audio buses * - routing info, do we care? * - set sidechain bus name from port group * == CV @@ -263,6 +263,7 @@ public: fParameterCount(fPlugin.getParameterCount()), fVst3ParameterCount(fParameterCount + kVst3InternalParameterCount), fCachedParameterValues(nullptr), + fDummyAudioBuffer(nullptr), fParameterValuesChangedDuringProcessing(nullptr) #if DISTRHO_PLUGIN_HAS_UI , fParameterValueChangesForUI(nullptr) @@ -371,18 +372,18 @@ public: #endif } -#if DISTRHO_PLUGIN_WANT_STATE + #if DISTRHO_PLUGIN_WANT_STATE for (uint32_t i=0, count=fPlugin.getStateCount(); i= 0); fCurrentProgram = static_cast(program); fPlugin.loadProgram(fCurrentProgram); -# if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI if (connectedToUI) { fParameterValueChangesForUI[kVst3InternalParameterProgram] = false; sendParameterSetToUI(kVst3InternalParameterProgram, program); } -# endif -#endif + #endif + #endif } else if (queryingType == 's') { d_stdout("found state '%s' '%s'", key.buffer(), value.buffer()); -#if DISTRHO_PLUGIN_WANT_STATE + #if DISTRHO_PLUGIN_WANT_STATE if (fPlugin.wantStateKey(key)) { fStateMap[key] = value; fPlugin.setState(key, value); -# if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI if (connectedToUI) sendStateSetToUI(key, value); -# endif + #endif } -#endif + #endif } else if (queryingType == 'p') { @@ -843,13 +844,13 @@ public: fvalue = std::atof(value.buffer()); fCachedParameterValues[kVst3InternalParameterBaseCount + j] = fvalue; -#if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI if (connectedToUI) { // UI parameter updates are handled outside the read loop (after host param restart) fParameterValueChangesForUI[kVst3InternalParameterBaseCount + j] = true; } -#endif + #endif fPlugin.setParameterValue(j, fvalue); break; } @@ -865,7 +866,7 @@ public: if (fComponentHandler != nullptr) v3_cpp_obj(fComponentHandler)->restart_component(fComponentHandler, V3_RESTART_PARAM_VALUES_CHANGED); -#if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI if (connectedToUI) { for (uint32_t i=0; iwrite(stream, &buffer, 1, &ignored); } -#if DISTRHO_PLUGIN_WANT_FULL_STATE + #if DISTRHO_PLUGIN_WANT_FULL_STATE // Update current state for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { const String& key = cit->first; fStateMap[key] = fPlugin.getState(key); } -#endif + #endif String state; -#if DISTRHO_PLUGIN_WANT_PROGRAMS + #if DISTRHO_PLUGIN_WANT_PROGRAMS { String tmpStr("__dpf_program__\xff"); tmpStr += String(fCurrentProgram); @@ -917,9 +918,9 @@ public: state += tmpStr; } -#endif + #endif -#if DISTRHO_PLUGIN_WANT_STATE + #if DISTRHO_PLUGIN_WANT_STATE if (stateCount != 0) { state += "__dpf_state_begin__\xff"; @@ -941,7 +942,7 @@ public: state += "__dpf_state_end__\xff"; } -#endif + #endif if (paramCount != 0) { @@ -1015,11 +1016,11 @@ public: uint32_t getLatencySamples() const noexcept { -#if DISTRHO_PLUGIN_WANT_LATENCY + #if DISTRHO_PLUGIN_WANT_LATENCY return fPlugin.getLatency(); -#else + #else return 0; -#endif + #endif } v3_result setupProcessing(v3_process_setup* const setup) @@ -1048,7 +1049,7 @@ public: if (active) fPlugin.activate(); - // TODO create dummy buffer of max_block_size length, to use for disabled buses + fDummyAudioBuffer = new float[setup->max_block_size]; return V3_OK; } @@ -1063,6 +1064,9 @@ public: else { fPlugin.deactivateIfNeeded(); + + delete[] fDummyAudioBuffer; + fDummyAudioBuffer = nullptr; } return V3_OK; @@ -1142,6 +1146,8 @@ public: const float* inputs[DISTRHO_PLUGIN_NUM_INPUTS != 0 ? DISTRHO_PLUGIN_NUM_INPUTS : 1]; /* */ float* outputs[DISTRHO_PLUGIN_NUM_OUTPUTS != 0 ? DISTRHO_PLUGIN_NUM_OUTPUTS : 1]; + std::memset(fDummyAudioBuffer, 0, sizeof(float)*data->nframes); + { int32_t i = 0; if (data->inputs != nullptr) @@ -1153,7 +1159,7 @@ public: } } for (; i < std::max(1, DISTRHO_PLUGIN_NUM_INPUTS); ++i) - inputs[i] = nullptr; // TODO use dummy buffer + inputs[i] = fDummyAudioBuffer; } { @@ -1167,17 +1173,17 @@ public: } } for (; i < std::max(1, DISTRHO_PLUGIN_NUM_OUTPUTS); ++i) - outputs[i] = nullptr; // TODO use dummy buffer + outputs[i] = fDummyAudioBuffer; } -#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT fHostEventOutputHandle = data->output_events; -#endif + #endif -#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT uint32_t midiEventCount = 0; -# if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI while (fNotesRingBuffer.isDataAvailableForReading()) { uint8_t midiData[3]; @@ -1192,7 +1198,7 @@ public: if (midiEventCount == kMaxMidiEvents) break; } -# endif + #endif if (v3_event_list** const eventptr = data->input_events) { @@ -1296,7 +1302,7 @@ public: } #endif */ -#endif + #endif // if there are any parameter changes at frame 0, set them here if (v3_param_changes** const inparamsptr = data->input_params) @@ -2167,6 +2173,7 @@ private: const uint32_t fParameterCount; const uint32_t fVst3ParameterCount; // full offset + real float* fCachedParameterValues; // basic offset + real + float* fDummyAudioBuffer; bool* fParameterValuesChangedDuringProcessing; // basic offset + real #if DISTRHO_PLUGIN_HAS_UI bool* fParameterValueChangesForUI; // basic offset + real @@ -2248,9 +2255,9 @@ private: } fCachedParameterValues[kVst3InternalParameterBaseCount + i] = curValue; -#if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI fParameterValueChangesForUI[kVst3InternalParameterBaseCount + i] = true; -#endif + #endif paramId = kVst3InternalParameterCount + i; curValue = fPlugin.getParameterRanges(i).getNormalizedValue(curValue); @@ -2259,7 +2266,7 @@ private: break; } -#if DISTRHO_PLUGIN_WANT_LATENCY + #if DISTRHO_PLUGIN_WANT_LATENCY const uint32_t latency = fPlugin.getLatency(); if (fLastKnownLatency != latency) @@ -2270,7 +2277,7 @@ private: fCachedParameterValues[kVst3InternalParameterLatency]); addParameterDataToHostOutputEvents(outparamsptr, kVst3InternalParameterLatency, curValue); } -#endif + #endif } bool addParameterDataToHostOutputEvents(v3_param_changes** const outparamsptr,