diff options
author | Carl Hetherington <carl@carlh.net> | 2010-04-22 12:20:04 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2010-04-22 12:20:04 +0000 |
commit | c71cc3702e68e1dcde40d7d9fb1abb5a4699da49 (patch) | |
tree | dd1157d990d7f6f872ce970cf47d4b0753af01b6 | |
parent | 9213e9c9094468ce21be378ea017b0da1405bf03 (diff) |
torbenh's buffer manager fixes from 3.0P
git-svn-id: svn://localhost/ardour2/branches/3.0@6959 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | libs/ardour/ardour/buffer_manager.h | 6 | ||||
-rw-r--r-- | libs/ardour/buffer_manager.cc | 12 | ||||
-rw-r--r-- | libs/ardour/route.cc | 5 |
3 files changed, 19 insertions, 4 deletions
diff --git a/libs/ardour/ardour/buffer_manager.h b/libs/ardour/ardour/buffer_manager.h index 4da8d0637f..2b835c0489 100644 --- a/libs/ardour/ardour/buffer_manager.h +++ b/libs/ardour/ardour/buffer_manager.h @@ -6,6 +6,8 @@ #include "pbd/ringbufferNPT.h" #include "ardour/chan_count.h" +#include <list> +#include <glibmm/thread.h> namespace ARDOUR { @@ -22,8 +24,12 @@ class BufferManager static void ensure_buffers (ChanCount howmany = ChanCount::ZERO); private: + static Glib::StaticMutex rb_mutex; + typedef RingBufferNPT<ThreadBuffers*> ThreadBufferFIFO; + typedef std::list<ThreadBuffers*> ThreadBufferList; static ThreadBufferFIFO* thread_buffers; + static ThreadBufferList* thread_buffers_list; }; } diff --git a/libs/ardour/buffer_manager.cc b/libs/ardour/buffer_manager.cc index edaf0907e8..f9c73d5b3e 100644 --- a/libs/ardour/buffer_manager.cc +++ b/libs/ardour/buffer_manager.cc @@ -25,11 +25,14 @@ using namespace ARDOUR; using namespace PBD; RingBufferNPT<ThreadBuffers*>* BufferManager::thread_buffers = 0; +std::list<ThreadBuffers*>* BufferManager::thread_buffers_list = 0; +Glib::StaticMutex BufferManager::rb_mutex = GLIBMM_STATIC_MUTEX_INIT; void BufferManager::init (uint32_t size) { thread_buffers = new ThreadBufferFIFO (size+1); // must be one larger than requested + thread_buffers_list = new ThreadBufferList; /* and populate with actual ThreadBuffers */ @@ -37,12 +40,14 @@ BufferManager::init (uint32_t size) for (uint32_t n = 0; n < size; ++n) { ThreadBuffers* ts = new ThreadBuffers; thread_buffers->write (&ts, 1); + thread_buffers_list->push_back (ts); } } ThreadBuffers* BufferManager::get_thread_buffers () { + Glib::Mutex::Lock em (rb_mutex); ThreadBuffers* tbp; if (thread_buffers->read (&tbp, 1) == 1) { @@ -55,6 +60,7 @@ BufferManager::get_thread_buffers () void BufferManager::put_thread_buffers (ThreadBuffers* tbp) { + Glib::Mutex::Lock em (rb_mutex); thread_buffers->write (&tbp, 1); } @@ -63,7 +69,7 @@ BufferManager::ensure_buffers (ChanCount howmany) { /* this is protected by the audioengine's process lock: we do not */ - for (uint32_t n = 0; n < thread_buffers->bufsize() - 1; ++n) { - thread_buffers->buffer()[n]->ensure_buffers (howmany); - } + for (ThreadBufferList::iterator i = thread_buffers_list->begin(); i != thread_buffers_list_end(); ++i) { + (*i)->ensure_buffers (howmany); + } } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 01242cd80e..c57594da37 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -1448,7 +1448,10 @@ Route::configure_processors_unlocked (ProcessorStreams* err) /* make sure we have sufficient scratch buffers to cope with the new processor configuration */ - _session.ensure_buffers (n_process_buffers ()); + { + Glib::Mutex::Lock em (_session.engine().process_lock ()); + _session.ensure_buffers (n_process_buffers ()); + } _in_configure_processors = false; return 0; |