|
- #pragma once
-
- #include <assert.h>
- #include <samplerate.h>
- #include "frame.hpp"
-
-
- namespace rack {
-
- template<int CHANNELS>
- struct SampleRateConverter {
- SRC_STATE *state;
- SRC_DATA data;
-
- SampleRateConverter() {
- int error;
- state = src_new(SRC_SINC_FASTEST, CHANNELS, &error);
- assert(!error);
-
- data.src_ratio = 1.0;
- data.end_of_input = false;
- }
- ~SampleRateConverter() {
- src_delete(state);
- }
- /** output_sample_rate / input_sample_rate */
- void setRatio(float r) {
- src_set_ratio(state, r);
- data.src_ratio = r;
- }
- void setRatioSmooth(float r) {
- data.src_ratio = r;
- }
- /** `in` and `out` are interlaced with the number of channels */
- void process(const Frame<CHANNELS> *in, int *inFrames, Frame<CHANNELS> *out, int *outFrames) {
- // Old versions of libsamplerate use float* here instead of const float*
- data.data_in = (float*) in;
- data.input_frames = *inFrames;
- data.data_out = (float*) out;
- data.output_frames = *outFrames;
- src_process(state, &data);
- *inFrames = data.input_frames_used;
- *outFrames = data.output_frames_gen;
- }
- void reset() {
- src_reset(state);
- }
- };
-
- } // namespace rack
|