f_cnt_t SampleBuffer::decodeSampleSF( const char * _f, int_sample_t * & _buf, ch_cnt_t & _channels, sample_rate_t & _samplerate ) { SNDFILE * snd_file; SF_INFO sf_info; f_cnt_t frames = 0; bool sf_rr = false; sample_t * fbuf = 0; if( ( snd_file = sf_open( _f, SFM_READ, &sf_info ) ) != NULL ) { frames = sf_info.frames; // check if float if ( (sf_info.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT ) // if yes, use float format for buffer { fbuf = new sample_t[sf_info.channels * frames]; sf_rr = sf_read_float( snd_file, fbuf, sf_info.channels * frames ); } else // otherwise, use int { _buf = new int_sample_t[sf_info.channels * frames]; sf_rr = sf_read_short( snd_file, _buf, sf_info.channels * frames ); } if( sf_rr < sf_info.channels * frames ) { #ifdef DEBUG_LMMS printf( "SampleBuffer::decodeSampleSF(): could not read" " sample %s: %s\n", _f, sf_strerror( NULL ) ); #endif } _channels = sf_info.channels; _samplerate = sf_info.samplerate; sf_close( snd_file ); } else { #ifdef DEBUG_LMMS printf( "SampleBuffer::decodeSampleSF(): could not load " "sample %s: %s\n", _f, sf_strerror( NULL ) ); #endif } //write down either directly or convert i->f depending on file type if ( frames > 0 && fbuf != NULL ) { directFloatWrite ( fbuf, frames, _channels); } else if ( frames > 0 && _buf != NULL ) { convertIntToFloat ( _buf, frames, _channels); } return frames; }
f_cnt_t SampleBuffer::decodeSampleSF( const char * _f, sample_t * & _buf, ch_cnt_t & _channels, sample_rate_t & _samplerate ) { SNDFILE * snd_file; SF_INFO sf_info; sf_info.format = 0; f_cnt_t frames = 0; bool sf_rr = false; if( ( snd_file = sf_open( _f, SFM_READ, &sf_info ) ) != NULL ) { frames = sf_info.frames; _buf = new sample_t[sf_info.channels * frames]; sf_rr = sf_read_float( snd_file, _buf, sf_info.channels * frames ); if( sf_rr < sf_info.channels * frames ) { #ifdef DEBUG_LMMS qDebug( "SampleBuffer::decodeSampleSF(): could not read" " sample %s: %s", _f, sf_strerror( NULL ) ); #endif } _channels = sf_info.channels; _samplerate = sf_info.samplerate; sf_close( snd_file ); } else { #ifdef DEBUG_LMMS qDebug( "SampleBuffer::decodeSampleSF(): could not load " "sample %s: %s", _f, sf_strerror( NULL ) ); #endif } //write down either directly or convert i->f depending on file type if ( frames > 0 && _buf != NULL ) { directFloatWrite ( _buf, frames, _channels); } return frames; }