void setParameterValue(const uint32_t index, const float realValue) { const ParameterRanges& ranges(fPlugin->getParameterRanges(index)); const float perValue(ranges.getNormalizedValue(realValue)); fPlugin->setParameterValue(index, realValue); hostCallback(audioMasterAutomate, index, 0, nullptr, perValue); }
inline VstTimeInfo* GetTimeInfo(audioMasterCallback hostCallback, AEffect* pAEffect, int filter = 0) { #pragma warning(disable:4312) // Pointer size cast mismatch. VstTimeInfo* pTI = (VstTimeInfo*) hostCallback(pAEffect, audioMasterGetTime, 0, filter, 0, 0); #pragma warning(default:4312) if (pTI && (!filter || (pTI->flags & filter))) { return pTI; } return 0; }
UIVst(const audioMasterCallback audioMaster, AEffect* const effect, UiHelper* const uiHelper, PluginExporter* const plugin, const intptr_t winId) : fAudioMaster(audioMaster), fEffect(effect), fUiHelper(uiHelper), fPlugin(plugin), fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()), fShouldCaptureVstKeys(false) { // FIXME only needed for windows? //#ifdef DISTRHO_OS_WINDOWS char strBuf[0xff+1]; std::memset(strBuf, 0, sizeof(char)*(0xff+1)); hostCallback(audioMasterGetProductString, 0, 0, strBuf); d_stdout("Plugin UI running in '%s'", strBuf); // TODO make a white-list of needed hosts if (/*std::strcmp(strBuf, "") == 0*/ true) fShouldCaptureVstKeys = true; //#endif }
void vst_processReplacing(const float** const inputs, float** const outputs, const int32_t sampleFrames) { if (sampleFrames <= 0) return; if (! fPlugin.isActive()) { // host has not activated the plugin yet, nasty! vst_dispatcher(effMainsChanged, 0, 1, nullptr, 0.0f); } #if DISTRHO_PLUGIN_WANT_TIMEPOS static const int kWantVstTimeFlags(kVstTransportPlaying|kVstPpqPosValid|kVstTempoValid|kVstTimeSigValid); if (const VstTimeInfo* const vstTimeInfo = (const VstTimeInfo*)hostCallback(audioMasterGetTime, 0, kWantVstTimeFlags)) { fTimePosition.frame = vstTimeInfo->samplePos; fTimePosition.playing = (vstTimeInfo->flags & kVstTransportPlaying); fTimePosition.bbt.valid = ((vstTimeInfo->flags & kVstTempoValid) != 0 || (vstTimeInfo->flags & kVstTimeSigValid) != 0); // ticksPerBeat is not possible with VST fTimePosition.bbt.ticksPerBeat = 960.0; if (vstTimeInfo->flags & kVstTempoValid) fTimePosition.bbt.beatsPerMinute = vstTimeInfo->tempo; else fTimePosition.bbt.beatsPerMinute = 120.0; if (vstTimeInfo->flags & (kVstPpqPosValid|kVstTimeSigValid)) { const int ppqPerBar = vstTimeInfo->timeSigNumerator * 4 / vstTimeInfo->timeSigDenominator; const double barBeats = (std::fmod(vstTimeInfo->ppqPos, ppqPerBar) / ppqPerBar) * vstTimeInfo->timeSigDenominator; const double rest = std::fmod(barBeats, 1.0); fTimePosition.bbt.bar = int(vstTimeInfo->ppqPos)/ppqPerBar + 1; fTimePosition.bbt.beat = barBeats-rest+1; fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; fTimePosition.bbt.beatsPerBar = vstTimeInfo->timeSigNumerator; fTimePosition.bbt.beatType = vstTimeInfo->timeSigDenominator; } else { fTimePosition.bbt.bar = 1; fTimePosition.bbt.beat = 1; fTimePosition.bbt.tick = 0; fTimePosition.bbt.beatsPerBar = 4.0f; fTimePosition.bbt.beatType = 4.0f; } fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*fTimePosition.bbt.beatsPerBar*(fTimePosition.bbt.bar-1); fPlugin.setTimePosition(fTimePosition); } #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT fPlugin.run(inputs, outputs, sampleFrames, fMidiEvents, fMidiEventCount); fMidiEventCount = 0; #else fPlugin.run(inputs, outputs, sampleFrames); #endif #if DISTRHO_PLUGIN_HAS_UI if (fVstUI == nullptr) return; for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) { if (fPlugin.isParameterOutput(i)) setParameterValueFromPlugin(i, fPlugin.getParameterValue(i)); } #endif }
void setSize(const uint width, const uint height) { fUI.setWindowSize(width, height); hostCallback(audioMasterSizeWindow, width, height); }
void editParameter(const uint32_t index, const bool started) { hostCallback(started ? audioMasterBeginEdit : audioMasterEndEdit, index); }