X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_port.cc;h=33e41c10ad49cc309615af9d4778e0d5d426b610;hb=b90baf217632b203e66c296217eb357637a18430;hp=99f2b7ecae17993e11674f568a0ca0484595c192;hpb=30ab1fd61569f9d7fb7410d483fa68cbf9865c37;p=ardour.git diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 99f2b7ecae..33e41c10ad 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,53 +17,78 @@ */ #include -#include -#include + +#include "pbd/stacktrace.h" + +#include "ardour/audio_buffer.h" +#include "ardour/audioengine.h" +#include "ardour/audio_port.h" +#include "ardour/data_type.h" +#include "ardour/port_engine.h" using namespace ARDOUR; using namespace std; -jack_nframes_t AudioPort::_short_over_length = 2; -jack_nframes_t AudioPort::_long_over_length = 10; +#define port_engine AudioEngine::instance()->port_engine() + +AudioPort::AudioPort (const std::string& name, PortFlags 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 (pframes_t nframes) { - Port::reset(); - if (_flags & JackPortIsOutput) { - if (_buffer.capacity() > 0) { - _buffer.clear(); - } - _silent = true; + /* caller must hold process lock */ + + Port::cycle_start (nframes); + + if (sends_output()) { + _buffer->prepare (); } - - _metering = 0; - reset_meters (); } void -AudioPort::cycle_start (jack_nframes_t nframes) +AudioPort::cycle_end (pframes_t nframes) { - if (_flags & JackPortIsOutput) { - // FIXME: do nothing, we can cache the value (but capacity needs to be set) - _buffer.set_data((Sample*)jack_port_get_buffer (_port, nframes), nframes); - } else { - _buffer.set_data((Sample*)jack_port_get_buffer (_port, nframes), nframes); + if (sends_output() && !_buffer->written()) { + if (!_buffer->data (0)) { + get_audio_buffer (nframes); + } + if (_buffer->capacity() >= nframes) { + _buffer->silence (nframes); + } } } void -AudioPort::cycle_end() +AudioPort::cycle_split () { - // whatever... } + +AudioBuffer& +AudioPort::get_audio_buffer (pframes_t nframes) +{ + /* caller must hold process lock */ + _buffer->set_data ((Sample *) port_engine.get_buffer (_port_handle, _cycle_nframes) + + _global_port_buffer_offset + _port_buffer_offset, nframes); + return *_buffer; +} + +Sample* +AudioPort::engine_get_whole_audio_buffer () +{ + /* caller must hold process lock */ + return (Sample *) port_engine.get_buffer (_port_handle, _cycle_nframes); +} + + + +