X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fport.h;h=23b42a55eaaa848a0aa51ef611e482ebb513a83e;hb=ba0458cf1f6c69366e89631d8fff916ad183d768;hp=391289be3f2da6348150891c13faa036e0af0c9f;hpb=dde980289aaf264863186eead99fd98a67cc6862;p=ardour.git diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index 391289be3f..23b42a55ea 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002 Paul Davis + Copyright (C) 2009 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 @@ -15,205 +15,138 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_port_h__ #define __ardour_port_h__ -#include -#include -#include +#include +#include +#include #include +#include +#include "pbd/signals.h" + +#include "ardour/data_type.h" +#include "ardour/types.h" namespace ARDOUR { class AudioEngine; +class Buffer; -class Port : public sigc::trackable { - public: - virtual ~Port() { - free (_port); - } +class Port : public boost::noncopyable +{ +public: + enum Flags { + IsInput = JackPortIsInput, + IsOutput = JackPortIsOutput, + }; - Sample *get_buffer (jack_nframes_t nframes) { - if (_flags & JackPortIsOutput) { - return _buffer; - } else { - return (Sample *) jack_port_get_buffer (_port, nframes); - } - } + virtual ~Port (); - void reset_buffer () { - if (_flags & JackPortIsOutput) { - _buffer = (Sample *) jack_port_get_buffer (_port, 0); - } else { - _buffer = 0; /* catch illegal attempts to use it */ - } - _silent = false; + static void set_buffer_size (nframes_t sz) { + _buffer_size = sz; + } + static void set_connecting_blocked( bool yn ) { + _connecting_blocked = yn; + } + static bool connecting_blocked() { + return _connecting_blocked; } - std::string name() { + /** @return Port short name */ + std::string name () const { return _name; } - std::string short_name() { - return jack_port_short_name (_port); - } - - int set_name (std::string str); + int set_name (std::string const &); - JackPortFlags flags() const { + /** @return flags */ + Flags flags () const { return _flags; } - bool is_mine (jack_client_t *client) { - return jack_port_is_mine (client, _port); - } - - const char* type() const { - return _type.c_str(); + /** @return true if this Port receives input, otherwise false */ + bool receives_input () const { + return _flags & IsInput; } - int connected () const { - return jack_port_connected (_port); - } - - bool connected_to (const std::string& portname) const { - return jack_port_connected_to (_port, portname.c_str()); + /** @return true if this Port sends output, otherwise false */ + bool sends_output () const { + return _flags & IsOutput; } - const char ** get_connections () const { - return jack_port_get_connections (_port); - } + bool connected () const; + int disconnect_all (); + int get_connections (std::vector &) const; - void reset_overs () { - _short_overs = 0; - _long_overs = 0; - _overlen = 0; - } + /* connection by name */ + bool connected_to (std::string const &) const; + int connect (std::string const &); + int disconnect (std::string const &); - void reset_peak_meter () { - _peak = 0; - } - - void reset_meters () { - reset_peak_meter (); - reset_overs (); - } + /* connection by Port* */ + bool connected_to (Port *) const; + virtual int connect (Port *); + int disconnect (Port *); - void enable_metering() { - _metering++; - } - - void disable_metering () { - if (_metering) { _metering--; } - } + void ensure_monitor_input (bool); + bool monitoring_input () const; + nframes_t total_latency () const; + int reestablish (); + int reconnect (); + void request_monitor_input (bool); + void set_latency (nframes_t); - float peak_db() const { return _peak_db; } - jack_default_audio_sample_t peak() const { return _peak; } + virtual void reset (); - uint32_t short_overs () const { return _short_overs; } - uint32_t long_overs () const { return _long_overs; } - - static void set_short_over_length (jack_nframes_t); - static void set_long_over_length (jack_nframes_t); + /** @return the size of the raw buffer (bytes) for duration @a nframes (audio frames) */ + virtual size_t raw_buffer_size(jack_nframes_t nframes) const = 0; - bool receives_input() const { - return _flags & JackPortIsInput; + virtual DataType type () const = 0; + virtual void cycle_start (nframes_t) = 0; + virtual void cycle_end (nframes_t) = 0; + virtual void cycle_split () = 0; + virtual Buffer& get_buffer (nframes_t nframes, nframes_t offset = 0) = 0; + virtual void flush_buffers (nframes_t nframes, framepos_t /*time*/, nframes_t offset = 0) { + assert(offset < nframes); } + virtual void transport_stopped () {} - bool sends_output () const { - return _flags & JackPortIsOutput; - } - - bool monitoring_input () const { - return jack_port_monitoring_input (_port); - } + bool physically_connected () const; - bool can_monitor () const { - return _flags & JackPortCanMonitor; - } - - void ensure_monitor_input (bool yn) { + static void set_engine (AudioEngine *); -#ifdef WITH_JACK_PORT_ENSURE_MONITOR - jack_port_ensure_monitor (_port, yn); -#else - jack_port_request_monitor(_port, yn); -#endif + PBD::Signal1 MonitorInputChanged; - } +protected: - /*XXX completely bloody useless imho*/ - void request_monitor_input (bool yn) { - jack_port_request_monitor (_port, yn); - } + Port (std::string const &, DataType, Flags); - jack_nframes_t latency () const { - return jack_port_get_latency (_port); - } + jack_port_t* _jack_port; ///< JACK port - void set_latency (jack_nframes_t nframes) { - jack_port_set_latency (_port, nframes); - } + static nframes_t _buffer_size; + static bool _connecting_blocked; + + static AudioEngine* _engine; ///< the AudioEngine - sigc::signal MonitorInputChanged; - sigc::signal ClockSyncChanged; - - bool is_silent() const { return _silent; } - - /** Assumes that the port is an audio output port */ - void silence (jack_nframes_t nframes, jack_nframes_t offset) { - if (!_silent) { - memset (_buffer + offset, 0, sizeof (Sample) * nframes); - if (offset == 0) { - /* XXX this isn't really true, but i am not sure - how to set this correctly. we really just - want to set it true when the entire port - buffer has been overrwritten. - */ - _silent = true; - } - } - } - - void mark_silence (bool yn) { - _silent = yn; - } - - private: +private: friend class AudioEngine; - Port (jack_port_t *port); - void reset (); - - /* engine isn't supposed to below here */ - - Sample *_buffer; - - /* cache these 3 from JACK so that we can - access them for reconnecting. - */ - - JackPortFlags _flags; - std::string _type; - std::string _name; - - bool _last_monitor : 1; - bool _silent : 1; - jack_port_t *_port; - jack_nframes_t _overlen; - jack_default_audio_sample_t _peak; - float _peak_db; - uint32_t _short_overs; - uint32_t _long_overs; - unsigned short _metering; - - static jack_nframes_t _long_over_length; - static jack_nframes_t _short_over_length; + void recompute_total_latency () const; + + /* XXX */ + bool _last_monitor; + + std::string _name; ///< port short name + Flags _flags; ///< flags + + /** ports that we are connected to, kept so that we can + reconnect to JACK when required */ + std::set _connections; }; - -} // namespace ARDOUR + +} #endif /* __ardour_port_h__ */