annotate Source/SoundField.cpp @ 3:b2a8d65be9a1

Merge after some mess up.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 06 Sep 2012 11:36:48 +0100
parents e85bd6381a58
children 503cbcdd0b2a
rev   line source
martin@0 1 //-------------------------------------------------------------------------------------------------------
martin@0 2 // VST Plug-Ins SDK
martin@0 3 // Version 2.4 $Date: 2006/11/13 09:08:27 $
martin@0 4 //
martin@0 5 // Category : VST 2.x SDK Samples
martin@0 6 // Filename : adelay.cpp
martin@0 7 // Created by : Steinberg Media Technologies
martin@0 8 // Description : Simple Delay plugin (Mono->Stereo)
martin@0 9 //
martin@0 10 // © 2006, Steinberg Media Technologies, All Rights Reserved
martin@0 11 //-------------------------------------------------------------------------------------------------------
martin@0 12
martin@0 13
martin@0 14 #ifndef __SoundField__
martin@0 15 #include "SoundField.h"
martin@0 16 #endif
martin@0 17 //C++ Headers
martin@0 18 #include <stdio.h>
martin@0 19 #include <string.h>
martin@0 20 #include <cmath>
martin@0 21
martin@0 22 //GUI Headers
martin@0 23 #include "aeffguieditor.h"
martin@0 24
martin@0 25
martin@0 26
martin@0 27 //-----------------------------------------------------------------------------
martin@0 28 SoundFieldProgram::SoundFieldProgram ()
martin@0 29 {
martin@0 30 //Define name if all programs are to be the same
martin@0 31
martin@0 32 }
martin@0 33
martin@0 34 //-----------------------------------------------------------------------------
martin@0 35 SoundField::SoundField (audioMasterCallback audioMaster)
martin@0 36 : AudioEffectX (audioMaster, 1, kNumParameters)
martin@0 37 {
martin@0 38 // init
martin@0 39 programs = new SoundFieldProgram[numPrograms];
martin@0 40
martin@0 41
martin@0 42 // if (programs)
martin@0 43 // setProgram (0);
martin@0 44
martin@0 45 //Set the number of input and output channels
martin@0 46 setNumInputs (4); // 4 Channel Classic B-Format Input
martin@0 47 setNumOutputs (2); // MAX_CHANNELS 5.1 Output
martin@0 48
martin@0 49
martin@0 50 // We initialize the arrangements to default values.
martin@0 51 // Nevertheless, the host should modify them via
martin@0 52 // appropriate calls to setSpeakerArrangement.
martin@0 53 //allocateArrangement (&plugInput, MAX_CHANNELS);
martin@0 54 //plugInput->type = kSpeakerArr51;
martin@0 55
martin@0 56 //allocateArrangement (&plugOutput, 2); // MAX_CHANNELS, now 2 for stereo
martin@0 57 //plugOutput->type = kSpeakerArrStereo; // kSpeakerArr51, now set output to stereo
martin@0 58
martin@0 59
martin@0 60
martin@0 61 setUniqueID ('MMa2'); // this should be unique, use the Steinberg web page for plugin Id registration
martin@0 62
martin@0 63
martin@0 64 if(setProcessPrecision(kVstProcessPrecision64)){
martin@0 65 setProcessPrecision(kVstProcessPrecision64);
martin@0 66 bits=64;
martin@0 67 }
martin@0 68 else {
martin@0 69 bits=32;
martin@0 70 }
martin@0 71
martin@0 72
martin@0 73
martin@0 74 //Load GUI
martin@0 75 extern AEffGUIEditor* createEditor (AudioEffectX*);
martin@0 76 setEditor (createEditor (this));
martin@0 77
martin@0 78
martin@0 79 resume (); // flush buffer
martin@0 80
martin@0 81 canProcessReplacing(); //Plugin can use process replacing
martin@0 82 noTail ();
martin@0 83
martin@0 84 //Default Program Names
martin@0 85 vst_strncpy (programs[0].name, "Default",kVstMaxProgNameLen);
martin@0 86
martin@0 87 vst_strncpy (programName, "Default", kVstMaxProgNameLen); // default program name
martin@0 88
martin@0 89 //version = 2300;
martin@0 90
martin@0 91
martin@0 92 // Declare any variables to their default values
martin@0 93 // Default Program Values if NOT using a bank of programs
martin@0 94
martin@0 95 fMode = 0.f;
martin@0 96 fWidth = 0.5f;
martin@0 97 fPattern = 0.5f;
martin@0 98 fRotate = 0.5f;
martin@0 99 fTilt = 0.5f;
martin@0 100 fTumble = 0.5f;
martin@0 101 fZoom = 0.5f;
martin@0 102 fZoomMethod = 0.f;
martin@0 103 fRearVerb = 0.f;
martin@0 104 fHiVerb = 0.f;
martin@0 105
martin@0 106 myDecoder.Rotate=0.0;
martin@0 107 myDecoder.Tilt=0.0;
martin@0 108 myDecoder.Tumble=0.0;
martin@0 109 myDecoder.Zoom=0.0;
martin@0 110 myDecoder.ZoomMethod=0.0;
martin@0 111 myDecoder.Width=45.0;
martin@0 112 myDecoder.Pattern=0.5;
martin@0 113 myDecoder.Mode=0;
martin@0 114 myDecoder.RearVerb=-100;
martin@0 115 myDecoder.HiVerb=-100;
martin@0 116 myDecoder.outputL=0.0;
martin@0 117 myDecoder.outputR=0.0;
martin@0 118 myDecoder.outputC=0.0;
martin@0 119 myDecoder.outputS=0.0;
martin@0 120 myDecoder.outputSL=0.0;
martin@0 121 myDecoder.outputSR=0.0;
martin@0 122 myDecoder.surMode=0;
martin@0 123 myDecoder.surPattern=0.5;
martin@0 124 myDecoder.surWidth=60.0;
martin@0 125 myDecoder.subGain=0.0;
martin@0 126 myDecoder.centrePattern=0.5;
martin@0 127 myDecoder.centreGain=0.0;
martin@0 128 myDecoder.subGain=0.0;
martin@0 129 myDecoder.decoderMode=2;
martin@0 130 myDecoder.Fs = sampleRate;
martin@0 131 myDecoder.Fc = 120;
martin@0 132
martin@0 133 myDecoder.filterCoefs();
martin@0 134
martin@0 135 }
martin@0 136
martin@0 137
martin@0 138 void SoundField::suspend()
martin@0 139 {
martin@0 140 myDecoder.clearFilter();
martin@0 141
martin@0 142 if (editor){
martin@0 143 ((AEffGUIEditor*)editor)->setParameter (100, 0);
martin@0 144 }
martin@0 145 }
martin@0 146
martin@0 147 void SoundField::close()
martin@0 148 {
martin@0 149 }
martin@0 150
martin@0 151
martin@0 152 void SoundField::open()
martin@0 153 {
martin@0 154 }
martin@0 155
martin@0 156
martin@0 157
martin@0 158 //------------------------------------------------------------------------
martin@0 159 //bool SoundField::getSpeakerArrangement (VstSpeakerArrangement** pluginInput, VstSpeakerArrangement** pluginOutput)
martin@0 160 //{
martin@0 161 // *pluginInput = plugInput;
martin@0 162 // *pluginOutput = plugOutput;
martin@0 163 // return true;
martin@0 164 //}
martin@0 165
martin@0 166 //------------------------------------------------------------------------
martin@0 167 bool SoundField::setSpeakerArrangement (VstSpeakerArrangement* pluginInput,
martin@0 168 VstSpeakerArrangement* pluginOutput)
martin@0 169 {
martin@0 170 if (!pluginOutput || !pluginInput)
martin@0 171 return false;
martin@0 172
martin@0 173 bool result = true;
martin@0 174
martin@0 175 // This plug-in can act on any speaker arrangement,
martin@0 176 // provided that there are the same number of inputs/outputs.
martin@0 177 // if (pluginInput->numChannels > MAX_CHANNELS)
martin@0 178 // {
martin@0 179 // // This plug-in can't have so many channels. So we answer
martin@0 180 // // false, and we set the input arrangement with the maximum
martin@0 181 // // number of channels possible
martin@0 182 // result = false;
martin@0 183 // allocateArrangement (&plugInput, MAX_CHANNELS);
martin@0 184 // plugInput->type = kSpeakerArr51;
martin@0 185 // }
martin@0 186 // else
martin@0 187 // {
martin@0 188 // matchArrangement (&plugInput, pluginInput);
martin@0 189 // }
martin@0 190
martin@0 191 // if (pluginOutput->numChannels != plugInput->numChannels)
martin@0 192 if (pluginOutput->numChannels <= MAX_CHANNELS)
martin@0 193 {
martin@0 194 // This plug-in only deals with symetric IO configurations...
martin@0 195 // result = false;
martin@0 196 // matchArrangement (&plugOutput, plugInput);
martin@0 197 myDecoder.decoderMode=pluginOutput->numChannels;
martin@0 198 }
martin@0 199 else
martin@0 200 {
martin@0 201 // matchArrangement (&plugOutput, pluginOutput);
martin@0 202 myDecoder.decoderMode=6;
martin@0 203 }
martin@0 204
martin@0 205 return result;
martin@0 206 }
martin@0 207
martin@0 208
martin@0 209 void SoundField::setProgram (VstInt32 program) //Host to SET the Program
martin@0 210 {
martin@0 211 curProgram = program; //Change the curProgram value
martin@0 212 }
martin@0 213
martin@0 214
martin@0 215 void SoundField::setProgramName(char *name) //SET the Program name
martin@0 216 {
martin@0 217 strcpy(programs[curProgram].name, name); //Host SETS the Program[].name
martin@0 218 }
martin@0 219
martin@0 220
martin@0 221
martin@0 222 void SoundField::getProgramName(char *name) //GET the Program name
martin@0 223 {
martin@0 224 strcpy(name, programs[curProgram].name); //Host GETS the Program[].name
martin@0 225 }
martin@0 226
martin@0 227
martin@0 228
martin@0 229 bool SoundField::getProgramNameIndexed (VstInt32 category, VstInt32 which, char* name)
martin@0 230 {
martin@0 231 if ((unsigned int)which < kNumPrograms) //Check the ProgramNameIndexed is within range
martin@0 232 {
martin@0 233 strcpy(name, programs[which].name); //Host GETS the programs[].name
martin@0 234 return true; //TRUE- ProgramNameIndexed does exits
martin@0 235 }
martin@0 236 return false; //FALSE- ProgramNameIndexed does not exits
martin@0 237 }
martin@0 238
martin@0 239
martin@0 240 //------------------------------------------------------------------------
martin@0 241 SoundField::~SoundField () //clears protected variables
martin@0 242 {
martin@0 243 if (programs)
martin@0 244 delete[] programs;
martin@0 245
martin@0 246 deallocateArrangement (&plugInput);
martin@0 247 deallocateArrangement (&plugOutput);
martin@0 248 }
martin@0 249
martin@0 250
martin@0 251
martin@0 252 //------------------------------------------------------------------------
martin@0 253 void SoundField::resume () //Do this on a resume from the host
martin@0 254 {
martin@0 255 AudioEffectX::resume ();
martin@0 256 if (editor){
martin@0 257 ((AEffGUIEditor*)editor)->setParameter (101, 0);
martin@0 258 }
martin@0 259 }
martin@0 260
martin@0 261
martin@0 262 //------------------------------------------------------------------------
martin@0 263 void SoundField::setParameter (VstInt32 index, float value) // SET Parameter value from host
martin@0 264 {
martin@0 265 switch (index)
martin@0 266 {
martin@0 267 case kMode :
martin@0 268 fMode = value;
martin@0 269 if (value<=0.5f) {
martin@0 270 myDecoder.Mode = 0;
martin@0 271 }
martin@0 272 else {
martin@0 273 myDecoder.Mode = 1;
martin@0 274 }
martin@0 275 break;
martin@0 276 case kWidth:
martin@0 277 fWidth = value;
martin@0 278 myDecoder.Width = (double)value*90;
martin@0 279 break;
martin@0 280 case kPattern:
martin@0 281 fPattern = value;
martin@0 282 myDecoder.Pattern = (double)value;
martin@0 283 break;
martin@0 284 case kRotate :
martin@0 285 fRotate = value;
martin@0 286 if (value==0.5f) {
martin@0 287 myDecoder.Rotate=0.0;
martin@0 288 }
martin@0 289 else {
martin@0 290 myDecoder.Rotate = (double)value*-360+180;
martin@0 291 }
martin@0 292 break;
martin@0 293 case kTilt:
martin@0 294 fTilt = value;
martin@0 295 if (value==0.5f) {
martin@0 296 myDecoder.Tilt=0.0;
martin@0 297 }
martin@0 298 else {
martin@0 299 myDecoder.Tilt = (double)value*-360+180;
martin@0 300 }
martin@0 301 break;
martin@0 302 case kTumble:
martin@0 303 fTumble = value;
martin@0 304 if (value==0.5f) {
martin@0 305 myDecoder.Tumble=0.00;
martin@0 306 }
martin@0 307 else {
martin@0 308 myDecoder.Tumble = (double)value*-360+180;
martin@0 309 }
martin@0 310 break;
martin@0 311 case kZoom:
martin@0 312 fZoom = value;
martin@0 313 myDecoder.Zoom = (double)value*200-100;
martin@0 314 break;
martin@0 315 case kZoomMethod:
martin@0 316 fZoomMethod = value;
martin@0 317 if (value<=0.2f) {
martin@0 318 myDecoder.ZoomMethod = 0;
martin@0 319 }
martin@0 320 else if (value>0.2f && value<=0.5f) {
martin@0 321 myDecoder.ZoomMethod = 1;
martin@0 322 }
martin@0 323 else if (value>0.5f && value<=0.8f) {
martin@0 324 myDecoder.ZoomMethod = 2;
martin@0 325 }
martin@0 326 else if (value>0.8f && value<=1.f) {
martin@0 327 myDecoder.ZoomMethod = 3;
martin@0 328 }
martin@0 329
martin@0 330 break;
martin@0 331 case kRearVerb :
martin@0 332 fRearVerb = value;
martin@0 333 if (value==0.0f) {
martin@0 334 myDecoder.RearVerb=-100;
martin@0 335 }
martin@0 336 else {
martin@0 337 myDecoder.RearVerb = -36+(double)value*36;
martin@0 338 }
martin@0 339 break;
martin@0 340 case kHiVerb :
martin@0 341 fHiVerb = value;
martin@0 342 if (value==0.0f) {
martin@0 343 myDecoder.HiVerb=-100;
martin@0 344 }
martin@0 345 else {
martin@0 346 myDecoder.HiVerb= -36+(double)value*36;
martin@0 347 }
martin@0 348 break;
martin@0 349 }
martin@0 350 if (editor){
martin@0 351 ((AEffGUIEditor*)editor)->setParameter (index, value);
martin@0 352 }
martin@0 353 }
martin@0 354
martin@0 355
martin@0 356
martin@0 357 //------------------------------------------------------------------------
martin@0 358 float SoundField::getParameter (VstInt32 index) // GET the value of the parameter
martin@0 359 {
martin@0 360 float returnFloat; //Define a float to output
martin@0 361
martin@0 362 // Use a switch when more than 1 parameter
martin@0 363 switch (index)
martin@0 364 {
martin@0 365 case kMode :
martin@0 366 returnFloat = fMode;
martin@0 367 break;
martin@0 368 case kWidth:
martin@0 369 returnFloat = fWidth;
martin@0 370 break;
martin@0 371 case kPattern:
martin@0 372 returnFloat = fPattern;
martin@0 373 break;
martin@0 374 case kRotate :
martin@0 375 returnFloat = fRotate;
martin@0 376 break;
martin@0 377 case kTilt:
martin@0 378 returnFloat = fTilt;
martin@0 379 break;
martin@0 380 case kTumble:
martin@0 381 returnFloat = fTumble;
martin@0 382 break;
martin@0 383 case kZoom:
martin@0 384 returnFloat = fZoom;
martin@0 385 break;
martin@0 386 case kZoomMethod:
martin@0 387 returnFloat = fZoomMethod;
martin@0 388 break;
martin@0 389 case kRearVerb :
martin@0 390 returnFloat = fRearVerb;
martin@0 391 break;
martin@0 392 case kHiVerb :
martin@0 393 returnFloat = fHiVerb;
martin@0 394 break;
martin@0 395 case 50:
martin@0 396 returnFloat = bits;
martin@0 397 break;
martin@0 398 }
martin@0 399 return returnFloat; //Returns the chosen Parameters value
martin@0 400 }
martin@0 401
martin@0 402 //------------------------------------------------------------------------
martin@0 403 void SoundField::getParameterName (VstInt32 index, char *label) //SET display value shown for Parameters
martin@0 404 {
martin@0 405 switch (index)
martin@0 406 {
martin@0 407 case kMode :
martin@0 408 switch (myDecoder.Mode) {
martin@0 409 case 0 :
martin@0 410 strcpy(label, "XY");
martin@0 411 break;
martin@0 412 case 1 :
martin@0 413 strcpy(label, "MS");
martin@0 414 break;
martin@0 415 }
martin@0 416 break;
martin@0 417 case kWidth:
martin@0 418 strcpy(label, "Width");
martin@0 419 break;
martin@0 420 case kPattern:
martin@0 421 strcpy(label, "Pattern");
martin@0 422 break;
martin@0 423 case kRotate :
martin@0 424 strcpy(label, "Rotate");
martin@0 425 break;
martin@0 426 case kTilt:
martin@0 427 strcpy(label, "Tilt");
martin@0 428 break;
martin@0 429 case kTumble:
martin@0 430 strcpy(label, "Tumble");
martin@0 431 break;
martin@0 432 case kZoom:
martin@0 433 strcpy(label, "Zoom");
martin@0 434 break;
martin@0 435 case kZoomMethod:
martin@0 436 strcpy(label, "Zoom Method");
martin@0 437 break;
martin@0 438 case kRearVerb :
martin@0 439 strcpy(label, "RearVerb");
martin@0 440 break;
martin@0 441 case kHiVerb :
martin@0 442 strcpy(label, "HiVerb");
martin@0 443 break;
martin@0 444 }
martin@0 445 }
martin@0 446
martin@0 447
martin@0 448 //------------------------------------------------------------------------
martin@0 449 void SoundField::getParameterDisplay (VstInt32 index, char *text) //GET display value shown for Parameters
martin@0 450 {
martin@0 451 switch (index)
martin@0 452 {
martin@0 453 case kMode :
martin@0 454 switch (myDecoder.Mode) {
martin@0 455 case 0 :
martin@0 456 strcpy(text, "XY");
martin@0 457 break;
martin@0 458 case 1 :
martin@0 459 strcpy(text, "MS");
martin@0 460 break;
martin@0 461 }
martin@0 462 break;
martin@0 463 case kWidth:
martin@0 464 sprintf (text, "%.1f\u00B0", myDecoder.Width);
martin@0 465 break;
martin@0 466 case kPattern:
martin@0 467 //sprintf (text, "%.1f", myDecoder.Pattern);
martin@0 468 if (myDecoder.Pattern<=0.125) {
martin@0 469 strcpy(text, "Fig-of-8");
martin@0 470 }
martin@0 471 else if (myDecoder.Pattern>0.125 && myDecoder.Pattern<=0.375) {
martin@0 472 strcpy(text, "Hyper-Card.");
martin@0 473 }
martin@0 474 else if (myDecoder.Pattern>0.375 && myDecoder.Pattern<=0.625) {
martin@0 475 strcpy(text, "Cardioid");
martin@0 476 }
martin@0 477 else if (myDecoder.Pattern>0.625 && myDecoder.Pattern<=0.875) {
martin@0 478 strcpy(text, "Sub-Card.");
martin@0 479 }
martin@0 480 else {
martin@0 481 strcpy(text, "Omni.");
martin@0 482 }
martin@0 483
martin@0 484
martin@0 485 break;
martin@0 486 case kRotate :
martin@0 487 sprintf (text, "%.1f\u00B0", myDecoder.Rotate);
martin@0 488 break;
martin@0 489 case kTilt:
martin@0 490 sprintf (text, "%.1f\u00B0", myDecoder.Tilt);
martin@0 491 break;
martin@0 492 case kTumble:
martin@0 493 sprintf (text, "%.1f\u00B0", myDecoder.Tumble);
martin@0 494 break;
martin@0 495 case kZoom:
martin@0 496 sprintf (text, "%.1f%%", myDecoder.Zoom);
martin@0 497 break;
martin@0 498 case kZoomMethod:
martin@0 499 switch (myDecoder.ZoomMethod) {
martin@0 500 case 0:
martin@0 501 strcpy(text, "Dominance");
martin@0 502 break;
martin@0 503 case 1:
martin@0 504 strcpy(text, "Press");
martin@0 505 break;
martin@0 506 case 2:
martin@0 507 strcpy(text, "Push");
martin@0 508 break;
martin@0 509 case 3:
martin@0 510 strcpy(text, "Focus");
martin@0 511 break;
martin@0 512 default:
martin@0 513 break;
martin@0 514 }
martin@0 515 break;
martin@0 516 case kRearVerb :
martin@0 517 if (myDecoder.RearVerb>-40) {
martin@0 518 sprintf (text, "%.2fdB", myDecoder.RearVerb);
martin@0 519 }
martin@0 520 else {
martin@0 521 strcpy(text, "Off");
martin@0 522 }
martin@0 523 break;
martin@0 524 case kHiVerb :
martin@0 525 if (myDecoder.HiVerb>-40) {
martin@0 526 sprintf (text, "%.2fdB", myDecoder.HiVerb);
martin@0 527 }
martin@0 528 else {
martin@0 529 strcpy(text, "Off");
martin@0 530 }
martin@0 531 break;
martin@0 532 }
martin@0 533 //kVstMaxParamStrLen
martin@0 534 }
martin@0 535
martin@0 536
martin@0 537 //------------------------------------------------------------------------
martin@0 538 void SoundField::getParameterLabel (VstInt32 index, char *label) // Labels shown for Parameters
martin@0 539 {
martin@0 540 switch (index)
martin@0 541 {
martin@0 542 case kMode :
martin@0 543 strcpy(label, "Microphones");
martin@0 544 break;
martin@0 545 case kWidth:
martin@0 546 strcpy(label, "Degrees");
martin@0 547 break;
martin@0 548 case kPattern:
martin@0 549 strcpy(label, "Omni");
martin@0 550 break;
martin@0 551 case kRotate :
martin@0 552 strcpy(label, "Degrees");
martin@0 553 break;
martin@0 554 case kTilt:
martin@0 555 strcpy(label, "Degrees");
martin@0 556 break;
martin@0 557 case kTumble:
martin@0 558 strcpy(label, "Degrees");
martin@0 559 break;
martin@0 560 case kZoom:
martin@0 561 strcpy(label, "Precentage");
martin@0 562 break;
martin@0 563 case kZoomMethod:
martin@0 564 strcpy(label, "Selection");
martin@0 565 break;
martin@0 566 case kRearVerb :
martin@0 567 strcpy(label, "dB");
martin@0 568 break;
martin@0 569 case kHiVerb :
martin@0 570 strcpy(label, "dB");
martin@0 571 break;
martin@0 572 }
martin@0 573 }
martin@0 574
martin@0 575
martin@0 576 //------------------------------------------------------------------------
martin@0 577 bool SoundField::getEffectName (char* name) // Tha NAME of the effect
martin@0 578 {
martin@0 579 strcpy (name, "SoundField Decoder");
martin@0 580 return true;
martin@0 581 }
martin@0 582
martin@0 583 //------------------------------------------------------------------------
martin@0 584 bool SoundField::getProductString (char* text) // The PRODUCT name
martin@0 585 {
martin@0 586 strcpy (text, "SoundField Decoder");
martin@0 587 return true;
martin@0 588 }
martin@0 589
martin@0 590 //------------------------------------------------------------------------
martin@0 591 bool SoundField::getVendorString (char* text) // Vendor (Creator/Publisher)
martin@0 592 {
martin@0 593 strcpy (text, "Martin J. Morrell");
martin@0 594 return true;
martin@0 595 }
martin@0 596
martin@0 597
martin@0 598 //------------------------------------------------------------------------
martin@0 599 VstInt32 SoundField::getVendorVersion ()
martin@0 600 {
martin@0 601 return VERSION;
martin@0 602 }
martin@0 603
martin@0 604
martin@0 605 //---------------------------------------------------------------------------
martin@0 606 void SoundField::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@0 607 {
martin@0 608
martin@0 609
martin@0 610 while (--sampleFrames >= 0) //Do this process if the audio is running
martin@0 611 {
martin@0 612 //Set the internal B-Format values as doubles.
martin@0 613 double w=(double) *inputs[0]++;
martin@0 614 double x=(double) *inputs[1]++;
martin@0 615 double y=(double) *inputs[2]++;
martin@0 616 double z=(double) *inputs[3]++;
martin@0 617
martin@0 618 if (myDecoder.decoderMode == 2) {//Stereo
martin@0 619 myDecoder.stereoDecoder(w, x, y, z);
martin@0 620 *outputs[0]++ = float(myDecoder.outputL);
martin@0 621 *outputs[1]++ = float(myDecoder.outputR);
martin@0 622 }
martin@0 623 else if (myDecoder.decoderMode == 3) {//2.1
martin@0 624 myDecoder.twoOneDecoder(w, x, y, z);
martin@0 625 *outputs[0]++ = float(myDecoder.outputL);
martin@0 626 *outputs[1]++ = float(myDecoder.outputR);
martin@0 627 *outputs[2]++ = float(myDecoder.outputS);
martin@0 628 }
martin@0 629 else if (myDecoder.decoderMode == 4) {//LRCS
martin@0 630 myDecoder.fiveOneDecoder(w, x, y, z);
martin@0 631 *outputs[0]++ = float(myDecoder.outputL);
martin@0 632 *outputs[1]++ = float(myDecoder.outputR);
martin@0 633 *outputs[2]++ = float(myDecoder.outputSL);
martin@0 634 *outputs[3]++ = float(myDecoder.outputSR);
martin@0 635 }
martin@0 636 else if (myDecoder.decoderMode == 5) {//5.0
martin@0 637 myDecoder.fiveOneDecoder(w, x, y, z);
martin@0 638 *outputs[0]++ = float(myDecoder.outputL);
martin@0 639 *outputs[1]++ = float(myDecoder.outputR);
martin@0 640 *outputs[2]++ = float(myDecoder.outputC);
martin@0 641 *outputs[3]++ = float(myDecoder.outputSL);
martin@0 642 *outputs[4]++ = float(myDecoder.outputSR);
martin@0 643 }
martin@0 644 else if (myDecoder.decoderMode == 6) {//5.1
martin@0 645 myDecoder.fiveOneDecoder(w, x, y, z);
martin@0 646 *outputs[0]++ = float(myDecoder.outputL);
martin@0 647 *outputs[1]++ = float(myDecoder.outputR);
martin@0 648 *outputs[2]++ = float(myDecoder.outputC);
martin@0 649 *outputs[3]++ = float(myDecoder.outputS);
martin@0 650 *outputs[4]++ = float(myDecoder.outputSL);
martin@0 651 *outputs[5]++ = float(myDecoder.outputSR);
martin@0 652 }
martin@0 653
martin@0 654
martin@0 655 }
martin@0 656 }