60 lines
1.7 KiB
Plaintext
60 lines
1.7 KiB
Plaintext
|
|
16Apr2003 Steve Kann <stevek@stevek.com>
|
|
|
|
The code in resample.c/resample.h has been liberally yanked from the SoX
|
|
distribution, and reworked just a tiny bit to allow compilation outside
|
|
of SoX.
|
|
|
|
Aside from some minor changes to the calling conventions (to use just
|
|
the private resample data structure, not the larget sox structures), and
|
|
generic code moves/defines that needed to be localized, the other
|
|
notable changes are:
|
|
|
|
1) st_sample_t is here defined as a 16 bit integer, and not a 32 bit
|
|
integer, so this code will will be able to operate over 16 bit unsigned
|
|
samples (the resample effect works with floating point internally
|
|
anyway, so it was a small change in the code).
|
|
|
|
2) The "getopts" call is not necessary (nor, at this point helpful,
|
|
since the options are set to their default now ad the beginning of
|
|
start).
|
|
|
|
3) start now takes two additional parameters, "inrate" and "outrate"
|
|
|
|
To use this, the basic idea is:
|
|
|
|
|
|
st_resample_t resampler;
|
|
|
|
st_resample_start(&resampler, inrate, outrate);
|
|
|
|
while(you have input data)
|
|
{
|
|
iNum = (number of Input samples we have);
|
|
oNum = (size of Output buffer available)
|
|
iBuf = input buffer;
|
|
oBuf = output buffer;
|
|
if(st_resample_flow(&resampler, ibuf, obuf, &iNum, &oNum) != ST_SUCCESS)
|
|
{
|
|
handle error.
|
|
}
|
|
|
|
(after calling, iNum, oNum will the the count of buffers
|
|
read/written)
|
|
}
|
|
|
|
finally, you call st_sample_drain, to get the "last" output;
|
|
|
|
if(st_sample_drain(&resampler, obuf, &oNum) != ST_SUCCESS)
|
|
{
|
|
error
|
|
}
|
|
|
|
Then, call st_sample_stop, to free resources:
|
|
st_sample_stop(&resampler);
|
|
|
|
For a discussion on this and other resampling algorithms, see this page for a
|
|
great analysis by K. Bradley and Andreas Wilde at:
|
|
http://leute.server.de/wilde/resample.html
|
|
|