//TODO Add ifdef for int16 or float32 type void SamplerateConverter::resample (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int inputFreq , int outputFreq , int nbSamples) { double sampleFactor = (double) outputFreq / inputFreq; if (sampleFactor == 1.0) return; unsigned int outSamples = nbSamples * sampleFactor; unsigned int maxSamples = outSamples; if (maxSamples < (unsigned int)nbSamples) maxSamples = nbSamples; if (maxSamples > _samples) { /* grow buffer if needed */ _samples = maxSamples; delete [] _floatBufferIn; delete [] _floatBufferOut; _floatBufferIn = new float32[_samples]; _floatBufferOut = new float32[_samples]; } SRC_DATA src_data; src_data.data_in = _floatBufferIn; src_data.data_out = _floatBufferOut; src_data.input_frames = nbSamples; src_data.output_frames = outSamples; src_data.src_ratio = sampleFactor; src_data.end_of_input = 0; // More data will come Short2FloatArray (dataIn , _floatBufferIn, nbSamples); src_process (_src_state, &src_data); src_float_to_short_array (_floatBufferOut, dataOut , outSamples); }
void SamplerateConverter::resample(SFLDataFormat *dataIn, SFLDataFormat *dataOut, size_t dataOutSize, int inputFreq, int outputFreq, size_t nbSamples) { double sampleFactor = (double) outputFreq / inputFreq; if (sampleFactor == 1.0) return; size_t outSamples = nbSamples * sampleFactor; const unsigned int maxSamples = std::max(outSamples, nbSamples); if (maxSamples > samples_) { /* grow buffer if needed */ samples_ = maxSamples; delete [] floatBufferIn_; delete [] floatBufferOut_; floatBufferIn_ = new float[samples_]; floatBufferOut_ = new float[samples_]; } SRC_DATA src_data; src_data.data_in = floatBufferIn_; src_data.data_out = floatBufferOut_; src_data.input_frames = nbSamples; src_data.output_frames = outSamples; src_data.src_ratio = sampleFactor; src_data.end_of_input = 0; // More data will come Short2FloatArray(dataIn, floatBufferIn_, nbSamples); src_process(src_state_, &src_data); if (outSamples > dataOutSize) { ERROR("Outsamples exceeds output buffer size, clamping to %u", dataOutSize); outSamples = dataOutSize; } src_float_to_short_array(floatBufferOut_, dataOut, outSamples); }