martin@12: #ifndef __ClassicAmbiDec__ martin@12: #include "ClassicAmbiDec.h" martin@12: #endif martin@12: //C++ Headers martin@12: #include martin@12: #include martin@12: #include martin@12: martin@12: //GUI Headers martin@12: #include "aeffguieditor.h" martin@12: martin@12: martin@12: //----------------------------------------------------------------------------- martin@12: ClassicAmbiDecProgram::ClassicAmbiDecProgram() martin@12: { martin@12: martin@12: } martin@12: martin@12: martin@12: martin@12: //----------------------------------------------------------------------------- martin@12: ClassicAmbiDec::ClassicAmbiDec (audioMasterCallback audioMaster) martin@12: : AudioEffectX (audioMaster, kNumPrograms, kNumParameters) martin@12: { martin@12: martin@12: martin@12: //Set the number of input and output channels martin@12: setNumInputs (4); // 4 Channel Classic B-Format Input martin@12: setNumOutputs (MAX_CHANNELS); // MAX_CHANNELS 5.1 Output martin@12: martin@12: //Initially set the number of inputs and outputs incase (set|get)SpeakerArrangement isn't called martin@12: numberInputs=4; martin@12: numberOutputs=MAX_CHANNELS; martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr31Cine; martin@12: martin@12: setUniqueID ('MMca'); martin@12: canDoubleReplacing(); //Plugin can use process double replacing martin@12: canProcessReplacing(); //Plugin can use process replacing martin@12: noTail (); martin@12: martin@12: bool bit64 = setProcessPrecision(kVstProcessPrecision64); martin@12: if (bit64==true) { martin@12: bits=64; martin@12: } martin@12: else{ martin@12: bits=32; martin@12: } martin@12: martin@12: martin@12: // Declare any variables to their default values martin@12: fMode = 0.f; martin@12: fWidth = 0.5f; martin@12: fPattern = 0.5f; martin@12: fRotate = 0.5f; martin@12: fTilt = 0.5f; martin@12: fTumble = 0.5f; martin@12: fZoom = 0.5f; martin@12: fZoomMethod = 0.f; martin@12: fRearVerb = 0.f; martin@12: fHiVerb = 0.f; martin@12: fCentrePattern =0.5f; martin@12: fCentreGain = 0.75f; martin@12: fSubGain = 0.75f; martin@12: fFc = 5.0f/11.0f; martin@12: fSurroundMode = 0.f; martin@12: fSurroundPattern = 0.5; martin@12: fSurroundWidth = 2.f/3.f; martin@12: fSurroundGain = 0.75f; martin@12: fDecoderMode = 0.f; martin@12: fChannelOrder = 1.f; martin@12: martin@12: myDecoder.Fs = sampleRate; martin@12: myDecoder.filterCoefs(); martin@12: martin@12: martin@12: programs_20 = new ClassicAmbiDecProgram[kNumParameters]; martin@12: programs_21 = new ClassicAmbiDecProgram[kNumParameters]; martin@12: programs_40 = new ClassicAmbiDecProgram[kNumParameters]; martin@12: programs_50 = new ClassicAmbiDecProgram[kNumParameters]; martin@12: programs_51 = new ClassicAmbiDecProgram[kNumParameters]; martin@12: martin@12: //Initailise all the programs martin@12: //Stereo Mode martin@12: //Name martin@12: vst_strncpy (programs_20[0].name, "Stereo XY Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_20[1].name, "Stereo MS Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_20[2].name, "Stereo Blumlein Fig8s",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_20[3].name, "Stereo XY with 'Verb",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_20[4].name, "Stereo MS with 'Verb",kVstMaxProgNameLen); martin@12: //Mode martin@12: programs_20[0].mode = 0.f; martin@12: programs_20[1].mode = 1.f; martin@12: programs_20[2].mode = 0.f; martin@12: programs_20[3].mode = 0.f; martin@12: programs_20[4].mode = 1.f; martin@12: //Width martin@12: programs_20[0].width = (1.f/3.f); martin@12: programs_20[1].width = (1.f/3.f); martin@12: programs_20[2].width = 0.5f; martin@12: programs_20[3].width = (1.f/3.f); martin@12: programs_20[4].width = (1.f/3.f); martin@12: //Pattern martin@12: programs_20[0].pattern = 0.5f; martin@12: programs_20[1].pattern = 0.5f; martin@12: programs_20[2].pattern = 0.f; martin@12: programs_20[3].pattern = 0.5f; martin@12: programs_20[4].pattern = 0.5f; martin@12: //RearVerb martin@12: programs_20[0].rearVerb = 0.f; martin@12: programs_20[1].rearVerb = 0.f; martin@12: programs_20[2].rearVerb = 0.f; martin@12: programs_20[3].rearVerb = 0.75f; martin@12: programs_20[4].rearVerb = 0.75f; martin@12: //HiVerb martin@12: programs_20[0].hiVerb = 0.f; martin@12: programs_20[1].hiVerb = 0.f; martin@12: programs_20[2].hiVerb = 0.f; martin@12: programs_20[3].hiVerb = 0.25f; martin@12: programs_20[4].hiVerb = 0.25f; martin@12: martin@12: martin@12: //2.1 Mode martin@12: //Name martin@12: vst_strncpy (programs_21[0].name, "2.1 XY Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_21[1].name, "2.1 MS Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_21[2].name, "2.1 Blumlein Fig8s",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_21[3].name, "2.1 XY with 'Verb",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_21[4].name, "2.1 MS with 'Verb",kVstMaxProgNameLen); martin@12: //Mode martin@12: programs_21[0].mode = 0.f; martin@12: programs_21[1].mode = 1.f; martin@12: programs_21[2].mode = 0.f; martin@12: programs_21[3].mode = 0.f; martin@12: programs_21[4].mode = 1.f; martin@12: //Width martin@12: programs_21[0].width = (1.f/3.f); martin@12: programs_21[1].width = (1.f/3.f); martin@12: programs_21[2].width = 0.5f; martin@12: programs_21[3].width = (1.f/3.f); martin@12: programs_21[4].width = (1.f/3.f); martin@12: //Pattern martin@12: programs_21[0].pattern = 0.5f; martin@12: programs_21[1].pattern = 0.5f; martin@12: programs_21[2].pattern = 0.f; martin@12: programs_21[3].pattern = 0.5f; martin@12: programs_21[4].pattern = 0.5f; martin@12: //RearVerb martin@12: programs_21[0].rearVerb = 0.f; martin@12: programs_21[1].rearVerb = 0.f; martin@12: programs_21[2].rearVerb = 0.f; martin@12: programs_21[3].rearVerb = 0.75f; martin@12: programs_21[4].rearVerb = 0.75f; martin@12: //HiVerb martin@12: programs_21[0].hiVerb = 0.f; martin@12: programs_21[1].hiVerb = 0.f; martin@12: programs_21[2].hiVerb = 0.f; martin@12: programs_21[3].hiVerb = 0.25f; martin@12: programs_21[4].hiVerb = 0.25f; martin@12: //SubGain martin@12: programs_21[0].subGain = 0.75f; martin@12: programs_21[1].subGain = 0.75f; martin@12: programs_21[2].subGain = 0.75f; martin@12: programs_21[3].subGain = 0.75f; martin@12: programs_21[4].subGain = 0.75f; martin@12: //FC martin@12: programs_21[0].fc = 5.0f/11.0f; martin@12: programs_21[1].fc = 5.0f/11.0f; martin@12: programs_21[2].fc = 5.0f/11.0f; martin@12: programs_21[3].fc = 5.0f/11.0f; martin@12: programs_21[4].fc = 5.0f/11.0f; martin@12: martin@12: martin@12: martin@12: //Quad Mode martin@12: //Name martin@12: vst_strncpy (programs_40[0].name, "Quad XY Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_40[1].name, "Quad MS Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_40[2].name, "Quad Blumlein Fig8s",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_40[3].name, "Quad XY with MS",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_40[4].name, "Quad MS with XY",kVstMaxProgNameLen); martin@12: //Mode martin@12: programs_40[0].mode = 0.f; martin@12: programs_40[1].mode = 1.f; martin@12: programs_40[2].mode = 0.f; martin@12: programs_40[3].mode = 0.f; martin@12: programs_40[4].mode = 1.f; martin@12: //Width martin@12: programs_40[0].width = (1.f/3.f); martin@12: programs_40[1].width = (1.f/3.f); martin@12: programs_40[2].width = 0.5f; martin@12: programs_40[3].width = (1.f/3.f); martin@12: programs_40[4].width = (1.f/3.f); martin@12: //Pattern martin@12: programs_40[0].pattern = 0.5f; martin@12: programs_40[1].pattern = 0.5f; martin@12: programs_40[2].pattern = 0.f; martin@12: programs_40[3].pattern = 0.5f; martin@12: programs_40[4].pattern = 0.5f; martin@12: //Surround Mode martin@12: programs_40[0].surroundMode = 0.f; martin@12: programs_40[1].surroundMode = 1.f; martin@12: programs_40[2].surroundMode = 0.f; martin@12: programs_40[3].surroundMode = 1.f; martin@12: programs_40[4].surroundMode = 0.f; martin@12: //Surround Width martin@12: programs_40[0].surroundWidth = (5.5f/9.f); martin@12: programs_40[1].surroundWidth = (5.5f/9.f); martin@12: programs_40[2].surroundWidth = 0.5f; martin@12: programs_40[3].surroundWidth = (5.5f/9.f); martin@12: programs_40[4].surroundWidth = (5.5f/9.f); martin@12: //Surround Pattern martin@12: programs_40[0].surroundPattern = 0.5; martin@12: programs_40[1].surroundPattern = 0.5; martin@12: programs_40[2].surroundPattern = 0.0; martin@12: programs_40[0].surroundPattern = 0.25; martin@12: programs_40[0].surroundPattern = 0.75; martin@12: //Surround Gain martin@12: programs_40[0].surroundGain = 0.75f; martin@12: programs_40[1].surroundGain = 0.75f; martin@12: programs_40[2].surroundGain = 0.75f; martin@12: programs_40[3].surroundGain = 0.75f; martin@12: programs_40[4].surroundGain = 0.75f; martin@12: martin@12: martin@12: //5.0 Mode martin@12: //Name martin@12: vst_strncpy (programs_50[0].name, "5.0 XY Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_50[1].name, "5.0 MS Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_50[2].name, "5.0 Blumlein Fig8s",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_50[3].name, "5.0 Heller et. al. 1",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_50[4].name, "5.0 Heller et. al. 2",kVstMaxProgNameLen); martin@12: //Mode martin@12: programs_50[0].mode = 0.f; martin@12: programs_50[1].mode = 1.f; martin@12: programs_50[2].mode = 0.f; martin@12: //Width martin@12: programs_50[0].width = (1.f/3.f); martin@12: programs_50[1].width = (1.f/3.f); martin@12: programs_50[2].width = 0.5f; martin@12: //Pattern martin@12: programs_50[0].pattern = 0.5f; martin@12: programs_50[1].pattern = 0.5f; martin@12: programs_50[2].pattern = 0.f; martin@12: //Centre Pattern martin@12: programs_50[0].centrePattern = 0.5f; martin@12: programs_50[1].centrePattern = 0.5f; martin@12: programs_50[2].centrePattern = 0.0f; martin@12: //Centre Gain martin@12: programs_50[0].centreGain = 0.75f; martin@12: programs_50[1].centreGain = 0.75f; martin@12: programs_50[2].centreGain = 0.75f; martin@12: //Surround Mode martin@12: programs_50[0].surroundMode = 0.f; martin@12: programs_50[1].surroundMode = 1.f; martin@12: programs_50[2].surroundMode = 0.f; martin@12: //Surround Width martin@12: programs_50[0].surroundWidth = (5.5f/9.f); martin@12: programs_50[1].surroundWidth = (5.5f/9.f); martin@12: programs_50[2].surroundWidth = 0.5f; martin@12: //Surround Pattern martin@12: programs_50[0].surroundPattern = 0.5; martin@12: programs_50[1].surroundPattern = 0.5; martin@12: programs_50[2].surroundPattern = 0.0; martin@12: //Surround Gain martin@12: programs_50[0].surroundGain = 0.75f; martin@12: programs_50[1].surroundGain = 0.75f; martin@12: programs_50[2].surroundGain = 0.75f; martin@12: martin@12: martin@12: //5.1 Mode martin@12: //Name martin@12: vst_strncpy (programs_51[0].name, "5.1 XY Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_51[1].name, "5.1 MS Microphones",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_51[2].name, "5.1 Blumlein Fig8s",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_51[3].name, "5.1 Heller et. al. 1",kVstMaxProgNameLen); martin@12: vst_strncpy (programs_51[4].name, "5.1 Heller et. al. 2",kVstMaxProgNameLen); martin@12: //Mode martin@12: programs_51[0].mode = 0.f; martin@12: programs_51[1].mode = 1.f; martin@12: programs_51[2].mode = 0.f; martin@12: //Width martin@12: programs_51[0].width = (1.f/3.f); martin@12: programs_51[1].width = (1.f/3.f); martin@12: programs_51[2].width = 0.5f; martin@12: //Pattern martin@12: programs_51[0].pattern = 0.5f; martin@12: programs_51[1].pattern = 0.5f; martin@12: programs_51[2].pattern = 0.f; martin@12: //Centre Pattern martin@12: programs_51[0].centrePattern = 0.5f; martin@12: programs_51[1].centrePattern = 0.5f; martin@12: programs_51[2].centrePattern = 0.0f; martin@12: //Centre Gain martin@12: programs_51[0].centreGain = 0.75f; martin@12: programs_51[1].centreGain = 0.75f; martin@12: programs_51[2].centreGain = 0.75f; martin@12: //SubGain martin@12: programs_51[0].subGain = 0.75f; martin@12: programs_51[1].subGain = 0.75f; martin@12: programs_51[2].subGain = 0.75f; martin@12: programs_51[3].subGain = 0.75f; martin@12: programs_51[4].subGain = 0.75f; martin@12: //FC martin@12: programs_51[0].fc = 5.0f/11.0f; martin@12: programs_51[1].fc = 5.0f/11.0f; martin@12: programs_51[2].fc = 5.0f/11.0f; martin@12: programs_51[3].fc = 5.0f/11.0f; martin@12: programs_51[4].fc = 5.0f/11.0f; martin@12: //Surround Mode martin@12: programs_51[0].surroundMode = 0.f; martin@12: programs_51[1].surroundMode = 1.f; martin@12: programs_51[2].surroundMode = 0.f; martin@12: //Surround Width martin@12: programs_51[0].surroundWidth = (5.5f/9.f); martin@12: programs_51[1].surroundWidth = (5.5f/9.f); martin@12: programs_51[2].surroundWidth = 0.5f; martin@12: //Surround Pattern martin@12: programs_51[0].surroundPattern = 0.5; martin@12: programs_51[1].surroundPattern = 0.5; martin@12: programs_51[2].surroundPattern = 0.0; martin@12: //Surround Gain martin@12: programs_51[0].surroundGain = 0.75f; martin@12: programs_51[1].surroundGain = 0.75f; martin@12: programs_51[2].surroundGain = 0.75f; martin@12: martin@12: martin@12: //Load GUI martin@12: extern AEffGUIEditor* createEditor (AudioEffectX*); martin@12: setEditor (createEditor (this)); martin@12: martin@12: resume (); // flush buffer martin@12: martin@12: //Load Program0 default martin@12: if (programs_20||programs_21||programs_40||programs_50||programs_51) { martin@12: setProgram(0); martin@12: } martin@12: } martin@12: martin@12: martin@12: void ClassicAmbiDec::suspend() martin@12: { martin@12: myDecoder.clearFilter(); martin@12: martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (100, 0); martin@12: } martin@12: } martin@12: martin@12: void ClassicAmbiDec::close() martin@12: { martin@12: } martin@12: martin@12: martin@12: void ClassicAmbiDec::open() martin@12: { martin@12: } martin@12: martin@12: martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::setSpeakerArrangement (VstSpeakerArrangement* pluginInput, martin@12: VstSpeakerArrangement* pluginOutput) martin@12: { martin@12: numberInputs = pluginInput->numChannels; martin@12: numberOutputs = pluginOutput->numChannels; martin@12: martin@12: martin@12: bool result;//What to return, true for acceptable speaker arrangement martin@12: martin@12: switch (pluginOutput->type) { martin@12: case kSpeakerArr51://5.1 Output martin@12: { martin@12: if (pluginInput->type==kSpeakerArr31Cine) { martin@12: result = true; martin@12: } martin@12: else { martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr31Cine; martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: martin@12: case kSpeakerArr50://NOT WORKING AS INTENDED martin@12: { martin@12: if (pluginInput->numChannels==4) { martin@12: result = true; martin@12: } martin@12: else { martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr31Cine; martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: martin@12: case kSpeakerArr40Cine://4.0 Output (LRCS) martin@12: { martin@12: if (pluginInput->type==kSpeakerArr40Cine) { martin@12: result = true; martin@12: } martin@12: else { martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr40Cine; martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: martin@12: case kSpeakerArr40Music://4.0 Output (Music) martin@12: { martin@12: if (pluginInput->type==kSpeakerArr40Music) { martin@12: result = true; martin@12: } martin@12: else { martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr40Music; martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: martin@12: case kSpeakerArrStereo://Stereo martin@12: { martin@12: if (pluginInput->type==kSpeakerArr40Music) { martin@12: result = true; martin@12: } martin@12: else { martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: martin@12: martin@12: default: martin@12: { martin@12: if (pluginInput->type==kSpeakerArr31Cine) { martin@12: result = true; martin@12: } martin@12: else { martin@12: allocateArrangement (&myInputArrangement, 4); martin@12: myInputArrangement->type = kSpeakerArr31Cine; martin@12: result = false; martin@12: } martin@12: break; martin@12: } martin@12: } martin@12: martin@12: return result; martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::getSpeakerArrangement(VstSpeakerArrangement **pluginInput, VstSpeakerArrangement **pluginOutput) martin@12: { martin@12: *pluginInput = myInputArrangement; martin@12: return true; martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: VstInt32 ClassicAmbiDec::getVstVersion() martin@12: { martin@12: return kVstVersion; martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: ClassicAmbiDec::~ClassicAmbiDec () //clears protected variables martin@12: { martin@12: deallocateArrangement (&myInputArrangement); martin@12: martin@12: if (programs_20) martin@12: delete[] programs_20; martin@12: if (programs_21) martin@12: delete[] programs_21; martin@12: if (programs_40) martin@12: delete[] programs_40; martin@12: if (programs_50) martin@12: delete[] programs_50; martin@12: if (programs_51) martin@12: delete[] programs_51; martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::resume () //Do this on a resume from the host martin@12: { martin@12: AudioEffectX::resume (); martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (101, 0); martin@12: } martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::getProgramNameIndexed(VstInt32 category, VstInt32 index, char *text) martin@12: { martin@12: switch (myDecoder.decoderMode) { martin@12: case 2: martin@12: strcpy(text, programs_20[index].name); martin@12: break; martin@12: case 3: martin@12: strcpy(text, programs_21[index].name); martin@12: break; martin@12: case 4: martin@12: strcpy(text, programs_40[index].name); martin@12: break; martin@12: case 5: martin@12: strcpy(text, programs_50[index].name); martin@12: break; martin@12: case 6: martin@12: strcpy(text, programs_51[index].name); martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: martin@12: return true; martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::setProgram(VstInt32 program) martin@12: { martin@12: ClassicAmbiDecProgram* curProg; martin@12: curProgram = program; martin@12: martin@12: switch (myDecoder.decoderMode) { martin@12: case 2: martin@12: curProg = &programs_20[program]; martin@12: setParameter(kMode, curProg->mode); martin@12: setParameter(kWidth, curProg->width); martin@12: setParameter(kPattern, curProg->pattern); martin@12: setParameter(kRearVerb, curProg->rearVerb); martin@12: setParameter(kHiVerb, curProg->hiVerb); martin@12: break; martin@12: martin@12: case 3: martin@12: curProg = &programs_21[program]; martin@12: setParameter(kMode, curProg->mode); martin@12: setParameter(kWidth, curProg->width); martin@12: setParameter(kPattern, curProg->pattern); martin@12: setParameter(kRearVerb, curProg->rearVerb); martin@12: setParameter(kHiVerb, curProg->hiVerb); martin@12: setParameter(kSubGain, curProg->subGain); martin@12: setParameter(kFc, curProg->fc); martin@12: break; martin@12: martin@12: case 4: martin@12: curProg = &programs_40[program]; martin@12: setParameter(kMode, curProg->mode); martin@12: setParameter(kWidth, curProg->width); martin@12: setParameter(kPattern, curProg->pattern); martin@12: setParameter(kSurroundMode, curProg->surroundMode); martin@12: setParameter(kSurroundWidth, curProg->surroundWidth); martin@12: setParameter(kSurroundPattern, curProg->surroundPattern); martin@12: setParameter(kSurroundGain, curProg->surroundGain); martin@12: break; martin@12: martin@12: case 5: martin@12: curProg = &programs_50[program]; martin@12: if (program<3) { martin@12: myDecoder.mode5x=0; martin@12: setParameter(kMode, curProg->mode); martin@12: setParameter(kWidth, curProg->width); martin@12: setParameter(kPattern, curProg->pattern); martin@12: setParameter(kCentrePattern, curProg->centrePattern); martin@12: setParameter(kCentreGain, curProg->centreGain); martin@12: setParameter(kSurroundMode, curProg->surroundMode); martin@12: setParameter(kSurroundWidth, curProg->surroundWidth); martin@12: setParameter(kSurroundPattern, curProg->surroundPattern); martin@12: setParameter(kSurroundGain, curProg->surroundGain); martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 0.f); martin@12: } martin@12: } martin@12: else if (program==3) { martin@12: myDecoder.mode5x=1; martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 0.5f); martin@12: } martin@12: } martin@12: else if (program==4) { martin@12: myDecoder.mode5x=2; martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 1.f); martin@12: } martin@12: } martin@12: break; martin@12: case 6: martin@12: curProg = &programs_51[program]; martin@12: if (program<3) { martin@12: myDecoder.mode5x=0; martin@12: setParameter(kMode, curProg->mode); martin@12: setParameter(kWidth, curProg->width); martin@12: setParameter(kPattern, curProg->pattern); martin@12: setParameter(kCentrePattern, curProg->centrePattern); martin@12: setParameter(kCentreGain, curProg->centreGain); martin@12: setParameter(kSubGain, curProg->subGain); martin@12: setParameter(kFc, curProg->fc); martin@12: setParameter(kSurroundMode, curProg->surroundMode); martin@12: setParameter(kSurroundWidth, curProg->surroundWidth); martin@12: setParameter(kSurroundPattern, curProg->surroundPattern); martin@12: setParameter(kSurroundGain, curProg->surroundGain); martin@12: martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 0.f); martin@12: } martin@12: } martin@12: else if (program==3) { martin@12: //Only set the sub martin@12: setParameter(kSubGain, curProg->subGain); martin@12: setParameter(kFc, curProg->fc); martin@12: myDecoder.mode5x=1; martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 0.5f); martin@12: } martin@12: } martin@12: else if (program==4) { martin@12: //Only set the sub martin@12: setParameter(kSubGain, curProg->subGain); martin@12: setParameter(kFc, curProg->fc); martin@12: myDecoder.mode5x=2; martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (103, 1.f); martin@12: } martin@12: } martin@12: break; martin@12: martin@12: default: martin@12: curProg = &programs_20[program]; martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::setProgramName (char *name) martin@12: { martin@12: switch (myDecoder.decoderMode) { martin@12: case 2: martin@12: strcpy (programs_20[curProgram].name, name); martin@12: break; martin@12: case 3: martin@12: strcpy (programs_21[curProgram].name, name); martin@12: break; martin@12: case 4: martin@12: strcpy (programs_40[curProgram].name, name); martin@12: break; martin@12: case 5: martin@12: strcpy (programs_50[curProgram].name, name); martin@12: break; martin@12: case 6: martin@12: strcpy (programs_51[curProgram].name, name); martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: } martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::getProgramName (char *name) martin@12: { martin@12: switch (myDecoder.decoderMode) { martin@12: case 2: martin@12: strcpy (name, programs_20[curProgram].name); martin@12: break; martin@12: case 3: martin@12: strcpy (name, programs_21[curProgram].name); martin@12: break; martin@12: case 4: martin@12: strcpy (name, programs_40[curProgram].name); martin@12: break; martin@12: case 5: martin@12: strcpy (name, programs_50[curProgram].name); martin@12: break; martin@12: case 6: martin@12: strcpy (name, programs_51[curProgram].name); martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: //VstInt32 ClassicAmbiDec::getProgram() martin@12: //{ martin@12: // return curProgram; martin@12: //} martin@12: martin@12: martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::setParameter (VstInt32 index, float value) // SET Parameter value from host martin@12: { martin@12: ClassicAmbiDecProgram* curProg; martin@12: switch (myDecoder.decoderMode) { martin@12: case 2: martin@12: curProg = &programs_20[curProgram]; martin@12: break; martin@12: case 3: martin@12: curProg = &programs_21[curProgram]; martin@12: break; martin@12: case 4: martin@12: curProg = &programs_40[curProgram]; martin@12: break; martin@12: case 5: martin@12: curProg = &programs_50[curProgram]; martin@12: break; martin@12: case 6: martin@12: curProg = &programs_51[curProgram]; martin@12: break; martin@12: martin@12: default: martin@12: curProg = &programs_20[curProgram]; martin@12: break; martin@12: } martin@12: martin@12: martin@12: switch (index) martin@12: { martin@12: case kMode : martin@12: fMode = curProg->mode = value; martin@12: if (value<=0.5f) { martin@12: myDecoder.Mode = 0; martin@12: } martin@12: else { martin@12: myDecoder.Mode = 1; martin@12: } martin@12: break; martin@12: case kWidth: martin@12: fWidth = curProg->width = value; martin@12: myDecoder.Width = (double)value*90; martin@12: break; martin@12: case kPattern: martin@12: fPattern = curProg->pattern = value; martin@12: myDecoder.Pattern = (double)value; martin@12: break; martin@12: case kRotate : martin@12: fRotate = value; martin@12: if (value==0.5f) { martin@12: myDecoder.Rotate=0.0; martin@12: } martin@12: else { martin@12: myDecoder.Rotate = (double)value*-360+180; martin@12: } martin@12: break; martin@12: case kTilt: martin@12: fTilt = value; martin@12: if (value==0.5f) { martin@12: myDecoder.Tilt=0.0; martin@12: } martin@12: else { martin@12: myDecoder.Tilt = (double)value*-360+180; martin@12: } martin@12: break; martin@12: case kTumble: martin@12: fTumble = value; martin@12: if (value==0.5f) { martin@12: myDecoder.Tumble=0.00; martin@12: } martin@12: else { martin@12: myDecoder.Tumble = (double)value*-360+180; martin@12: } martin@12: break; martin@12: case kZoom: martin@12: fZoom = value; martin@12: myDecoder.Zoom = (double)value*200-100; martin@12: break; martin@12: case kZoomMethod: martin@12: fZoomMethod = value; martin@12: if (value<=0.2f) { martin@12: myDecoder.ZoomMethod = 0; martin@12: } martin@12: else if (value>0.2f && value<=0.5f) { martin@12: myDecoder.ZoomMethod = 1; martin@12: } martin@12: else if (value>0.5f && value<=0.8f) { martin@12: myDecoder.ZoomMethod = 2; martin@12: } martin@12: else if (value>0.8f && value<=1.f) { martin@12: myDecoder.ZoomMethod = 3; martin@12: } martin@12: martin@12: break; martin@12: case kRearVerb : martin@12: fRearVerb = curProg->rearVerb = value; martin@12: if (value==0.0f) { martin@12: myDecoder.RearVerb=-100; martin@12: } martin@12: else { martin@12: myDecoder.RearVerb = -36+(double)value*36; martin@12: } martin@12: break; martin@12: case kHiVerb : martin@12: fHiVerb = curProg->hiVerb = value; martin@12: if (value==0.0f) { martin@12: myDecoder.HiVerb=-100; martin@12: } martin@12: else { martin@12: myDecoder.HiVerb= -36+(double)value*36; martin@12: } martin@12: break; martin@12: case kCentrePattern: martin@12: fCentrePattern = curProg->centrePattern = value; martin@12: myDecoder.centrePattern = (double)value; martin@12: break; martin@12: case kCentreGain: martin@12: fCentreGain = curProg->centreGain = value; martin@12: myDecoder.centreGain = ((double)value*24-18); martin@12: break; martin@12: case kSubGain: martin@12: fSubGain = curProg->subGain = value; martin@12: myDecoder.subGain = ((double)value*24-18); martin@12: break; martin@12: case kFc: martin@12: fFc = curProg->fc = value; martin@12: myDecoder.Fc = (int)((value*220)+20); martin@12: myDecoder.filterCoefs(); martin@12: break; martin@12: case kSurroundMode: martin@12: fSurroundMode = curProg->surroundMode = value; martin@12: if (value<=0.5f) { martin@12: myDecoder.surMode = 0; martin@12: } martin@12: else { martin@12: myDecoder.surMode = 1; martin@12: } martin@12: break; martin@12: case kSurroundPattern: martin@12: fSurroundPattern = curProg->surroundPattern = value; martin@12: myDecoder.surPattern = (double)value; martin@12: break; martin@12: case kSurroundWidth: martin@12: fSurroundWidth = curProg->surroundWidth = value; martin@12: myDecoder.surWidth = (double)value*90; martin@12: break; martin@12: case kSurroundGain: martin@12: fSurroundGain = curProg->surroundGain = value; martin@12: myDecoder.surGain = ((double)value*24-18); martin@12: break; martin@12: case kDecoderMode: martin@12: fDecoderMode = value; martin@12: martin@12: if (value<=0.125f) { martin@12: myDecoder.decoderMode = 2; //Stereo martin@12: } martin@12: else if (value>0.125f && value<=0.375f) { martin@12: myDecoder.decoderMode = 3; //2.1 martin@12: } martin@12: else if (value>0.375f && value<=0.625f) { martin@12: myDecoder.decoderMode = 4; //Quad martin@12: } martin@12: else if (value>0.625f && value<=0.875f) { martin@12: myDecoder.decoderMode = 5; //5.0 martin@12: } martin@12: else if (value>0.875f) { martin@12: myDecoder.decoderMode = 6; //5.1 martin@12: } martin@12: updateDisplay(); martin@12: break; martin@12: case kChannelOrder: martin@12: fChannelOrder = value; martin@12: if (value<=0.5f) { martin@12: myDecoder.channelOrder = 0; //Natural Outputs martin@12: } martin@12: else { martin@12: myDecoder.channelOrder = 1; //5.1 Outputs martin@12: } martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: if (editor){ martin@12: ((AEffGUIEditor*)editor)->setParameter (index, value); martin@12: } martin@12: if (index==kDecoderMode) { martin@12: setProgram(curProgram); martin@12: } martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: float ClassicAmbiDec::getParameter (VstInt32 index) // GET the value of the parameter martin@12: { martin@12: float returnFloat; martin@12: martin@12: switch (index) martin@12: { martin@12: case kMode : martin@12: returnFloat = fMode; martin@12: break; martin@12: case kWidth: martin@12: returnFloat = fWidth; martin@12: break; martin@12: case kPattern: martin@12: returnFloat = fPattern; martin@12: break; martin@12: case kRotate : martin@12: returnFloat = fRotate; martin@12: break; martin@12: case kTilt: martin@12: returnFloat = fTilt; martin@12: break; martin@12: case kTumble: martin@12: returnFloat = fTumble; martin@12: break; martin@12: case kZoom: martin@12: returnFloat = fZoom; martin@12: break; martin@12: case kZoomMethod: martin@12: returnFloat = fZoomMethod; martin@12: break; martin@12: case kRearVerb : martin@12: returnFloat = fRearVerb; martin@12: break; martin@12: case kHiVerb : martin@12: returnFloat = fHiVerb; martin@12: break; martin@12: case kCentrePattern: martin@12: returnFloat = fCentrePattern; martin@12: break; martin@12: case kCentreGain: martin@12: returnFloat = fCentreGain; martin@12: break; martin@12: case kSubGain: martin@12: returnFloat = fSubGain; martin@12: break; martin@12: case kFc: martin@12: returnFloat = fFc; martin@12: break; martin@12: case kSurroundMode: martin@12: returnFloat = fSurroundMode; martin@12: break; martin@12: case kSurroundPattern: martin@12: returnFloat = fSurroundPattern; martin@12: break; martin@12: case kSurroundWidth: martin@12: returnFloat = fSurroundWidth; martin@12: break; martin@12: case kSurroundGain: martin@12: returnFloat = fSurroundGain; martin@12: break; martin@12: case kDecoderMode: martin@12: returnFloat = fDecoderMode; martin@12: break; martin@12: case kChannelOrder: martin@12: returnFloat = fChannelOrder; martin@12: break; martin@12: martin@12: martin@12: //HIDDEN PArameters for GUI Control martin@12: case 102: //Bit Mode for GUI display martin@12: returnFloat = bits; martin@12: break; martin@12: case 103: martin@12: returnFloat = myDecoder.mode5x; martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: return returnFloat; //Returns the chosen Parameters value martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::getParameterName (VstInt32 index, char *label) //SET display value shown for Parameters martin@12: { martin@12: switch (index) martin@12: { martin@12: case kMode : martin@12: switch (myDecoder.Mode) { martin@12: case 0 : martin@12: strcpy(label, "XY"); martin@12: break; martin@12: case 1 : martin@12: strcpy(label, "MS"); martin@12: break; martin@12: } martin@12: break; martin@12: case kWidth: martin@12: strcpy(label, "Width"); martin@12: break; martin@12: case kPattern: martin@12: strcpy(label, "Pattern"); martin@12: break; martin@12: case kRotate : martin@12: strcpy(label, "Rotate"); martin@12: break; martin@12: case kTilt: martin@12: strcpy(label, "Tilt"); martin@12: break; martin@12: case kTumble: martin@12: strcpy(label, "Tumble"); martin@12: break; martin@12: case kZoom: martin@12: strcpy(label, "Zoom"); martin@12: break; martin@12: case kZoomMethod: martin@12: strcpy(label, "Zoom Method"); martin@12: break; martin@12: case kRearVerb : martin@12: strcpy(label, "RearVerb"); martin@12: break; martin@12: case kHiVerb : martin@12: strcpy(label, "HiVerb"); martin@12: break; martin@12: case kCentrePattern: martin@12: strcpy(label, "Ctr. Pattern"); martin@12: break; martin@12: case kCentreGain: martin@12: strcpy(label, "Ctr. Gain"); martin@12: break; martin@12: case kSubGain: martin@12: strcpy(label, "Sub. Gain"); martin@12: break; martin@12: case kFc: martin@12: strcpy(label, "Sub. Xover"); martin@12: break; martin@12: case kSurroundMode: martin@12: strcpy(label, "Sur. Mode"); martin@12: break; martin@12: case kSurroundPattern: martin@12: strcpy(label, "Sur. Pattern"); martin@12: break; martin@12: case kSurroundWidth: martin@12: strcpy(label, "Sur. Width"); martin@12: break; martin@12: case kSurroundGain: martin@12: strcpy(label, "Sur. Gain"); martin@12: break; martin@12: case kDecoderMode: martin@12: strcpy(label, "Dec. Mode"); martin@12: break; martin@12: case kChannelOrder: martin@12: strcpy(label, "Ch. Order"); martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::getParameterDisplay (VstInt32 index, char *text) //GET display value shown for Parameters martin@12: { martin@12: switch (index) martin@12: { martin@12: case kMode : martin@12: switch (myDecoder.Mode) { martin@12: case 0 : martin@12: strcpy(text, "XY"); martin@12: break; martin@12: case 1 : martin@12: strcpy(text, "MS"); martin@12: break; martin@12: } martin@12: break; martin@12: case kWidth: martin@12: sprintf (text, "%.1f\u00B0", myDecoder.Width); martin@12: break; martin@12: case kPattern: martin@12: if (myDecoder.Pattern<=0.125) { martin@12: strcpy(text, "Fig-of-8"); martin@12: } martin@12: else if (myDecoder.Pattern>0.125 && myDecoder.Pattern<=0.375) { martin@12: strcpy(text, "Hyper-Card."); martin@12: } martin@12: else if (myDecoder.Pattern>0.375 && myDecoder.Pattern<=0.625) { martin@12: strcpy(text, "Cardioid"); martin@12: } martin@12: else if (myDecoder.Pattern>0.625 && myDecoder.Pattern<=0.875) { martin@12: strcpy(text, "Sub-Card."); martin@12: } martin@12: else { martin@12: strcpy(text, "Omni."); martin@12: } martin@12: break; martin@12: case kRotate : martin@12: sprintf (text, "%.1f\u00B0", myDecoder.Rotate); martin@12: break; martin@12: case kTilt: martin@12: sprintf (text, "%.1f\u00B0", myDecoder.Tilt); martin@12: break; martin@12: case kTumble: martin@12: sprintf (text, "%.1f\u00B0", myDecoder.Tumble); martin@12: break; martin@12: case kZoom: martin@12: sprintf (text, "%.1f%%", myDecoder.Zoom); martin@12: break; martin@12: case kZoomMethod: martin@12: switch (myDecoder.ZoomMethod) { martin@12: case 0: martin@12: strcpy(text, "Dominance"); martin@12: break; martin@12: case 1: martin@12: strcpy(text, "Press"); martin@12: break; martin@12: case 2: martin@12: strcpy(text, "Push"); martin@12: break; martin@12: case 3: martin@12: strcpy(text, "Focus"); martin@12: break; martin@12: default: martin@12: break; martin@12: } martin@12: break; martin@12: case kRearVerb : martin@12: if (myDecoder.RearVerb>-40) { martin@12: sprintf (text, "%.2fdB", myDecoder.RearVerb); martin@12: } martin@12: else { martin@12: strcpy(text, "Off"); martin@12: } martin@12: break; martin@12: case kHiVerb : martin@12: if (myDecoder.HiVerb>-40) { martin@12: sprintf (text, "%.2fdB", myDecoder.HiVerb); martin@12: } martin@12: else { martin@12: strcpy(text, "Off"); martin@12: } martin@12: break; martin@12: case kCentrePattern: martin@12: if (myDecoder.centrePattern<=0.125) { martin@12: strcpy(text, "Fig-of-8"); martin@12: } martin@12: else if (myDecoder.centrePattern>0.125 && myDecoder.centrePattern<=0.375) { martin@12: strcpy(text, "Hyper-Card."); martin@12: } martin@12: else if (myDecoder.centrePattern>0.375 && myDecoder.centrePattern<=0.625) { martin@12: strcpy(text, "Cardioid"); martin@12: } martin@12: else if (myDecoder.centrePattern>0.625 && myDecoder.centrePattern<=0.875) { martin@12: strcpy(text, "Sub-Card."); martin@12: } martin@12: else { martin@12: strcpy(text, "Omni."); martin@12: } martin@12: break; martin@12: case kCentreGain: martin@12: sprintf (text, "%.2fdB", myDecoder.centreGain); martin@12: break; martin@12: case kSubGain: martin@12: sprintf (text, "%.2fdB", myDecoder.subGain); martin@12: break; martin@12: case kFc: martin@12: sprintf (text, "%dHz", myDecoder.Fc); martin@12: break; martin@12: case kSurroundMode: martin@12: switch (myDecoder.surMode) { martin@12: case 0 : martin@12: strcpy(text, "XY"); martin@12: break; martin@12: case 1 : martin@12: strcpy(text, "MS"); martin@12: break; martin@12: } martin@12: break; martin@12: case kSurroundPattern: martin@12: if (myDecoder.surPattern<=0.125) { martin@12: strcpy(text, "Fig-of-8"); martin@12: } martin@12: else if (myDecoder.surPattern>0.125 && myDecoder.surPattern<=0.375) { martin@12: strcpy(text, "Hyper-Card."); martin@12: } martin@12: else if (myDecoder.surPattern>0.375 && myDecoder.surPattern<=0.625) { martin@12: strcpy(text, "Cardioid"); martin@12: } martin@12: else if (myDecoder.surPattern>0.625 && myDecoder.surPattern<=0.875) { martin@12: strcpy(text, "Sub-Card."); martin@12: } martin@12: else { martin@12: strcpy(text, "Omni."); martin@12: } martin@12: break; martin@12: case kSurroundWidth: martin@12: sprintf (text, "%.1f\u00B0", myDecoder.surWidth); martin@12: break; martin@12: case kSurroundGain: martin@12: sprintf (text, "%.2fdB", myDecoder.surGain); martin@12: break; martin@12: case kDecoderMode: martin@12: switch (myDecoder.decoderMode) { martin@12: case 2 : martin@12: strcpy(text, "Stereo"); martin@12: break; martin@12: case 3 : martin@12: strcpy(text, "2.1"); martin@12: break; martin@12: case 4 : martin@12: strcpy(text, "Quad"); martin@12: break; martin@12: case 5 : martin@12: strcpy(text, "5.0"); martin@12: break; martin@12: case 6 : martin@12: strcpy(text, "5.1"); martin@12: break; martin@12: } martin@12: break; martin@12: case kChannelOrder: martin@12: switch (myDecoder.channelOrder) { martin@12: case 0 : martin@12: strcpy(text, "Natural"); martin@12: break; martin@12: case 1 : martin@12: strcpy(text, "5.1"); martin@12: break; martin@12: } martin@12: break; martin@12: martin@12: default: martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::getParameterLabel (VstInt32 index, char *label) // Labels shown for Parameters martin@12: { martin@12: switch (index) martin@12: { martin@12: case kMode : martin@12: strcpy(label, "Microphones"); martin@12: break; martin@12: case kWidth: martin@12: strcpy(label, "Degrees"); martin@12: break; martin@12: case kPattern: martin@12: strcpy(label, "Omni"); martin@12: break; martin@12: case kRotate : martin@12: strcpy(label, "Degrees"); martin@12: break; martin@12: case kTilt: martin@12: strcpy(label, "Degrees"); martin@12: break; martin@12: case kTumble: martin@12: strcpy(label, "Degrees"); martin@12: break; martin@12: case kZoom: martin@12: strcpy(label, "Percentage"); martin@12: break; martin@12: case kZoomMethod: martin@12: strcpy(label, "Selection"); martin@12: break; martin@12: case kRearVerb : martin@12: strcpy(label, "dB"); martin@12: break; martin@12: case kHiVerb : martin@12: strcpy(label, "dB"); martin@12: break; martin@12: case kCentrePattern: martin@12: strcpy(label, "Omni"); martin@12: break; martin@12: case kCentreGain: martin@12: strcpy(label, "dB"); martin@12: break; martin@12: case kSubGain: martin@12: strcpy(label, "dB"); martin@12: break; martin@12: case kFc: martin@12: strcpy(label, "Hz"); martin@12: break; martin@12: case kSurroundMode: martin@12: strcpy(label, "Microphones"); martin@12: break; martin@12: case kSurroundPattern: martin@12: strcpy(label, "Omni"); martin@12: break; martin@12: case kSurroundWidth: martin@12: strcpy(label, "Degrees"); martin@12: break; martin@12: case kSurroundGain: martin@12: strcpy(label, "dB"); martin@12: break; martin@12: case kDecoderMode: martin@12: strcpy(label, "Speakers"); martin@12: break; martin@12: case kChannelOrder: martin@12: strcpy(label, "Output"); martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::getEffectName (char* name) // Tha NAME of the effect martin@12: { martin@12: strcpy (name, "Classic Ambisonics Decoder"); martin@12: return true; martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::getProductString (char* text) // The PRODUCT name martin@12: { martin@12: strcpy (text, "Classic Ambisonics Decoder"); martin@12: return true; martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: bool ClassicAmbiDec::getVendorString (char* text) // Vendor (Creator/Publisher) martin@12: { martin@12: strcpy (text, "Martin J. Morrell"); martin@12: return true; martin@12: } martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: VstInt32 ClassicAmbiDec::getVendorVersion () martin@12: { martin@12: return VERSION; martin@12: } martin@12: martin@12: martin@12: martin@12: //------------------------------------------------------------------------ martin@12: void ClassicAmbiDec::setSampleRate(float sampleRate) martin@12: { martin@12: myDecoder.Fs = (int)sampleRate; martin@12: myDecoder.filterCoefs(); martin@12: } martin@12: martin@12: martin@12: martin@12: //--------------------------------------------------------------------------- martin@12: void ClassicAmbiDec::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames) //The part that does some actual DSP. This section takes the input audio and gives the output audio back. martin@12: { martin@12: while (--sampleFrames >= 0) //Do this process if the audio is running martin@12: { martin@12: //Set the internal B-Format values as doubles. martin@12: double w, x, y, z; martin@12: switch (numberInputs) { martin@12: case 3: martin@12: { martin@12: w = (double) *inputs[0]++; martin@12: x = (double) *inputs[1]++; martin@12: y = (double) *inputs[2]++; martin@12: z = 0; martin@12: break; martin@12: } martin@12: martin@12: case 4: martin@12: { martin@12: w = (double) *inputs[0]++; martin@12: x = (double) *inputs[1]++; martin@12: y = (double) *inputs[2]++; martin@12: z = (double) *inputs[3]++; martin@12: break; martin@12: } martin@12: martin@12: default: martin@12: { martin@12: w = 0; martin@12: x = 0; martin@12: y = 0; martin@12: z = 0; martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: int numOut; martin@12: numOut = myDecoder.processDecoder(w, x, y, z); //Process B-Format martin@12: martin@12: if (numOut= 0) //Do this process if the audio is running martin@12: { martin@12: //Set the internal B-Format values as doubles. martin@12: double w, x, y, z; martin@12: switch (numberInputs) { martin@12: case 3: martin@12: { martin@12: w = *inputs[0]++; martin@12: x = *inputs[1]++; martin@12: y = *inputs[2]++; martin@12: z = 0; martin@12: break; martin@12: } martin@12: martin@12: case 4: martin@12: { martin@12: w = *inputs[0]++; martin@12: x = *inputs[1]++; martin@12: y = *inputs[2]++; martin@12: z = *inputs[3]++; martin@12: break; martin@12: } martin@12: martin@12: default: martin@12: { martin@12: w = 0; martin@12: x = 0; martin@12: y = 0; martin@12: z = 0; martin@12: break; martin@12: } martin@12: } martin@12: martin@12: martin@12: int numOut; martin@12: numOut = myDecoder.processDecoder(w, x, y, z); //Process B-Format martin@12: martin@12: if (numOut