do not crash when loading old history files with MIDI edits; add all notes in region...
[ardour.git] / libs / ardour / resampled_source.cc
index 38aa3832b93d352fa22363200eb349a62ff7281a..cfc5c9f4f19a16628d2cb4424aeed9fc66f26a9e 100644 (file)
 
 */
 
-#include <pbd/error.h>
-#include <ardour/resampled_source.h>
-#include <pbd/failed_constructor.h>
+#include "pbd/error.h"
+#include "ardour/resampled_source.h"
+#include "pbd/failed_constructor.h"
 
 #include "i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
 
-const uint32_t ResampledImportableSource::blocksize = 4096U;
+const uint32_t ResampledImportableSource::blocksize = 16384U;
 
-ResampledImportableSource::ResampledImportableSource (SNDFILE* sf, SF_INFO* info, nframes_t rate, SrcQuality srcq)
-       : ImportableSource (sf, info) 
+ResampledImportableSource::ResampledImportableSource (boost::shared_ptr<ImportableSource> src, nframes_t rate, SrcQuality srcq)
+       : source (src)
 {
        int err;
        
-       sf_seek (in, 0, SEEK_SET) ;
+       source->seek (0);
        
        /* Initialize the sample rate converter. */
        
-       int src_type;
+       int src_type = SRC_SINC_BEST_QUALITY;
 
        switch (srcq) {
        case SrcBest:
@@ -57,7 +57,7 @@ ResampledImportableSource::ResampledImportableSource (SNDFILE* sf, SF_INFO* info
                break;
        }
        
-       if ((src_state = src_new (src_type, sf_info->channels, &err)) == 0) {   
+       if ((src_state = src_new (src_type, source->channels(), &err)) == 0) {  
                error << string_compose(_("Import: src_new() failed : %1"), src_strerror (err)) << endmsg ;
                throw failed_constructor ();
        }
@@ -69,7 +69,7 @@ ResampledImportableSource::ResampledImportableSource (SNDFILE* sf, SF_INFO* info
        src_data.input_frames = 0 ;
        src_data.data_in = input ;
        
-       src_data.src_ratio = ((float) rate) / sf_info->samplerate ;
+       src_data.src_ratio = ((float) rate) / source->samplerate();
        
        input = new float[blocksize];
 }
@@ -89,22 +89,22 @@ ResampledImportableSource::read (Sample* output, nframes_t nframes)
        
        if (src_data.input_frames == 0) {       
 
-               src_data.input_frames = ImportableSource::read (input, blocksize);
+               src_data.input_frames = source->read (input, blocksize);
 
                /* The last read will not be a full buffer, so set end_of_input. */
 
                if ((nframes_t) src_data.input_frames < blocksize) {
-                       src_data.end_of_input = SF_TRUE ;
+                       src_data.end_of_input = true;
                }               
 
-               src_data.input_frames /= sf_info->channels;
-               src_data.data_in = input ;
+               src_data.input_frames /= source->channels();
+               src_data.data_in = input;
        } 
        
        src_data.data_out = output;
 
        if (!src_data.end_of_input) {
-               src_data.output_frames = nframes / sf_info->channels ;
+               src_data.output_frames = nframes / source->channels();
        } else {
                src_data.output_frames = src_data.input_frames;
        }
@@ -120,9 +120,9 @@ ResampledImportableSource::read (Sample* output, nframes_t nframes)
                return 0;
        }
        
-       src_data.data_in += src_data.input_frames_used * sf_info->channels ;
+       src_data.data_in += src_data.input_frames_used * source->channels();
        src_data.input_frames -= src_data.input_frames_used ;
 
-       return src_data.output_frames_gen * sf_info->channels;
+       return src_data.output_frames_gen * source->channels();
 }