private:
/** sends that we are receiving data from */
std::list<InternalSend*> _sends;
+ /** mutex to protect _sends */
+ Glib::Mutex _sends_mutex;
};
} // namespace ARDOUR
return;
}
- /* _sends is only modified with the process lock held, so this is ok, I think */
-
- for (list<InternalSend*>::iterator i = _sends.begin(); i != _sends.end(); ++i) {
- if ((*i)->active ()) {
- bufs.merge_from ((*i)->get_buffers(), nframes);
+ Glib::Mutex::Lock lm (_sends_mutex, Glib::TRY_LOCK);
+
+ if (lm.locked ()) {
+ for (list<InternalSend*>::iterator i = _sends.begin(); i != _sends.end(); ++i) {
+ if ((*i)->active ()) {
+ bufs.merge_from ((*i)->get_buffers(), nframes);
+ }
}
}
void
InternalReturn::add_send (InternalSend* send)
{
- /* caller must hold process lock */
- assert (!AudioEngine::instance()->process_lock().trylock());
-
+ Glib::Mutex::Lock lm (_sends_mutex);
_sends.push_back (send);
}
void
InternalReturn::remove_send (InternalSend* send)
{
- /* caller must hold process lock */
- assert (!AudioEngine::instance()->process_lock().trylock());
-
+ Glib::Mutex::Lock lm (_sends_mutex);
_sends.remove (send);
}
void
Route::remove_send_from_internal_return (InternalSend* send)
{
- Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
Glib::RWLock::ReaderLock rm (_processor_lock);
for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {