I've made a couple more hacks to this so it works better for my purposes:

1. I changed void AudioFilterStateVariable::update_variable to use 4x oversampling instead of just 2x;

old 2x code snippet:

(starting around line 147 in filter_variable.cpp)

Code:

// now do the state variable filter as normal, using fmult
input = (*in++) << 12;
lowpass = lowpass + MULT(fmult, bandpass);
highpass = ((input + inputprev)>>1) - lowpass - MULT(damp, bandpass);
inputprev = input;
bandpass = bandpass + MULT(fmult, highpass);
lowpasstmp = lowpass;
bandpasstmp = bandpass;
highpasstmp = highpass;
lowpass = lowpass + MULT(fmult, bandpass);
highpass = input - lowpass - MULT(damp, bandpass);
bandpass = bandpass + MULT(fmult, highpass);
lowpasstmp = signed_saturate_rshift(lowpass+lowpasstmp, 16, 13);
bandpasstmp = signed_saturate_rshift(bandpass+bandpasstmp, 16, 13);
highpasstmp = signed_saturate_rshift(highpass+highpasstmp, 16, 13);
*lp++ = lowpasstmp;
*bp++ = bandpasstmp;
*hp++ = highpasstmp;

new 4x code snippet:

Code:

// now do the state variable filter as normal, using fmult
input = (*in++) << 12;
lowpass = lowpass + MULT(fmult, bandpass);
highpass = ((input + 3*inputprev)>>2) - lowpass - MULT(damp, bandpass);
bandpass = bandpass + MULT(fmult, highpass);
lowpass = lowpass + MULT(fmult, bandpass);
highpass = ((input + inputprev)>>1) - lowpass - MULT(damp, bandpass);
bandpass = bandpass + MULT(fmult, highpass);
lowpass = lowpass + MULT(fmult, bandpass);
highpass = ((3*input + inputprev)>>2) - lowpass - MULT(damp, bandpass);
bandpass = bandpass + MULT(fmult, highpass);
lowpass = lowpass + MULT(fmult, bandpass);
highpass = input - lowpass - MULT(damp, bandpass);
bandpass = bandpass + MULT(fmult, highpass);
lowpasstmp = signed_saturate_rshift(lowpass, 16, 12); // just decimate, no need to avg outputs
bandpasstmp = signed_saturate_rshift(bandpass, 16, 12);
highpasstmp = signed_saturate_rshift(highpass, 16, 12);
inputprev = input;
*lp++ = lowpasstmp;
*bp++ = bandpasstmp;
*hp++ = highpasstmp;

2. then I changed line 100:

//fcenter = setting_fcenter;

fcenter = setting_fcenter/2;

3. then I changed around line 133 a little more to:

if (fmult > 4194303) fmult = 4194303;

4. then I changed line 55 of filter_variable.h

//if (q < 0.7f) q = 0.7f;

if (q < 0.5f) q = 0.5f;

Now with these changes the filter is stable with Fc up to 29.4kHz, even with a q as low as 0.5.

the down sampling is just decimated by taking one of the 4 sample instead of averaging like it was before,

but this seems to work fine.

Anyway, I just wanted to share what i did with this in case it helps someone.