X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_port.cc;h=a75f7d7a09163058b624bcaf6788763b687331ac;hb=535d60237486e2227d22e5febbcfbf868abb11e3;hp=0e37313d018a175f42a5c37c13d7f870a35617a5;hpb=89e4d352445e9394073804f78fbd6845e6820f20;p=ardour.git diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 0e37313d01..a75f7d7a09 100644 --- a/libs/ardour/audio_port.cc +++ b/libs/ardour/audio_port.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2006 Paul Davis + 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 @@ -17,127 +17,89 @@ */ #include -#include -#include -#include -#include +#include "ardour/audio_port.h" +#include "ardour/audioengine.h" +#include "ardour/data_type.h" +#include "ardour/audio_buffer.h" 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) - , _has_been_mixed_down( false ) +AudioPort::AudioPort (const std::string& name, Flags flags) + : Port (name, DataType::AUDIO, flags) + , _buffer (new AudioBuffer (0)) { - if (!external || receives_input()) { - - /* internal-only and input ports need their own buffers. - external output ports use the external port buffer. - */ + assert (name.find_first_of (':') == string::npos); +} - _buffer = new AudioBuffer (capacity); - _own_buffer = true; - } +AudioPort::~AudioPort () +{ + delete _buffer; +} - if (!external) { +void +AudioPort::cycle_start (nframes_t nframes) +{ + /* caller must hold process lock */ - _ext_port = 0; - set_name (name); + /* get_buffer() must only be run on outputs here in cycle_start(). - } 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. - */ + Inputs must be done in the correct processing order, which + requires interleaving with route processing. that will + happen when Port::get_buffer() is called. + */ - _ext_port = new JackAudioPort (name, flags, 0); + if (sends_output()) { - //if (sends_output()) { - // _buffer = &dynamic_cast(_ext_port)->get_audio_buffer( nframes, offset ); - //} + /* Notice that cycle_start() is always run with the *entire* process cycle frame count, + so we do not bother to apply _port_offset here - we always want the address of the + entire JACK port buffer. We are not collecting data here - just noting the + address where we will write data later in the process cycle. + */ - Port::set_name (_ext_port->name()); + _buffer->set_data ((Sample *) jack_port_get_buffer (_jack_port, nframes), nframes); + _buffer->prepare (); } - - reset (); } -AudioPort::~AudioPort() +void +AudioPort::cycle_end (nframes_t nframes) { - if (_ext_port) { - delete _ext_port; - _ext_port = 0; + if (sends_output() && !_buffer->written()) { + _buffer->silence (nframes); } } void -AudioPort::reset() +AudioPort::cycle_split () { - BaseAudioPort::reset(); - - if (_ext_port) { - _ext_port->reset (); - } } - -void -AudioPort::cycle_start (nframes_t nframes, nframes_t offset) +AudioBuffer& +AudioPort::get_audio_buffer (nframes_t nframes, nframes_t offset) { /* caller must hold process lock */ - if (_ext_port) { - _ext_port->cycle_start (nframes, offset); - } - _has_been_mixed_down = false; -} + if (receives_input ()) { -AudioBuffer & -AudioPort::get_audio_buffer( nframes_t nframes, nframes_t offset ) { - - if (_has_been_mixed_down) - return *_buffer; - - if (_flags & IsInput) { - - if (_ext_port) { - _buffer->read_from (dynamic_cast(_ext_port)->get_audio_buffer (nframes, offset), 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. - if (_ext_port) { - _buffer = & (dynamic_cast(_ext_port)->get_audio_buffer( nframes, offset )); - } - if (nframes) - _buffer->silence (nframes, offset); + /* Get a pointer to the audio data @ offset + _port_offset within the JACK port buffer and store + it in our _buffer member. + + Note that offset is expected to be zero in almost all cases. + */ + + _buffer->set_data ((Sample *) jack_port_get_buffer (_jack_port, nframes) + offset + _port_offset, nframes); } - if (nframes) - _has_been_mixed_down = true; + + /* output ports set their _buffer data information during ::cycle_start() + */ return *_buffer; } -void -AudioPort::cycle_end (nframes_t nframes, nframes_t offset) +size_t +AudioPort::raw_buffer_size(nframes_t nframes) const { - _has_been_mixed_down=false; + return nframes * sizeof(float); } +