Line data Source code
1 : /** 2 : * \file InSndFileFilter.cpp 3 : */ 4 : 5 : #include "InSndFileFilter.h" 6 : 7 : #include <sndfile.hh> 8 : 9 : namespace ATK 10 : { 11 : template<typename DataType> 12 6 : InSndFileFilter<DataType>::InSndFileFilter(const std::string& filename) 13 6 : :TypedBaseFilter<DataType>(0, 0) 14 : { 15 6 : stream = std::make_unique<SndfileHandle>(filename.c_str()); 16 6 : set_output_sampling_rate(stream->samplerate()); 17 6 : set_nb_output_ports(stream->channels()); 18 6 : stream->command(SFC_SET_SCALE_FLOAT_INT_READ, NULL, 1); 19 6 : } 20 : 21 : template<typename DataType> 22 6 : InSndFileFilter<DataType>::~InSndFileFilter() 23 : { 24 6 : } 25 : 26 : template<typename DataType> 27 1 : int64_t InSndFileFilter<DataType>::get_frames() const 28 : { 29 1 : return stream->frames(); 30 : } 31 : 32 : template<typename DataType> 33 6 : void InSndFileFilter<DataType>::process_impl(gsl::index size) const 34 : { 35 12 : std::vector<DataType> temp(size * outputs.size()); 36 6 : stream->read(temp.data(), size * outputs.size()); 37 : 38 6150 : for(gsl::index i = 0; i < size; ++i) 39 : { 40 15360 : for(gsl::index j = 0; j < outputs.size(); ++j) 41 : { 42 9216 : outputs[j][i] = temp[j + i * outputs.size()]; 43 : } 44 : } 45 : 46 6 : } 47 : 48 : #if ATK_ENABLE_INSTANTIATION 49 : template class InSndFileFilter<std::int16_t>; 50 : template class InSndFileFilter<std::int32_t>; 51 : #endif 52 : template class InSndFileFilter<float>; 53 : template class InSndFileFilter<double>; 54 : }