X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_port.cc;h=aad56748c319395564a0ffb413e1a13726c60ef4;hb=0bee288b5d6c6ca1fb33b8bc3b584c6d2c3d3364;hp=2e3682fe3b43b8d4d6187f82676a4a1e7a871797;hpb=fc9ab1ccbdfc4ae8bdec962e4c9439c1fc59a55f;p=ardour.git diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 2e3682fe3b..aad56748c3 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,42 +17,91 @@ */ #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; -nframes_t AudioPort::_short_over_length = 2; -nframes_t AudioPort::_long_over_length = 10; +framecnt_t AudioPort::_port_offset = 0; -AudioPort::AudioPort(Flags flags) - : Port (flags), _buffer (0) +AudioPort::AudioPort (const std::string& name, Flags flags) + : Port (name, DataType::AUDIO, flags) + , _buffer (new AudioBuffer (0)) { - _type = DataType::AUDIO; - reset(); + assert (name.find_first_of (':') == string::npos); } -AudioPort::AudioPort(Flags flags, nframes_t nframes) - : Port (flags), _buffer (nframes) +AudioPort::~AudioPort () { - _type = DataType::AUDIO; - reset(); + delete _buffer; } void -AudioPort::reset() +AudioPort::cycle_start (pframes_t nframes) { - Port::reset(); - if (_flags & IsOutput) { - if (_buffer.capacity() > 0) { - _buffer.clear(); - } - assert(_buffer.silent()); + /* caller must hold process lock */ + + /* get_buffer() must only be run on outputs here in cycle_start(). + + Inputs must be done in the correct processing order, which + requires interleaving with route processing. that will + happen when Port::get_buffer() is called. + */ + + if (sends_output()) { + + /* 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. + */ + + _buffer->set_data ((Sample *) jack_port_get_buffer (_jack_port, nframes), nframes); + _buffer->prepare (); + } +} + +void +AudioPort::cycle_end (pframes_t nframes) +{ + if (sends_output() && !_buffer->written()) { + _buffer->silence (nframes); + } +} + +void +AudioPort::cycle_split () +{ +} + +AudioBuffer& +AudioPort::get_audio_buffer (framecnt_t nframes, framecnt_t offset) +{ + /* caller must hold process lock */ + + if (receives_input ()) { + + /* 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); } - - _metering = 0; - reset_meters (); + + /* output ports set their _buffer data information during ::cycle_start() + */ + + return *_buffer; } +size_t +AudioPort::raw_buffer_size (pframes_t nframes) const +{ + return nframes * sizeof (Sample); +}