Re: [AD] [SCM] Allegro branch 5.1 updated. 5.1.3-21-g1a7e633

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


On Mon, 3 Sep 2012 00:33:13 +1000, Peter Wang <novalazy@xxxxxxxxxx> wrote:
> On Sun, 2 Sep 2012 11:29:34 +0200, Evert Glebbeek <eglebbk@xxxxxxxxxx> wrote:
> > 
> > The method is extremely simple, described in http://adsabs.harvard.edu/abs/1990A%26A...239..443S. Is this something that is worth looking into for Allegro?
> 
> Yes, worth a shot.  I can see the overshoots clearly with a sawtooth wave.
> I'll try it tomorrow or so.

I think I implemented it correctly, but it sounds really bad (worse than
linear interpolation).  Frequency plot attached.  But perhaps you can
have a look over the patch and see if I got it completely wrong.

Peter
diff --git a/addons/audio/kcm_mixer.c b/addons/audio/kcm_mixer.c
index 10c40a6..efe7290 100644
--- a/addons/audio/kcm_mixer.c
+++ b/addons/audio/kcm_mixer.c
@@ -242,6 +242,18 @@ static bool fix_looped_position(ALLEGRO_SAMPLE_INSTANCE *spl)
 }
 
 
+static inline float sign(float x)
+{
+   return (x >= 0.0f) ? 1.0 : -1.0;
+}
+
+
+static inline float min3(float a, float b, float c)
+{
+   return fminf(a, fminf(b, c));
+}
+
+
 #include "kcm_mixer_helpers.inc"
 
 
diff --git a/misc/make_mixer_helpers.py b/misc/make_mixer_helpers.py
index 7fe717b..7c83da0 100755
--- a/misc/make_mixer_helpers.py
+++ b/misc/make_mixer_helpers.py
@@ -268,6 +268,7 @@ def make_cubic_interpolator(name, fmt):
       # Resampling of Oversampled Audio" by Olli Niemitalo
       # http://yehar.com/blog/?p=197
       print interp("""\
+         /*
          case #{depth.constant()}:
          {
             const float t = (float)spl->pos_bresenham_error / spl->step_denom;
@@ -286,6 +287,40 @@ def make_cubic_interpolator(name, fmt):
             }
          }
          break;
+         */
+
+         case #{depth.constant()}:
+         {
+            const float t = (float)spl->pos_bresenham_error / spl->step_denom;
+            signed int i;
+            for (i = 0; i < (signed int)maxc; i++) {
+               float y0 = #{value0};
+               float y1 = #{value1};
+               float y2 = #{value2};
+               float y3 = #{value3};
+
+               float h = 1; /* size of interval */
+               float s0 = (y1 - y0)/h;
+               float s1 = (y2 - y1)/h;
+               float s2 = (y3 - y2)/h;
+
+               float p1 = (s0*h + s1*h)/(h+h);
+               float p2 = (s1*h + s2*h)/(h+h);
+
+               float yp1 = (sign(s0) + sign(s1)) * min3( fabsf(s0), fabsf(s1), 0.5*fabsf(p1) );
+               float yp2 = (sign(s1) + sign(s2)) * min3( fabsf(s1), fabsf(s2), 0.5*fabsf(p2) );
+
+               float a1 = (yp1 + yp2 - 2*s1)/(h*h);
+               float b1 = (3*s1 - 2*yp1 - yp2)/h;
+               float c1 = yp1;
+               float d1 = y1;
+
+               float f1 = a1*(t*t*t) + b1*(t*t) + c1*t + d1;
+
+               samp_buf->f32[i] = f1;
+            }
+         }
+         break;
          """)
 
    print interp("""\

Attachment: ss1.png
Description: PNG image



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/