X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_port.cc;h=a75f7d7a09163058b624bcaf6788763b687331ac;hb=0cd3bd4f194439a047f8ab6b7baaf38d118a1d85;hp=2250c7f2a7376224cc1e76f5acf19704664575b1;hpb=bd1220a46db9fe909d09c08139cfb61ba98ec9f3;p=ardour.git diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 2250c7f2a7..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,57 +17,89 @@ */ #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; -jack_nframes_t AudioPort::_short_over_length = 2; -jack_nframes_t AudioPort::_long_over_length = 10; +AudioPort::AudioPort (const std::string& name, Flags flags) + : Port (name, DataType::AUDIO, flags) + , _buffer (new AudioBuffer (0)) +{ + assert (name.find_first_of (':') == string::npos); +} -AudioPort::AudioPort(jack_port_t* p) - : Port(p) - , _buffer(0) +AudioPort::~AudioPort () { - DataType dt(_type); - assert(dt == DataType::AUDIO); - - reset(); + delete _buffer; } void -AudioPort::reset() +AudioPort::cycle_start (nframes_t nframes) { - Port::reset(); - if (_flags & JackPortIsOutput) { - 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 (); } - - _metering = 0; - reset_meters (); } void -AudioPort::cycle_start (jack_nframes_t nframes) +AudioPort::cycle_end (nframes_t nframes) { - if (_flags & JackPortIsOutput) { - const bool silent = _buffer.silent(); - // FIXME: do nothing, we can cache the value (but capacity needs to be set for MIDI) - _buffer.set_data((Sample*)jack_port_get_buffer (_port, nframes), nframes); - if (silent) { - _buffer.silence(nframes); - } - } else { - _buffer.set_data((Sample*)jack_port_get_buffer (_port, nframes), nframes); + if (sends_output() && !_buffer->written()) { + _buffer->silence (nframes); } } void -AudioPort::cycle_end() +AudioPort::cycle_split () { - // whatever... } + +AudioBuffer& +AudioPort::get_audio_buffer (nframes_t nframes, nframes_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); + } + + /* output ports set their _buffer data information during ::cycle_start() + */ + + return *_buffer; +} + +size_t +AudioPort::raw_buffer_size(nframes_t nframes) const +{ + return nframes * sizeof(float); +} +