X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fport.h;h=96c18442b7d77be42c4697b90ec5c4509e31ef8f;hb=e2757229a74a17a76682b6c72868d8e4822b7678;hp=cf36f95b873db1d80bc8aeb59cca10de5c80796d;hpb=30c08ba655330232767554c48bda1975bfb5628c;p=ardour.git diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index cf36f95b87..96c18442b7 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,143 +15,160 @@ 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 "libardour-config.h" + +#include +#include +#include #include +#include +#include "pbd/signals.h" + +#include "ardour/data_type.h" +#include "ardour/types.h" namespace ARDOUR { class AudioEngine; class Buffer; -/** Abstract base for all outside ports (eg Jack ports) - */ -class Port : public sigc::trackable { - public: - virtual ~Port() { - free (_port); - } - - virtual DataType type() const = 0; - - virtual void cycle_start(jack_nframes_t nframes) {} - virtual void cycle_end() {} +class Port : public boost::noncopyable +{ +public: + enum Flags { + IsInput = JackPortIsInput, + IsOutput = JackPortIsOutput, + }; - virtual Buffer& get_buffer() = 0; - - /** Silence/Empty the port, output ports only */ - virtual void silence (jack_nframes_t nframes, jack_nframes_t offset) = 0; + virtual ~Port (); + 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); + /** @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; - bool receives_input() const { - return _flags & JackPortIsInput; - } + /* connection by name */ + bool connected_to (std::string const &) const; + int connect (std::string const &); + int disconnect (std::string const &); - bool sends_output () const { - return _flags & JackPortIsOutput; - } - - bool monitoring_input () const { - return jack_port_monitoring_input (_port); - } + /* connection by Port* */ + bool connected_to (Port *) const; + virtual int connect (Port *); + int disconnect (Port *); - bool can_monitor () const { - return _flags & JackPortCanMonitor; - } + void ensure_monitor_input (bool); + bool monitoring_input () const; + int reestablish (); + int reconnect (); + void request_monitor_input (bool); - void enable_metering() { - _metering++; - } - - void disable_metering () { - if (_metering) { _metering--; } + bool last_monitor() const { return _last_monitor; } + void set_last_monitor (bool yn) { _last_monitor = yn; } + + jack_port_t* jack_port() const { return _jack_port; } + + void get_connected_latency_range (jack_latency_range_t& range, bool playback) const; + + void set_private_latency_range (jack_latency_range_t& range, bool playback); + const jack_latency_range_t& private_latency_range (bool playback) const; + + void set_public_latency_range (jack_latency_range_t& range, bool playback) const; + jack_latency_range_t public_latency_range (bool playback) const; + + virtual void reset (); + + virtual DataType type () const = 0; + virtual void cycle_start (pframes_t); + virtual void cycle_end (pframes_t) = 0; + virtual void cycle_split () = 0; + virtual Buffer& get_buffer (pframes_t nframes) = 0; + virtual void flush_buffers (pframes_t /*nframes*/, framepos_t /*time*/) {} + virtual void transport_stopped () {} + virtual void realtime_locate () {} + + bool physically_connected () const; + + static void set_engine (AudioEngine *); + + PBD::Signal1 MonitorInputChanged; + + + static void set_cycle_framecnt (pframes_t n) { + _cycle_nframes = n; } - - void ensure_monitor_input (bool yn) { - jack_port_request_monitor (_port, yn); + static framecnt_t port_offset() { return _global_port_buffer_offset; } + static void set_global_port_buffer_offset (pframes_t off) { + _global_port_buffer_offset = off; } - - void request_monitor_input (bool yn) { - jack_port_request_monitor (_port, yn); + static void increment_global_port_buffer_offset (pframes_t n) { + _global_port_buffer_offset += n; } - jack_nframes_t latency () const { - return jack_port_get_latency (_port); - } + virtual void increment_port_buffer_offset (pframes_t n); - void set_latency (jack_nframes_t nframes) { - jack_port_set_latency (_port, nframes); - } +protected: - bool is_silent() const { return _silent; } + Port (std::string const &, DataType, Flags); - void mark_silence (bool yn) { - _silent = yn; - } - - sigc::signal MonitorInputChanged; - sigc::signal ClockSyncChanged; + jack_port_t* _jack_port; ///< JACK port - protected: - friend class AudioEngine; + static bool _connecting_blocked; + static pframes_t _global_port_buffer_offset; /* access only from process() tree */ + static pframes_t _cycle_nframes; /* access only from process() tree */ - Port (jack_port_t *port); - - virtual void reset (); - - /* engine isn't supposed to access below here */ + framecnt_t _port_buffer_offset; /* access only from process() tree */ - /* cache these 3 from JACK so we can access them for reconnecting */ - JackPortFlags _flags; - std::string _type; - std::string _name; + jack_latency_range_t _private_playback_latency; + jack_latency_range_t _private_capture_latency; - jack_port_t* _port; + static AudioEngine* _engine; ///< the AudioEngine - unsigned short _metering; +private: + std::string _name; ///< port short name + Flags _flags; ///< flags + bool _last_monitor; + + /** ports that we are connected to, kept so that we can + reconnect to JACK when required + */ + std::set _connections; - bool _last_monitor : 1; - bool _silent : 1; }; - -} // namespace ARDOUR + +} #endif /* __ardour_port_h__ */