fix up BWF creation; make CoreAudioSource work; add CAImportable; refactor SourceFact...
[ardour.git] / libs / ardour / audiofilesource.cc
index bcace29978d1d07fb651555adcf8fee9fc031f53..0ef9fb2dbc2d0a439e99ce1447367d27c9c15f33 100644 (file)
@@ -39,6 +39,7 @@
 
 #include <glibmm/miscutils.h>
 #include <glibmm/fileutils.h>
+#include <glibmm/thread.h>
 
 #include <ardour/audiofilesource.h>
 #include <ardour/sndfile_helpers.h>
@@ -69,6 +70,21 @@ uint64_t           AudioFileSource::header_position_offset = 0;
 /* XXX maybe this too */
 char   AudioFileSource::bwf_serial_number[13] = "000000000000";
 
+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;
+
 AudioFileSource::AudioFileSource (Session& s, ustring path, Flag flags)
        : AudioSource (s, path), _flags (flags),
          _channel (0)
@@ -682,7 +698,9 @@ AudioFileSource::safe_file_extension(ustring file)
 {
        return !(file.rfind(".wav") == ustring::npos &&
                file.rfind(".aiff")== ustring::npos &&
+               file.rfind(".caf")== ustring::npos &&
                file.rfind(".aif") == ustring::npos &&
+               file.rfind(".amb") == ustring::npos &&
                file.rfind(".snd") == ustring::npos &&
                file.rfind(".au")  == ustring::npos &&
                file.rfind(".raw") == ustring::npos &&
@@ -714,3 +732,22 @@ AudioFileSource::mark_immutable ()
                _flags = Flag (_flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy|CanRename));
        }
 }
+
+
+Sample*
+AudioFileSource::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;
+}