/* Input and output sampling rate are at most 48000 Hz */ int silk_resampler(silk_resampler_state_struct * S, /* I/O Resampler state */ int16_t out[], /* O Output signal */ const int16_t in[], /* I Input signal */ int32_t inLen /* I Number of input samples */ ) { int nSamples; /* Need at least 1 ms of input data */ assert(inLen >= S->Fs_in_kHz); /* Delay can't exceed the 1 ms of buffering */ assert(S->inputDelay <= S->Fs_in_kHz); nSamples = S->Fs_in_kHz - S->inputDelay; /* Copy to delay buffer */ memcpy(&S->delayBuf[S->inputDelay], in, nSamples * sizeof(int16_t)); switch (S->resampler_function) { case USE_silk_resampler_private_up2_HQ_wrapper: silk_resampler_private_up2_HQ_wrapper(S, out, S->delayBuf, S->Fs_in_kHz); silk_resampler_private_up2_HQ_wrapper(S, &out[S->Fs_out_kHz], &in[nSamples], inLen - S->Fs_in_kHz); break; case USE_silk_resampler_private_IIR_FIR: silk_resampler_private_IIR_FIR(S, out, S->delayBuf, S->Fs_in_kHz); silk_resampler_private_IIR_FIR(S, &out[S->Fs_out_kHz], &in[nSamples], inLen - S->Fs_in_kHz); break; case USE_silk_resampler_private_down_FIR: silk_resampler_private_down_FIR(S, out, S->delayBuf, S->Fs_in_kHz); silk_resampler_private_down_FIR(S, &out[S->Fs_out_kHz], &in[nSamples], inLen - S->Fs_in_kHz); break; default: memcpy(out, S->delayBuf, S->Fs_in_kHz * sizeof(int16_t)); memcpy(&out[S->Fs_out_kHz], &in[nSamples], (inLen - S->Fs_in_kHz) * sizeof(int16_t)); } /* Copy to delay buffer */ memcpy(S->delayBuf, &in[inLen - S->inputDelay], S->inputDelay * sizeof(int16_t)); return 0; }
/* Resampler: convert from one sampling rate to another */ opus_int silk_resampler( silk_resampler_state_struct *S, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ) { /* Input and output sampling rate are at most 48000 Hz */ switch( S->resampler_function ) { case USE_silk_resampler_private_up2_HQ_wrapper: silk_resampler_private_up2_HQ_wrapper( S, out, in, inLen ); break; case USE_silk_resampler_private_IIR_FIR: silk_resampler_private_IIR_FIR( S, out, in, inLen ); break; case USE_silk_resampler_private_down_FIR: silk_resampler_private_down_FIR( S, out, in, inLen ); break; default: silk_memcpy( out, in, inLen * sizeof( opus_int16 ) ); } return 0; }