#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)))
_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;
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
{
_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;
}
_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;