Browse Source

Support latest version of FMOD Ex (removes reverb filter in favor of sfxreverb)

rdb 12 years ago
parent
commit
aa4cc5c531

+ 9 - 5
panda/src/audio/filterProperties.I

@@ -109,18 +109,22 @@ add_pitchshift(PN_stdfloat pitch, PN_stdfloat fftsize, PN_stdfloat overlap) {
 // Description: Add a chorus filter to the end of the DSP chain.
 ////////////////////////////////////////////////////////////////////
 INLINE void FilterProperties::
-add_chorus(PN_stdfloat drymix, PN_stdfloat wet1, PN_stdfloat wet2, PN_stdfloat wet3, PN_stdfloat delay, PN_stdfloat rate, PN_stdfloat depth, PN_stdfloat feedback) {
-  add_filter(FT_chorus, drymix, wet1, wet2, wet3, delay, rate, depth, feedback);
+add_chorus(PN_stdfloat drymix, PN_stdfloat wet1, PN_stdfloat wet2, PN_stdfloat wet3, PN_stdfloat delay, PN_stdfloat rate, PN_stdfloat depth) {
+  add_filter(FT_chorus, drymix, wet1, wet2, wet3, delay, rate, depth);
 }
 
 ////////////////////////////////////////////////////////////////////
-//    Function: FilterProperties::add_reverb
+//    Function: FilterProperties::add_sfxreverb
 //      Access: Published
 // Description: Add a reverb filter to the end of the DSP chain.
 ////////////////////////////////////////////////////////////////////
 INLINE void FilterProperties::
-add_reverb(PN_stdfloat drymix, PN_stdfloat wetmix, PN_stdfloat roomsize, PN_stdfloat damp, PN_stdfloat width) {
-  add_filter(FT_reverb, drymix, wetmix, roomsize, damp, width);
+add_sfxreverb(PN_stdfloat drylevel, PN_stdfloat room, PN_stdfloat roomhf, PN_stdfloat decaytime,
+  	          PN_stdfloat decayhfratio, PN_stdfloat reflectionslevel, PN_stdfloat reflectionsdelay,
+  	          PN_stdfloat reverblevel, PN_stdfloat reverbdelay, PN_stdfloat diffusion,
+  	          PN_stdfloat density, PN_stdfloat hfreference, PN_stdfloat roomlf, PN_stdfloat lfreference) {
+  add_filter(FT_sfxreverb, drylevel, room, roomhf, decaytime, decayhfratio, reflectionslevel, reflectionsdelay,
+  	                       reverblevel, reverbdelay, diffusion, density, hfreference, roomlf, lfreference);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 10 - 1
panda/src/audio/filterProperties.cxx

@@ -41,7 +41,10 @@ FilterProperties::
 //  Description: 
 ////////////////////////////////////////////////////////////////////
 void FilterProperties::
-add_filter(FilterType t, PN_stdfloat a, PN_stdfloat b, PN_stdfloat c, PN_stdfloat d, PN_stdfloat e, PN_stdfloat f, PN_stdfloat g, PN_stdfloat h) {
+add_filter(FilterType t, PN_stdfloat a, PN_stdfloat b, PN_stdfloat c, PN_stdfloat d,
+	                     PN_stdfloat e, PN_stdfloat f, PN_stdfloat g, PN_stdfloat h,
+	                     PN_stdfloat i, PN_stdfloat j, PN_stdfloat k, PN_stdfloat l,
+	                     PN_stdfloat m, PN_stdfloat n) {
   FilterConfig conf;
   conf._type = t;
   conf._a = a;
@@ -52,6 +55,12 @@ add_filter(FilterType t, PN_stdfloat a, PN_stdfloat b, PN_stdfloat c, PN_stdfloa
   conf._f = f;
   conf._g = g;
   conf._h = h;
+  conf._i = i;
+  conf._j = j;
+  conf._k = k;
+  conf._l = l;
+  conf._m = m;
+  conf._n = n;
   _config.push_back(conf);
 }
 

+ 12 - 4
panda/src/audio/filterProperties.h

@@ -36,8 +36,11 @@ class EXPCL_PANDA_AUDIO FilterProperties : public TypedReferenceCount {
   INLINE void add_normalize(PN_stdfloat fadetime, PN_stdfloat threshold, PN_stdfloat maxamp);
   INLINE void add_parameq(PN_stdfloat center_freq, PN_stdfloat bandwidth, PN_stdfloat gain);
   INLINE void add_pitchshift(PN_stdfloat pitch, PN_stdfloat fftsize, PN_stdfloat overlap);
-  INLINE void add_chorus(PN_stdfloat drymix, PN_stdfloat wet1, PN_stdfloat wet2, PN_stdfloat wet3, PN_stdfloat delay, PN_stdfloat rate, PN_stdfloat depth, PN_stdfloat feedback);
-  INLINE void add_reverb(PN_stdfloat drymix, PN_stdfloat wetmix, PN_stdfloat roomsize, PN_stdfloat damp, PN_stdfloat width);
+  INLINE void add_chorus(PN_stdfloat drymix, PN_stdfloat wet1, PN_stdfloat wet2, PN_stdfloat wet3, PN_stdfloat delay, PN_stdfloat rate, PN_stdfloat depth);
+  INLINE void add_sfxreverb(PN_stdfloat drylevel=0, PN_stdfloat room=-10000, PN_stdfloat roomhf=0, PN_stdfloat decaytime=1,
+  	                        PN_stdfloat decayhfratio=0.5, PN_stdfloat reflectionslevel=-10000, PN_stdfloat reflectionsdelay=0.02,
+  	                        PN_stdfloat reverblevel=0, PN_stdfloat reverbdelay=0.04, PN_stdfloat diffusion=100,
+  	                        PN_stdfloat density=100, PN_stdfloat hfreference=5000, PN_stdfloat roomlf=0, PN_stdfloat lfreference=250);
   INLINE void add_compress(PN_stdfloat threshold, PN_stdfloat attack, PN_stdfloat release, PN_stdfloat gainmakeup);
 
  public:
@@ -52,7 +55,7 @@ class EXPCL_PANDA_AUDIO FilterProperties : public TypedReferenceCount {
     FT_parameq,
     FT_pitchshift,
     FT_chorus,
-    FT_reverb,
+    FT_sfxreverb,
     FT_compress,
   };
 
@@ -60,12 +63,17 @@ class EXPCL_PANDA_AUDIO FilterProperties : public TypedReferenceCount {
     FilterType  _type;
     PN_stdfloat       _a,_b,_c,_d;
     PN_stdfloat       _e,_f,_g,_h;
+    PN_stdfloat       _i,_j,_k,_l;
+    PN_stdfloat       _m,_n;
   };
   
   typedef pvector<FilterConfig> ConfigVector;
   
  private:  
-  void add_filter(FilterType t, PN_stdfloat a=0, PN_stdfloat b=0, PN_stdfloat c=0, PN_stdfloat d=0, PN_stdfloat e=0, PN_stdfloat f=0, PN_stdfloat g=0, PN_stdfloat h=0);
+  void add_filter(FilterType t, PN_stdfloat a=0, PN_stdfloat b=0, PN_stdfloat c=0, PN_stdfloat d=0,
+  	                            PN_stdfloat e=0, PN_stdfloat f=0, PN_stdfloat g=0, PN_stdfloat h=0,
+  	                            PN_stdfloat i=0, PN_stdfloat j=0, PN_stdfloat k=0, PN_stdfloat l=0,
+  	                            PN_stdfloat m=0, PN_stdfloat n=0);
   ConfigVector _config;
   
  public:

+ 74 - 52
panda/src/audiotraits/fmodAudioManager.cxx

@@ -249,7 +249,7 @@ make_dsp(const FilterProperties::FilterConfig &conf) {
   case FilterProperties::FT_parameq:    dsptype = FMOD_DSP_TYPE_PARAMEQ;     break;
   case FilterProperties::FT_pitchshift: dsptype = FMOD_DSP_TYPE_PITCHSHIFT;  break;
   case FilterProperties::FT_chorus:     dsptype = FMOD_DSP_TYPE_CHORUS;      break;
-  case FilterProperties::FT_reverb:     dsptype = FMOD_DSP_TYPE_REVERB;      break;
+  case FilterProperties::FT_sfxreverb:  dsptype = FMOD_DSP_TYPE_SFXREVERB;   break;
   case FilterProperties::FT_compress:   dsptype = FMOD_DSP_TYPE_COMPRESSOR;  break;
   default:
     audio_error("Garbage in DSP configuration data");
@@ -262,81 +262,97 @@ make_dsp(const FilterProperties::FilterConfig &conf) {
     return NULL;
   }
 
-  FMOD_RESULT res1=FMOD_OK;
-  FMOD_RESULT res2=FMOD_OK;
-  FMOD_RESULT res3=FMOD_OK;
-  FMOD_RESULT res4=FMOD_OK;
-  FMOD_RESULT res5=FMOD_OK;
-  FMOD_RESULT res6=FMOD_OK;
-  FMOD_RESULT res7=FMOD_OK;
-  FMOD_RESULT res8=FMOD_OK;
+  FMOD_RESULT res1 = FMOD_OK;
+  FMOD_RESULT res2 = FMOD_OK;
+  FMOD_RESULT res3 = FMOD_OK;
+  FMOD_RESULT res4 = FMOD_OK;
+  FMOD_RESULT res5 = FMOD_OK;
+  FMOD_RESULT res6 = FMOD_OK;
+  FMOD_RESULT res7 = FMOD_OK;
+  FMOD_RESULT res8 = FMOD_OK;
+  FMOD_RESULT res9 = FMOD_OK;
+  FMOD_RESULT res10 = FMOD_OK;
+  FMOD_RESULT res11 = FMOD_OK;
+  FMOD_RESULT res12 = FMOD_OK;
+  FMOD_RESULT res13 = FMOD_OK;
+  FMOD_RESULT res14 = FMOD_OK;
 
   switch (conf._type) {
   case FilterProperties::FT_lowpass:
-    res1=dsp->setParameter(FMOD_DSP_LOWPASS_CUTOFF,     conf._a);
-    res2=dsp->setParameter(FMOD_DSP_LOWPASS_RESONANCE,  conf._b);
+    res1 = dsp->setParameter(FMOD_DSP_LOWPASS_CUTOFF,     conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_LOWPASS_RESONANCE,  conf._b);
     break;
   case FilterProperties::FT_highpass:
-    res1=dsp->setParameter(FMOD_DSP_HIGHPASS_CUTOFF,    conf._a);
-    res2=dsp->setParameter(FMOD_DSP_HIGHPASS_RESONANCE, conf._b);
+    res1 = dsp->setParameter(FMOD_DSP_HIGHPASS_CUTOFF,    conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_HIGHPASS_RESONANCE, conf._b);
     break;
   case FilterProperties::FT_echo:
-    res1=dsp->setParameter(FMOD_DSP_ECHO_DRYMIX,        conf._a);
-    res2=dsp->setParameter(FMOD_DSP_ECHO_WETMIX,        conf._b);
-    res3=dsp->setParameter(FMOD_DSP_ECHO_DELAY,         conf._c);
-    res4=dsp->setParameter(FMOD_DSP_ECHO_DECAYRATIO,    conf._d);
+    res1 = dsp->setParameter(FMOD_DSP_ECHO_DRYMIX,        conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_ECHO_WETMIX,        conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_ECHO_DELAY,         conf._c);
+    res4 = dsp->setParameter(FMOD_DSP_ECHO_DECAYRATIO,    conf._d);
     break;
   case FilterProperties::FT_flange:
-    res1=dsp->setParameter(FMOD_DSP_FLANGE_DRYMIX,      conf._a);
-    res2=dsp->setParameter(FMOD_DSP_FLANGE_WETMIX,      conf._b);
-    res3=dsp->setParameter(FMOD_DSP_FLANGE_DEPTH,       conf._c);
-    res4=dsp->setParameter(FMOD_DSP_FLANGE_RATE,        conf._d);
+    res1 = dsp->setParameter(FMOD_DSP_FLANGE_DRYMIX,      conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_FLANGE_WETMIX,      conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_FLANGE_DEPTH,       conf._c);
+    res4 = dsp->setParameter(FMOD_DSP_FLANGE_RATE,        conf._d);
     break;
   case FilterProperties::FT_distort:
-    res1=dsp->setParameter(FMOD_DSP_DISTORTION_LEVEL,   conf._a);
+    res1 = dsp->setParameter(FMOD_DSP_DISTORTION_LEVEL,   conf._a);
     break;
   case FilterProperties::FT_normalize:
-    res1=dsp->setParameter(FMOD_DSP_NORMALIZE_FADETIME,  conf._a);
-    res2=dsp->setParameter(FMOD_DSP_NORMALIZE_THRESHHOLD,conf._b);
-    res3=dsp->setParameter(FMOD_DSP_NORMALIZE_MAXAMP,    conf._c);
+    res1 = dsp->setParameter(FMOD_DSP_NORMALIZE_FADETIME,  conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_NORMALIZE_THRESHHOLD,conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_NORMALIZE_MAXAMP,    conf._c);
     break;
   case FilterProperties::FT_parameq:
-    res1=dsp->setParameter(FMOD_DSP_PARAMEQ_CENTER,     conf._a);
-    res2=dsp->setParameter(FMOD_DSP_PARAMEQ_BANDWIDTH,  conf._b);
-    res3=dsp->setParameter(FMOD_DSP_PARAMEQ_GAIN,       conf._c);
+    res1 = dsp->setParameter(FMOD_DSP_PARAMEQ_CENTER,     conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_PARAMEQ_BANDWIDTH,  conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_PARAMEQ_GAIN,       conf._c);
     break;
   case FilterProperties::FT_pitchshift:
-    res1=dsp->setParameter(FMOD_DSP_PITCHSHIFT_PITCH,   conf._a);
-    res2=dsp->setParameter(FMOD_DSP_PITCHSHIFT_FFTSIZE, conf._b);
-    res3=dsp->setParameter(FMOD_DSP_PITCHSHIFT_OVERLAP, conf._c);
+    res1 = dsp->setParameter(FMOD_DSP_PITCHSHIFT_PITCH,   conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_PITCHSHIFT_FFTSIZE, conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_PITCHSHIFT_OVERLAP, conf._c);
     break;
   case FilterProperties::FT_chorus:
-    res1=dsp->setParameter(FMOD_DSP_CHORUS_DRYMIX,      conf._a);
-    res2=dsp->setParameter(FMOD_DSP_CHORUS_WETMIX1,     conf._b);
-    res3=dsp->setParameter(FMOD_DSP_CHORUS_WETMIX2,     conf._c);
-    res4=dsp->setParameter(FMOD_DSP_CHORUS_WETMIX3,     conf._d);
-    res5=dsp->setParameter(FMOD_DSP_CHORUS_DELAY,       conf._e);
-    res6=dsp->setParameter(FMOD_DSP_CHORUS_RATE,        conf._f);
-    res7=dsp->setParameter(FMOD_DSP_CHORUS_DEPTH,       conf._g);
-    res8=dsp->setParameter(FMOD_DSP_CHORUS_FEEDBACK,    conf._h);
+    res1 = dsp->setParameter(FMOD_DSP_CHORUS_DRYMIX,      conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_CHORUS_WETMIX1,     conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_CHORUS_WETMIX2,     conf._c);
+    res4 = dsp->setParameter(FMOD_DSP_CHORUS_WETMIX3,     conf._d);
+    res5 = dsp->setParameter(FMOD_DSP_CHORUS_DELAY,       conf._e);
+    res6 = dsp->setParameter(FMOD_DSP_CHORUS_RATE,        conf._f);
+    res7 = dsp->setParameter(FMOD_DSP_CHORUS_DEPTH,       conf._g);
     break;
-  case FilterProperties::FT_reverb:
-    res1=dsp->setParameter(FMOD_DSP_REVERB_DRYMIX,      conf._a);
-    res2=dsp->setParameter(FMOD_DSP_REVERB_WETMIX,      conf._b);
-    res3=dsp->setParameter(FMOD_DSP_REVERB_ROOMSIZE,    conf._c);
-    res4=dsp->setParameter(FMOD_DSP_REVERB_DAMP,        conf._d);
-    res5=dsp->setParameter(FMOD_DSP_REVERB_WIDTH,       conf._e);
+  case FilterProperties::FT_sfxreverb:
+    res1 = dsp->setParameter(FMOD_DSP_SFXREVERB_DRYLEVEL, conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_SFXREVERB_ROOM,     conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_SFXREVERB_ROOMHF,   conf._c);
+    res4 = dsp->setParameter(FMOD_DSP_SFXREVERB_DECAYTIME,conf._d);
+    res5 = dsp->setParameter(FMOD_DSP_SFXREVERB_DECAYHFRATIO,    conf._e);
+    res6 = dsp->setParameter(FMOD_DSP_SFXREVERB_REFLECTIONSLEVEL,conf._f);
+    res7 = dsp->setParameter(FMOD_DSP_SFXREVERB_REFLECTIONSDELAY,conf._g);
+    res8 = dsp->setParameter(FMOD_DSP_SFXREVERB_REVERBLEVEL,     conf._h);
+    res9 = dsp->setParameter(FMOD_DSP_SFXREVERB_REVERBDELAY,     conf._i);
+    res10 = dsp->setParameter(FMOD_DSP_SFXREVERB_DIFFUSION,      conf._j);
+    res11 = dsp->setParameter(FMOD_DSP_SFXREVERB_DENSITY,        conf._k);
+    res12 = dsp->setParameter(FMOD_DSP_SFXREVERB_HFREFERENCE,    conf._l);
+    res13 = dsp->setParameter(FMOD_DSP_SFXREVERB_ROOMLF,         conf._m);
+    res14 = dsp->setParameter(FMOD_DSP_SFXREVERB_LFREFERENCE,    conf._n);
     break;
   case FilterProperties::FT_compress:
-    res1=dsp->setParameter(FMOD_DSP_COMPRESSOR_THRESHOLD, conf._a);
-    res2=dsp->setParameter(FMOD_DSP_COMPRESSOR_ATTACK,    conf._b);
-    res3=dsp->setParameter(FMOD_DSP_COMPRESSOR_RELEASE,   conf._c);
-    res4=dsp->setParameter(FMOD_DSP_COMPRESSOR_GAINMAKEUP,conf._d);
+    res1 = dsp->setParameter(FMOD_DSP_COMPRESSOR_THRESHOLD, conf._a);
+    res2 = dsp->setParameter(FMOD_DSP_COMPRESSOR_ATTACK,    conf._b);
+    res3 = dsp->setParameter(FMOD_DSP_COMPRESSOR_RELEASE,   conf._c);
+    res4 = dsp->setParameter(FMOD_DSP_COMPRESSOR_GAINMAKEUP,conf._d);
     break;
   }
 
   if ((res1!=FMOD_OK)||(res2!=FMOD_OK)||(res3!=FMOD_OK)||(res4!=FMOD_OK)||
-      (res5!=FMOD_OK)||(res6!=FMOD_OK)||(res7!=FMOD_OK)||(res8!=FMOD_OK)) {
+      (res5!=FMOD_OK)||(res6!=FMOD_OK)||(res7!=FMOD_OK)||(res8!=FMOD_OK)||
+      (res9!=FMOD_OK)||(res10!=FMOD_OK)||(res11!=FMOD_OK)||(res12!=FMOD_OK)||
+      (res13!=FMOD_OK)||(res14!=FMOD_OK)) {
     audio_error("Could not configure DSP");
     dsp->release();
     return NULL;
@@ -493,12 +509,18 @@ getSpeakerSetup() {
     case  FMOD_SPEAKERMODE_7POINT1:
       returnMode = 6;
       break;
-    case  FMOD_SPEAKERMODE_PROLOGIC:
+    case  FMOD_SPEAKERMODE_SRS5_1_MATRIX:
       returnMode = 7;
       break;
-    case  FMOD_SPEAKERMODE_MAX:
+    case  FMOD_SPEAKERMODE_DOLBY5_1_MATRIX:
       returnMode = 8;
       break;
+    case  FMOD_SPEAKERMODE_MYEARS:
+      returnMode = 9;
+      break;
+    case  FMOD_SPEAKERMODE_MAX:
+      returnMode = 10;
+      break;
     default:
       returnMode = -1;
     }