X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsrcfilesource.cc;h=1a11970c79ba350464243491921f01e4fb292aaf;hb=0e55f33f382c4e9b380efc20c78dd57870c54597;hp=e54afbfaba738e64c50381109d7a9998bf639a67;hpb=ced4378d0914bcfb926267772c45d1d23f3bed38;p=ardour.git diff --git a/libs/ardour/srcfilesource.cc b/libs/ardour/srcfilesource.cc index e54afbfaba..1a11970c79 100644 --- a/libs/ardour/srcfilesource.cc +++ b/libs/ardour/srcfilesource.cc @@ -25,12 +25,12 @@ #include "ardour/debug.h" #include "ardour/srcfilesource.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; -const uint32_t SrcFileSource::blocksize = 65536U; /* somewhat arbitrary */ +const uint32_t SrcFileSource::max_blocksize = 2097152U; /* see AudioDiskstream::_do_refill_with_alloc, max */ SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr src, SrcQuality srcq) : Source(s, DataType::AUDIO, src->name(), Flag (src->flags() & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy))) @@ -64,10 +64,10 @@ SrcFileSource::SrcFileSource (Session& s, boost::shared_ptr src } - _ratio = s.nominal_frame_rate() / _source->sample_rate(); + _ratio = s.nominal_sample_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; @@ -84,8 +84,17 @@ SrcFileSource::~SrcFileSource () delete [] _src_buffer; } -framecnt_t -SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const +void +SrcFileSource::close () +{ + boost::shared_ptr fs = boost::dynamic_pointer_cast (_source); + if (fs) { + fs->close (); + } +} + +samplecnt_t +SrcFileSource::read_unlocked (Sample *dst, samplepos_t start, samplecnt_t cnt) const { int err; const double srccnt = cnt / _ratio; @@ -98,7 +107,7 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con _target_position = start; } - const framecnt_t scnt = ceilf(srccnt - _fract_position); + const samplecnt_t scnt = ceilf(srccnt - _fract_position); _fract_position += (scnt - srccnt); #ifndef NDEBUG @@ -111,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 ((samplecnt_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 ((samplecnt_t) _src_data.input_frames < scnt) { + _target_position += _src_data.input_frames * _ratio; + } else { _target_position += cnt; } @@ -125,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; @@ -141,12 +149,12 @@ SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con _source_position += _src_data.input_frames_used; - framepos_t saved_target = _target_position; - framecnt_t generated = _src_data.output_frames_gen; + samplepos_t saved_target = _target_position; + samplecnt_t generated = _src_data.output_frames_gen; while (generated < cnt) { DEBUG_TRACE (DEBUG::AudioPlayback, string_compose ("SRC: recurse for %1 samples\n", cnt - generated)); - framecnt_t g = read_unlocked(dst + generated, _target_position, cnt - generated); + samplecnt_t g = read_unlocked(dst + generated, _target_position, cnt - generated); generated += g; if (g == 0) break; }