Esempio n. 1
0
//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);
}
Esempio n. 2
0
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);
}