Erik de Castro Lopo wrote:
The fix in this case was this:
for (;;)
{
/* Bunch of other code. */
fractional += increment ;
rem = fmod (fractional, 1.0); /* floating point modulus */
integer += lrint (round (fractional - rem));
fractional = rem;
}
which is far more robust.
In LinuxSampler we do
double increment;
double fullindex;
int integer;
double fractional;
for (;;)
{
/* Bunch of other code. */
fullindex += increment;
integer = lrintf(fullindex);
fractional = fullindex - integer;
}
I did not benchmark the above code against yours but I think it should
be faster.
(plus instead of lrintf() we use an asm FISTL macro which is a bit
faster (around 10% IIRC).
cheers,
Benno
http://www.linuxsampler.org