From 86f24d20e1616ffaafc97de65db49fd6a91270f8 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 16 Jun 2009 14:58:33 +0000 Subject: first pass (ok, third really) at internal send+return - audio routing inside ardour without JACK. lots still to do, but at least the obvious works git-svn-id: svn://localhost/ardour2/branches/3.0@5202 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/internal_return.cc | 136 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 libs/ardour/internal_return.cc (limited to 'libs/ardour/internal_return.cc') diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc new file mode 100644 index 0000000000..409c87d93c --- /dev/null +++ b/libs/ardour/internal_return.cc @@ -0,0 +1,136 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include + +#include "pbd/failed_constructor.h" + +#include "ardour/internal_return.h" +#include "ardour/mute_master.h" +#include "ardour/session.h" + +using namespace std; +using namespace ARDOUR; + +sigc::signal InternalReturn::CycleStart; + +InternalReturn::InternalReturn (Session& s) + : Return (s, true) + , user_count (0) +{ + CycleStart.connect (mem_fun (*this, &InternalReturn::cycle_start)); +} + +InternalReturn::InternalReturn (Session& s, const XMLNode& node) + : Return (s, node, true) + , user_count (0) +{ + CycleStart.connect (mem_fun (*this, &InternalReturn::cycle_start)); +} + +void +InternalReturn::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) +{ + if (user_count == 0) { + /* nothing to do - nobody is feeding us anything */ + return; + } + + /* XXX this should be merge() */ + + bufs.merge_from (buffers, nframes); +} + +bool +InternalReturn::configure_io (ChanCount in, ChanCount out) +{ + IOProcessor::configure_io (in, out); + allocate_buffers (_session.get_block_size()); + return true; +} + +void +InternalReturn::set_block_size (nframes_t nframes) +{ + allocate_buffers (nframes); +} + +void +InternalReturn::allocate_buffers (nframes_t nframes) +{ + buffers.ensure_buffers (DataType::AUDIO, _configured_input.n_audio(), nframes); + buffers.ensure_buffers (DataType::MIDI, _configured_input.n_midi(), nframes); +} + +BufferSet* +InternalReturn::get_buffers () +{ + Glib::Mutex::Lock lm (_session.engine().process_lock()); + user_count++; + return &buffers; +} + +void +InternalReturn::release_buffers () +{ + Glib::Mutex::Lock lm (_session.engine().process_lock()); + if (user_count) { + user_count--; + } +} + +void +InternalReturn::cycle_start (nframes_t nframes) +{ + /* called from process cycle - no lock necessary */ + if (user_count) { + /* don't bother with this if nobody is going to feed us anything */ + buffers.silence (nframes, 0); + } +} + +XMLNode& +InternalReturn::state (bool full) +{ + XMLNode& node (Return::state (full)); + /* override type */ + node.add_property("type", "intreturn"); + return node; +} + +XMLNode& +InternalReturn::get_state() +{ + return state (true); +} + +int +InternalReturn::set_state (const XMLNode& node) +{ + return Return::set_state (node); +} + +bool +InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +{ + out = in; + return true; +} + + + -- cgit v1.2.3