mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10:06 +02:00
This gets meter type VST effects working again by extending the The master now maintains his own internal buffers and sums (mixes) all playing tracks into those buffers. The buffers are then fed into the VST effect that is presented to the user. This allows the effect to provide feedback to the user if it support it. Such effects may display meters or clipping indicators. Several issues with treading have also been corrected (hopefully ;-)). These showed up mostly on Linux, but could have happened on the others as well. The realtime support is no longer limited to 2 channels per logical track. Once support for more channels is added, this should be ready for it. The rack dialog can now be toggled via the edit toolbar button. It doesn't stay pressed because the closing of the dialog would have to be communicated back to the toolbar. As the rack is updated with new or removed effects or active state changed, all effects in the active list were shutdown and all effects in the updated list were initialized. This now shuts down only the effects no longer in the list and initializes only new ones. The rack now uses wxBitmapButton instead of Audacity's AButton. The AButton has a timing issue that prevents it from being deleted while processing the click event. I looked into it, but gave up and switched to the wxBitmapButton. Unfortunately, there's a problem with the wxBitmapButton as well...at least on my setup here. Either the bitmaps are being scaled or antialiased. Will have to get feedback on this. I finally figured out why some VSTs didn't seem to do anything in realtime, at least in my case anyway. I've installed a lot of demo VSTs and while they work in "batch/offline" mode, some of them will not work in realtime since vendors tend to remove automation as one of the demo limitations. More changes coming shortly...
350 lines
9.8 KiB
C++
350 lines
9.8 KiB
C++
/*
|
|
* aeffectx.h - simple header to allow VeSTige compilation and eventually work
|
|
*
|
|
* Copyright (c) 2006 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
|
|
*
|
|
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
|
*
|
|
* 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 (at your option) 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public
|
|
* License along with this program (see COPYING); if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef _AEFFECTX_H
|
|
#define _AEFFECTX_H
|
|
|
|
#define CCONST(a, b, c, d)( ( ( (int) a ) << 24 ) | \
|
|
( ( (int) b ) << 16 ) | \
|
|
( ( (int) c ) << 8 ) | \
|
|
( ( (int) d ) << 0 ) )
|
|
|
|
const int audioMasterAutomate = 0;
|
|
const int audioMasterVersion = 1;
|
|
const int audioMasterCurrentId = 2;
|
|
const int audioMasterIdle = 3;
|
|
const int audioMasterPinConnected = 4;
|
|
// unsupported? 5
|
|
const int audioMasterWantMidi = 6;
|
|
const int audioMasterGetTime = 7;
|
|
const int audioMasterProcessEvents = 8;
|
|
const int audioMasterSetTime = 9;
|
|
const int audioMasterTempoAt = 10;
|
|
const int audioMasterGetNumAutomatableParameters = 11;
|
|
const int audioMasterGetParameterQuantization = 12;
|
|
const int audioMasterIOChanged = 13;
|
|
const int audioMasterNeedIdle = 14;
|
|
const int audioMasterSizeWindow = 15;
|
|
const int audioMasterGetSampleRate = 16;
|
|
const int audioMasterGetBlockSize = 17;
|
|
const int audioMasterGetInputLatency = 18;
|
|
const int audioMasterGetOutputLatency = 19;
|
|
const int audioMasterGetPreviousPlug = 20;
|
|
const int audioMasterGetNextPlug = 21;
|
|
const int audioMasterWillReplaceOrAccumulate = 22;
|
|
const int audioMasterGetCurrentProcessLevel = 23;
|
|
const int audioMasterGetAutomationState = 24;
|
|
const int audioMasterOfflineStart = 25;
|
|
const int audioMasterOfflineRead = 26;
|
|
const int audioMasterOfflineWrite = 27;
|
|
const int audioMasterOfflineGetCurrentPass = 28;
|
|
const int audioMasterOfflineGetCurrentMetaPass = 29;
|
|
const int audioMasterSetOutputSampleRate = 30;
|
|
// unsupported? 31
|
|
const int audioMasterGetSpeakerArrangement = 31; // deprecated in 2.4?
|
|
const int audioMasterGetVendorString = 32;
|
|
const int audioMasterGetProductString = 33;
|
|
const int audioMasterGetVendorVersion = 34;
|
|
const int audioMasterVendorSpecific = 35;
|
|
const int audioMasterSetIcon = 36;
|
|
const int audioMasterCanDo = 37;
|
|
const int audioMasterGetLanguage = 38;
|
|
const int audioMasterOpenWindow = 39;
|
|
const int audioMasterCloseWindow = 40;
|
|
const int audioMasterGetDirectory = 41;
|
|
const int audioMasterUpdateDisplay = 42;
|
|
const int audioMasterBeginEdit = 43;
|
|
const int audioMasterEndEdit = 44;
|
|
const int audioMasterOpenFileSelector = 45;
|
|
const int audioMasterCloseFileSelector = 46; // currently unused
|
|
const int audioMasterEditFile = 47; // currently unused
|
|
const int audioMasterGetChunkFile = 48; // currently unused
|
|
const int audioMasterGetInputSpeakerArrangement = 49; // currently unused
|
|
|
|
const int effFlagsHasEditor = 1;
|
|
const int effFlagsCanReplacing = 1 << 4; // very likely
|
|
const int effFlagsProgramChunks = 1 << 5; // from Ardour
|
|
const int effFlagsIsSynth = 1 << 8; // currently unused
|
|
|
|
const int effOpen = 0;
|
|
const int effClose = 1; // currently unused
|
|
const int effSetProgram = 2; // currently unused
|
|
const int effGetProgram = 3; // currently unused
|
|
// The next one was gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
|
|
const int effSetProgramName = 4;
|
|
const int effGetProgramName = 5; // currently unused
|
|
// The next two were gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
|
|
const int effGetParamLabel = 6;
|
|
const int effGetParamDisplay = 7;
|
|
const int effGetParamName = 8; // currently unused
|
|
const int effSetSampleRate = 10;
|
|
const int effSetBlockSize = 11;
|
|
const int effMainsChanged = 12;
|
|
const int effEditGetRect = 13;
|
|
const int effEditOpen = 14;
|
|
const int effEditClose = 15;
|
|
const int effEditIdle = 19;
|
|
const int effEditTop = 20;
|
|
const int effIdentify = 22; // from http://www.asseca.org/vst-24-specs/efIdentify.html
|
|
const int effGetChunk = 23; // from Ardour
|
|
const int effSetChunk = 24; // from Ardour
|
|
const int effProcessEvents = 25;
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efCanBeAutomated.html
|
|
const int effCanBeAutomated = 26;
|
|
// The next one was gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
|
|
const int effGetProgramNameIndexed = 29;
|
|
const int effGetEffectName = 45;
|
|
const int effGetParameterProperties = 56; // missing
|
|
const int effGetVendorString = 47;
|
|
const int effGetProductString = 48;
|
|
const int effGetVendorVersion = 49;
|
|
const int effCanDo = 51; // currently unused
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efIdle.html
|
|
const int effIdle = 53;
|
|
const int effGetVstVersion = 58; // currently unused
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginSetProgram.html
|
|
const int effBeginSetProgram = 67;
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efEndSetProgram.html
|
|
const int effEndSetProgram = 68;
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginLoadBank.html
|
|
const int effBeginLoadBank = 75;
|
|
// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginLoadProgram.html
|
|
const int effBeginLoadProgram = 76;
|
|
|
|
// The next two were gleaned from http://www.kvraudio.com/forum/printview.php?t=143587&start=0
|
|
const int effStartProcess = 71;
|
|
const int effStopProcess = 72;
|
|
|
|
const int kEffectMagic = CCONST( 'V', 's', 't', 'P' );
|
|
const int kVstLangEnglish = 1;
|
|
const int kVstMidiType = 1;
|
|
|
|
const int kVstNanosValid = 1 << 8;
|
|
const int kVstPpqPosValid = 1 << 9;
|
|
const int kVstTempoValid = 1 << 10;
|
|
const int kVstBarsValid = 1 << 11;
|
|
const int kVstCyclePosValid = 1 << 12;
|
|
const int kVstTimeSigValid = 1 << 13;
|
|
const int kVstSmpteValid = 1 << 14; // from Ardour
|
|
const int kVstClockValid = 1 << 15; // from Ardour
|
|
|
|
const int kVstTransportPlaying = 1 << 1;
|
|
const int kVstTransportCycleActive = 1 << 2;
|
|
const int kVstTransportChanged = 1;
|
|
|
|
|
|
class RemoteVstPlugin;
|
|
|
|
|
|
class VstMidiEvent
|
|
{
|
|
public:
|
|
// 00
|
|
int type;
|
|
// 04
|
|
int byteSize;
|
|
// 08
|
|
int deltaFrames;
|
|
// 0c?
|
|
int flags;
|
|
// 10?
|
|
int noteLength;
|
|
// 14?
|
|
int noteOffset;
|
|
// 18
|
|
char midiData[4];
|
|
// 1c?
|
|
char detune;
|
|
// 1d?
|
|
char noteOffVelocity;
|
|
// 1e?
|
|
char reserved1;
|
|
// 1f?
|
|
char reserved2;
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
class VstEvent
|
|
{
|
|
char dump[sizeof( VstMidiEvent )];
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
class VstEvents
|
|
{
|
|
public:
|
|
// 00
|
|
int numEvents;
|
|
// 04
|
|
void *reserved;
|
|
// 08
|
|
VstEvent* events[1];
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
// Not finished, neither really used
|
|
class VstParameterProperties
|
|
{
|
|
public:
|
|
/* float stepFloat;
|
|
char label[64];
|
|
int flags;
|
|
int minInteger;
|
|
int maxInteger;
|
|
int stepInteger;
|
|
char shortLabel[8];
|
|
int category;
|
|
char categoryLabel[24];
|
|
char empty[128];*/
|
|
|
|
float stepFloat;
|
|
float smallStepFloat;
|
|
float largeStepFloat;
|
|
char label[64];
|
|
unsigned int flags;
|
|
unsigned int minInteger;
|
|
unsigned int maxInteger;
|
|
unsigned int stepInteger;
|
|
unsigned int largeStepInteger;
|
|
char shortLabel[8];
|
|
unsigned short displayIndex;
|
|
unsigned short category;
|
|
unsigned short numParametersInCategory;
|
|
unsigned short reserved;
|
|
char categoryLabel[24];
|
|
char future[16];
|
|
|
|
} ;
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
class AEffect
|
|
{
|
|
public:
|
|
// Never use virtual functions!!!
|
|
// 00-03
|
|
int magic;
|
|
// dispatcher 04-07
|
|
intptr_t (* dispatcher)( AEffect * , int , int , intptr_t, void * , float );
|
|
// process, quite sure 08-0b
|
|
void (* process)( AEffect * , float * * , float * * , int );
|
|
// setParameter 0c-0f
|
|
void (* setParameter)( AEffect * , int , float );
|
|
// getParameter 10-13
|
|
float (* getParameter)( AEffect * , int );
|
|
// programs 14-17
|
|
int numPrograms;
|
|
// Params 18-1b
|
|
int numParams;
|
|
// Input 1c-1f
|
|
int numInputs;
|
|
// Output 20-23
|
|
int numOutputs;
|
|
// flags 24-27
|
|
int flags;
|
|
// Fill somewhere 28-2b
|
|
void * ptr1;
|
|
void * ptr2;
|
|
int initialDelay;
|
|
// Zeroes 34-37 38-3b
|
|
int empty3a;
|
|
int empty3b;
|
|
// 1.0f 3c-3f
|
|
float unkown_float;
|
|
// An object? pointer 40-43
|
|
void *ptr3;
|
|
// Zeroes 44-47
|
|
void *user;
|
|
// Id 48-4b
|
|
int32_t uniqueID;
|
|
int32_t version;
|
|
// processReplacing 50-53
|
|
void (* processReplacing)( AEffect * , float * * , float * * , int );
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
class VstTimeInfo
|
|
{
|
|
public:
|
|
// 00
|
|
double samplePos;
|
|
// 08
|
|
double sampleRate;
|
|
// 10
|
|
double nanoSeconds;
|
|
// 18
|
|
double ppqPos;
|
|
// 20?
|
|
double tempo;
|
|
// 28
|
|
double barStartPos;
|
|
// 30?
|
|
double cycleStartPos;
|
|
// 38?
|
|
double cycleEndPos;
|
|
// 40?
|
|
int timeSigNumerator;
|
|
// 44?
|
|
int timeSigDenominator;
|
|
// unconfirmed 48 4c 50
|
|
char empty3[4 + 4 + 4];
|
|
// 54
|
|
int flags;
|
|
|
|
} ;
|
|
|
|
|
|
|
|
typedef intptr_t (* audioMasterCallback)( AEffect * , int32_t, int32_t, intptr_t, void * , float );
|
|
|
|
|
|
// from http://www.asseca.org/vst-24-specs/efGetParameterProperties.html
|
|
enum VstParameterFlags
|
|
{
|
|
kVstParameterIsSwitch = 1 << 0, // parameter is a switch (on/off)
|
|
kVstParameterUsesIntegerMinMax = 1 << 1, // minInteger, maxInteger valid
|
|
kVstParameterUsesFloatStep = 1 << 2, // stepFloat, smallStepFloat, largeStepFloat valid
|
|
kVstParameterUsesIntStep = 1 << 3, // stepInteger, largeStepInteger valid
|
|
kVstParameterSupportsDisplayIndex = 1 << 4, // displayIndex valid
|
|
kVstParameterSupportsDisplayCategory = 1 << 5, // category, etc. valid
|
|
kVstParameterCanRamp = 1 << 6 // set if parameter value can ramp up/down
|
|
};
|
|
|
|
|
|
#endif
|