+class ImportableSource {
+ public:
+ ImportableSource (SNDFILE* sf, SF_INFO* info) : in (sf), sf_info (info) {}
+ virtual ~ImportableSource() {}
+
+ virtual nframes_t read (Sample* buffer, nframes_t nframes) {
+ nframes_t per_channel = nframes / sf_info->channels;
+ per_channel = sf_readf_float (in, buffer, per_channel);
+ return per_channel * sf_info->channels;
+ }
+
+ virtual float ratio() const { return 1.0f; }
+
+protected:
+ SNDFILE* in;
+ SF_INFO* sf_info;
+};
+
+class ResampledImportableSource : public ImportableSource {
+ public:
+ ResampledImportableSource (SNDFILE* sf, SF_INFO* info, nframes_t rate) : ImportableSource (sf, info) {
+ int err;
+
+ sf_seek (in, 0, SEEK_SET) ;
+
+ /* Initialize the sample rate converter. */
+
+ if ((src_state = src_new (SRC_SINC_BEST_QUALITY, sf_info->channels, &err)) == 0) {
+ error << string_compose(_("Import: src_new() failed : %1"), src_strerror (err)) << endmsg ;
+ throw failed_constructor ();
+ }
+
+ src_data.end_of_input = 0 ; /* Set this later. */
+
+ /* Start with zero to force load in while loop. */
+
+ src_data.input_frames = 0 ;
+ src_data.data_in = input ;
+
+ src_data.src_ratio = ((float) rate) / sf_info->samplerate ;
+
+ }
+
+ ~ResampledImportableSource () {
+ src_state = src_delete (src_state) ;
+ }
+
+ nframes_t read (Sample* buffer, nframes_t nframes);
+
+ float ratio() const { return src_data.src_ratio; }
+
+ private:
+ float input[BLOCKSIZE];
+ SRC_STATE* src_state;
+ SRC_DATA src_data;
+};
+