summaryrefslogtreecommitdiff
path: root/libs/ardour/sndfilesource.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/sndfilesource.cc')
-rw-r--r--libs/ardour/sndfilesource.cc52
1 files changed, 9 insertions, 43 deletions
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index ffd9c8c752..b6f3accd4e 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -25,7 +25,6 @@
#include <sys/stat.h>
#include <glibmm/miscutils.h>
-#include <glibmm/thread.h>
#include <pbd/stacktrace.h>
#include <ardour/sndfilesource.h>
@@ -46,21 +45,6 @@ const AudioFileSource::Flag SndFileSource::default_writable_flags = AudioFileSou
AudioFileSource::Removable|
AudioFileSource::RemovableIfEmpty|
AudioFileSource::CanRename);
-struct SizedSampleBuffer {
- nframes_t size;
- Sample* buf;
-
- SizedSampleBuffer (nframes_t sz) : size (sz) {
- buf = new Sample[size];
- }
-
- ~SizedSampleBuffer() {
- delete [] buf;
- }
-};
-
-Glib::StaticPrivate<SizedSampleBuffer> thread_interleave_buffer = GLIBMM_STATIC_PRIVATE_INIT;
-
SndFileSource::SndFileSource (Session& s, const XMLNode& node)
: AudioFileSource (s, node)
{
@@ -96,7 +80,7 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
*/
file_is_new = true;
-
+
switch (hf) {
case CAF:
fmt = SF_FORMAT_CAF;
@@ -190,9 +174,8 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
_flags = Flag (_flags & ~Broadcast);
delete _broadcast_info;
_broadcast_info = 0;
- }
-
- }
+ }
+ }
}
void
@@ -256,7 +239,7 @@ SndFileSource::open ()
set_timeline_position (get_timecode_info (sf, _broadcast_info, timecode_info_exists));
- if (!timecode_info_exists) {
+ if (_length != 0 && !timecode_info_exists) {
delete _broadcast_info;
_broadcast_info = 0;
_flags = Flag (_flags & ~Broadcast);
@@ -328,6 +311,11 @@ SndFileSource::read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const
file_cnt = cnt;
}
+ if (file_cnt != cnt) {
+ nframes_t delta = cnt - file_cnt;
+ memset (dst+file_cnt, 0, sizeof (Sample) * delta);
+ }
+
if (file_cnt) {
if (sf_seek (sf, (sf_count_t) start, SEEK_SET|SFM_READ) != (sf_count_t) start) {
@@ -344,11 +332,6 @@ SndFileSource::read_unlocked (Sample *dst, nframes_t start, nframes_t cnt) const
}
}
- if (file_cnt != cnt) {
- nframes_t delta = cnt - file_cnt;
- memset (dst+file_cnt, 0, sizeof (Sample) * delta);
- }
-
real_cnt = cnt * _info.channels;
Sample* interleave_buf = get_interleave_buffer (real_cnt);
@@ -908,20 +891,3 @@ SndFileSource::one_of_several_channels () const
return _info.channels > 1;
}
-Sample*
-SndFileSource::get_interleave_buffer (nframes_t size)
-{
- SizedSampleBuffer* ssb;
-
- if ((ssb = thread_interleave_buffer.get()) == 0) {
- ssb = new SizedSampleBuffer (size);
- thread_interleave_buffer.set (ssb);
- }
-
- if (ssb->size < size) {
- ssb = new SizedSampleBuffer (size);
- thread_interleave_buffer.set (ssb);
- }
-
- return ssb->buf;
-}