diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-02-27 13:56:14 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-02-27 13:56:14 +0000 |
commit | 3188ad3ab03fb15b430cc6dc2341a66c90a9c393 (patch) | |
tree | 1f1d49f73976b4bb39c298d9e585c2b3c8cb2d49 /libs/ardour/audiofilesource.cc | |
parent | a969d639864f7c8d3f19aa4bd8f498b4391fb1d8 (diff) |
fix up BWF creation; make CoreAudioSource work; add CAImportable; refactor SourceFactory to try sndfile first, CoreAudio second
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3126 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/audiofilesource.cc')
-rw-r--r-- | libs/ardour/audiofilesource.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index a4a75727a9..0ef9fb2dbc 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -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) @@ -716,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; +} |