From 449aab3c465bbbf66d221fac3d7ea559f1720357 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 2 Jun 2008 21:41:35 +0000 Subject: rollback to 3428, before the mysterious removal of libs/* at 3431/3432 git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/audio_port.cc | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 libs/ardour/audio_port.cc (limited to 'libs/ardour/audio_port.cc') diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc new file mode 100644 index 0000000000..714be28f34 --- /dev/null +++ b/libs/ardour/audio_port.cc @@ -0,0 +1,126 @@ +/* + Copyright (C) 2006 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 +#include +#include +#include + +using namespace ARDOUR; +using namespace std; + +AudioPort::AudioPort (const std::string& name, Flags flags, bool external, nframes_t capacity) + : Port (name, flags) + , BaseAudioPort (name, flags) + , PortFacade (name, flags) +{ + if (!external || receives_input()) { + + /* internal-only and input ports need their own buffers. + external output ports use the external port buffer. + */ + + _buffer = new AudioBuffer (capacity); + _own_buffer = true; + } + + if (!external) { + + _ext_port = 0; + set_name (name); + + } else { + + /* make the JackAudioPort create its own buffer. For input, + we will copy from it during cycle_start(). For output, + we will set up our buffer to point to its buffer, which + will in turn be using the JACK port buffer for data. + */ + + _ext_port = new JackAudioPort (name, flags, 0); + + if (sends_output()) { + _buffer = &dynamic_cast(_ext_port)->get_audio_buffer(); + } + + Port::set_name (_ext_port->name()); + } + + reset (); +} + +AudioPort::~AudioPort() +{ + if (_ext_port) { + delete _ext_port; + _ext_port = 0; + } +} + +void +AudioPort::reset() +{ + BaseAudioPort::reset(); + + if (_ext_port) { + _ext_port->reset (); + } +} + + +void +AudioPort::cycle_start (nframes_t nframes, nframes_t offset) +{ + /* caller must hold process lock */ + + if (_ext_port) { + _ext_port->cycle_start (nframes, offset); + } + + if (_flags & IsInput) { + + if (_ext_port) { + _buffer->read_from (dynamic_cast(_ext_port)->get_audio_buffer(), nframes, offset); + + if (!_connections.empty()) { + (*_mixdown) (_connections, _buffer, nframes, offset, false); + } + + } else { + + if (_connections.empty()) { + _buffer->silence (nframes, offset); + } else { + (*_mixdown) (_connections, _buffer, nframes, offset, true); + } + } + + } else { + + // XXX if we could get the output stage to not purely mix into, but also + // to initially overwrite the buffer, we could avoid this silence step. + + _buffer->silence (nframes, offset); + } +} + +void +AudioPort::cycle_end (nframes_t nframes, nframes_t offset) +{ +} -- cgit v1.2.3