diff jssmix.c @ 158:255da2a698fe

Improve loop handling in the mixer.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 06 Oct 2012 05:30:22 +0300
parents 0c9438a2c72a
children fe0c7ae05776
line wrap: on
line diff
--- a/jssmix.c	Sat Oct 06 05:19:29 2012 +0300
+++ b/jssmix.c	Sat Oct 06 05:30:22 2012 +0300
@@ -252,8 +252,9 @@
                     // Bi-directional loop
                     if (FP_GETH(chn->chPos) >= chn->chLoopE)
                     {
-                        FP_SETH(chn->chPos, chn->chLoopE - 1);
-                        FP_SETL(chn->chPos, 0);
+                        DMFixedPoint end;
+                        FP_SETHL(end, chn->chLoopE + chn->chLoopE, 0);
+                        FP_SUB_R(chn->chPos, end, chn->chPos);
                         chn->chDirection = FALSE;
                     }
                 }
@@ -262,8 +263,11 @@
                     // Normal forward loop
                     if (FP_GETH(chn->chPos) >= chn->chLoopE)
                     {
-                        FP_SETH(chn->chPos, chn->chLoopS /* + (FP_GETH(chn->chPos) - chn->chLoopE) */);
-                        FP_SETL(chn->chPos, 0);
+                        DMFixedPoint diff, end;
+                        FP_SETHL(end, chn->chLoopE, 0);
+                        FP_SUB_R(diff, chn->chPos, end);
+                        FP_SETHL(chn->chPos, chn->chLoopS, 0);
+                        FP_ADD(chn->chPos, diff);
                     }
                 }
             }
@@ -288,8 +292,9 @@
                     // Bi-directional loop
                     if (FP_GETH(chn->chPos) <= chn->chLoopS)
                     {
-                        FP_SETH(chn->chPos, chn->chLoopS);
-                        FP_SETL(chn->chPos, 0);
+                        DMFixedPoint start;
+                        FP_SETHL(start, chn->chLoopS + chn->chLoopS, 0);
+                        FP_SUB_R(chn->chPos, start, chn->chPos);
                         chn->chDirection = TRUE;
                     }
                 }
@@ -298,8 +303,9 @@
                     // Normal forward loop
                     if (FP_GETH(chn->chPos) <= chn->chLoopS)
                     {
-                        FP_SETH(chn->chPos, chn->chLoopE - 1);
-                        FP_SETL(chn->chPos, 0);
+                        DMFixedPoint diff;
+                        FP_SETHL(diff, chn->chLoopE - chn->chLoopS, 0);
+                        FP_ADD(chn->chPos, diff);
                     }
                 }
             }