--- src/oss.c.orig 2008-02-17 10:56:11.000000000 +0800 +++ src/oss.c 2008-02-17 10:57:44.000000000 +0800 @@ -200,8 +200,13 @@ return (SOX_EOF); } +#ifdef __FreeBSD__ + /* Actually, this is unnecessary */ + setvbuf(ft->fp, NULL, _IOFBF, sizeof(char) * file->size); +#else /* Change to non-buffered I/O */ setvbuf(ft->fp, NULL, _IONBF, sizeof(char) * file->size); +#endif return(SOX_SUCCESS); } --- src/resample.c.orig 2008-03-16 13:25:00.000000000 +0800 +++ src/resample.c 2008-03-16 13:25:07.000000000 +0800 @@ -183,6 +183,22 @@ sox_debug("opts: Nuttall window, cutoff %f", r->rolloff); } else sox_debug("opts: Kaiser window, cutoff %f, beta %f", r->rolloff, r->beta); + + if ((n >= 3) && !sscanf(argv[2], "%ld", &r->Nmult)) + return sox_usage(effp); + else { + if (r->Nmult < 3) + r->Nmult = 3; + else if (r->Nmult > 256) + r->Nmult = 256; + r->Nmult += 1; + r->Nmult &= ~1; + r->Nmult -= 1; + } + + sox_debug("resample: rolloff=%f, beta=%f, taps=%ld", + r->rolloff, r->beta, r->Nmult); + return (SOX_SUCCESS); } @@ -193,7 +209,7 @@ { resample_t r = (resample_t) effp->priv; long Xoff, gcdrate; - int i; + int i, ecoeff, quadr; if (effp->ininfo.rate == effp->outinfo.rate) return SOX_EFF_NULL; @@ -206,12 +222,18 @@ r->a = effp->ininfo.rate / gcdrate; r->b = effp->outinfo.rate / gcdrate; + ecoeff = 0; + quadr = r->quadr; + if (r->a <= r->b && r->b <= NQMAX) { r->quadr = -1; /* exact coeffs */ r->Nq = r->b; /* max(r->a,r->b) */ + sox_debug("resample: exact coeffs"); + ecoeff = 1; } else r->Nq = Nc; /* for now */ +make_filter: /* Nwing: # of filter coeffs in right wing */ r->Nwing = r->Nq * (r->Nmult / 2 + 1) + 1; @@ -220,6 +242,13 @@ /* returns error # <=0, or adjusted wing-len > 0 */ i = makeFilter(r->Imp, r->Nwing, r->rolloff, r->beta, r->Nq, 1); if (i <= 0) { + if (ecoeff == 1) { + ecoeff = 0; + r->Nq = Nc; + r->quadr = quadr; + free(r->Imp - 1); + goto make_filter; + } sox_fail("Unable to make filter"); return (SOX_EOF); }