summaryrefslogtreecommitdiff
path: root/libs/ardour/sndfilesource.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-03-17 20:54:03 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-03-17 20:54:03 +0000
commit997e4b1f9cd7ccfc704b7c035051da7f60d831e7 (patch)
tree1236e40183b677abf4a2882e4cfe8e0a345eb24d /libs/ardour/sndfilesource.cc
parent19a4b990325577fc949ccd5d5fbad4520eb1df56 (diff)
merge with 2.0-ongoing @ rev 3147
git-svn-id: svn://localhost/ardour2/branches/3.0@3152 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/sndfilesource.cc')
-rw-r--r--libs/ardour/sndfilesource.cc61
1 files changed, 17 insertions, 44 deletions
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 7c4859aa55..e534964343 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 <ardour/sndfilesource.h>
#include <ardour/sndfile_helpers.h>
#include <ardour/utils.h>
@@ -44,22 +43,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)
{
@@ -95,7 +78,7 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
*/
file_is_new = true;
-
+
switch (hf) {
case CAF:
fmt = SF_FORMAT_CAF;
@@ -189,9 +172,8 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
_flags = Flag (_flags & ~Broadcast);
delete _broadcast_info;
_broadcast_info = 0;
- }
-
- }
+ }
+ }
}
void
@@ -234,13 +216,21 @@ SndFileSource::open ()
if ((sf = sf_open (_path.c_str(), (writable() ? SFM_RDWR : SFM_READ), &_info)) == 0) {
char errbuf[256];
sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+#ifndef HAVE_COREAUDIO
+ /* if we have CoreAudio, we will be falling back to that if libsndfile fails,
+ so we don't want to see this message.
+ */
+
error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"),
_path, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
+#endif
return -1;
}
if (_channel >= _info.channels) {
+#ifndef HAVE_COREAUDIO
error << string_compose(_("SndFileSource: file only contains %1 channels; %2 is invalid as a channel number"), _info.channels, _channel) << endmsg;
+#endif
sf_close (sf);
sf = 0;
return -1;
@@ -255,7 +245,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);
@@ -327,6 +317,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) {
@@ -343,11 +338,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);
@@ -907,20 +897,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;
-}