X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_port.cc;h=556f6e0c2a0775ae6430e8f5eda76036acbf126d;hb=c99738d88e8a2ad806b219b9f3614a6b55b6bf37;hp=66d31c63fecef177d507e5f43dbef264014f16f7;hpb=8ab17e96312f1a61c014c50687e15430d5ae786b;p=ardour.git diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 66d31c63fe..556f6e0c2a 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,109 +17,67 @@ */ #include -#include -#include -#include -#include + +#include "pbd/stacktrace.h" + +#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 flgs, bool external, nframes_t capacity) - : Port (name, flgs) - , BaseAudioPort (name, flgs) - , PortFacade (name, flgs) +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. - */ - - _buffer = new AudioBuffer (capacity); - _own_buffer = true; - } - - if (!external) { - - _ext_port = 0; - - } 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, flgs, 0); - - if (sends_output()) { - _buffer = &dynamic_cast(_ext_port)->get_audio_buffer(); - } - - Port::set_name (_ext_port->name()); - } - - reset (); + assert (name.find_first_of (':') == string::npos); } -AudioPort::~AudioPort() +AudioPort::~AudioPort () { - if (_ext_port) { - delete _ext_port; - _ext_port = 0; - } + delete _buffer; } void -AudioPort::reset() +AudioPort::cycle_start (pframes_t nframes) { - BaseAudioPort::reset(); + /* caller must hold process lock */ + + Port::cycle_start (nframes); - if (_ext_port) { - _ext_port->reset (); + if (sends_output()) { + _buffer->prepare (); } } - void -AudioPort::cycle_start (nframes_t nframes, nframes_t offset) +AudioPort::cycle_end (pframes_t nframes) { - /* 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); - } + if (sends_output() && !_buffer->written()) { + /* we can't use nframes here because the current buffer capacity may + be shorter than the full buffer size if we split the cycle. + */ + if (_buffer->capacity () > 0) { + _buffer->silence (_buffer->capacity()); } - - } 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) +AudioPort::cycle_split () +{ +} + +AudioBuffer& +AudioPort::get_audio_buffer (pframes_t nframes) { + /* caller must hold process lock */ + _buffer->set_data ((Sample *) jack_port_get_buffer (_jack_port, _cycle_nframes) + + _global_port_buffer_offset + _port_buffer_offset, nframes); + return *_buffer; } + + +