diff --git a/src/libFLAC/lpc.c b/src/libFLAC/lpc.c index 4457c822..c7ce227e 100644 --- a/src/libFLAC/lpc.c +++ b/src/libFLAC/lpc.c @@ -204,9 +204,16 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, FLAC__int32 q; for(i = 0; i < order; i++) { error += lp_coeff[i] * (1 << *shift); +#if defined _MSC_VER + if(error >= 0.0) + q = (FLAC__int32)(error + 0.5); + else + q = (FLAC__int32)(error - 0.5); +#else q = lround(error); /* round() is also suitable */ +#endif #ifdef FLAC__OVERFLOW_DETECT - if(q > qmax) + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to lround() */ fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); else if(q < qmin) fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q= 0.0) + q = (FLAC__int32)(error + 0.5); + else + q = (FLAC__int32)(error - 0.5); +#else q = lround(error); /* round() is also suitable */ +#endif #ifdef FLAC__OVERFLOW_DETECT - if(q > qmax) + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to lround() */ fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); else if(q < qmin) fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q