fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / srcfilesource.cc
index 6af4aaa9d815fb1567f731402472810948229b1c..98389bf33bbf51f06a61f225a57fc435127c4f42 100644 (file)
 #include "ardour/debug.h"
 #include "ardour/srcfilesource.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
 
-/* see disk_io_chunk_frames */
-const uint32_t SrcFileSource::blocksize = 65536U;
+const uint32_t SrcFileSource::max_blocksize = 2097152U; /* see AudioDiskstream::_do_refill_with_alloc, max */
 
 SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr<AudioFileSource> src, SrcQuality srcq)
        : Source(s, DataType::AUDIO, src->name(), Flag (src->flags() & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
@@ -68,7 +67,7 @@ SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr<AudioFileSource> src
        _ratio = s.nominal_frame_rate() / _source->sample_rate();
        _src_data.src_ratio = _ratio;
 
-       src_buffer_size = ceil((double)blocksize / _ratio) + 2;
+       src_buffer_size = ceil((double)max_blocksize / _ratio) + 2;
        _src_buffer = new float[src_buffer_size];
 
        int err;
@@ -85,6 +84,15 @@ SrcFileSource::~SrcFileSource ()
        delete [] _src_buffer;
 }
 
+void
+SrcFileSource::close ()
+{
+       boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (_source);
+       if (fs) {
+               fs->close ();
+       }
+}
+
 framecnt_t
 SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const
 {
@@ -112,13 +120,17 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con
 
        _src_data.input_frames = _source->read (_src_buffer, _source_position, scnt);
 
-       if ((framecnt_t) _src_data.input_frames < scnt
-                       || _source_position + scnt >= _source->length(0)) {
+       if ((framecnt_t) _src_data.input_frames * _ratio <= cnt
+                       && _source_position + scnt >= _source->length(0)) {
                _src_data.end_of_input = true;
-               _target_position += _src_data.input_frames * _ratio;
                DEBUG_TRACE (DEBUG::AudioPlayback, "SRC: END OF INPUT\n");
        } else {
                _src_data.end_of_input = false;
+       }
+
+       if ((framecnt_t) _src_data.input_frames < scnt) {
+               _target_position += _src_data.input_frames * _ratio;
+       } else {
                _target_position += cnt;
        }
 
@@ -126,11 +138,6 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con
        _src_data.data_in = _src_buffer;
        _src_data.data_out = dst;
 
-       if (_src_data.end_of_input) {
-               _src_data.output_frames = std::min ((long)floor(_src_data.input_frames * _ratio), _src_data.output_frames);
-       }
-
-
        if ((err = src_process (_src_state, &_src_data))) {
                error << string_compose(_("SrcFileSource: %1"), src_strerror (err)) << endmsg ;
                return 0;