X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fport.h;h=5fb9a7efc3bd321213eb112914611fcc28dda76e;hb=c0e6f8e4c324c3f44613949b59acd9e864ab263d;hp=3f86fb8fd2158e1b52cedaf5122978ed39631cbb;hpb=ca10cc82a4374a5b413c06ead6cc89c53f8881ee;p=ardour.git diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index 3f86fb8fd2..5fb9a7efc3 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2009 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 @@ -20,40 +20,35 @@ #ifndef __ardour_port_h__ #define __ardour_port_h__ +#include "libardour-config.h" + #include #include #include #include #include -#include +#include "pbd/signals.h" + #include "ardour/data_type.h" +#include "ardour/port_engine.h" +#include "ardour/libardour_visibility.h" #include "ardour/types.h" namespace ARDOUR { class AudioEngine; -class Buffer; +class Buffer; -class Port : public sigc::trackable, public boost::noncopyable +class LIBARDOUR_API Port : public boost::noncopyable { public: - enum Flags { - IsInput = JackPortIsInput, - IsOutput = JackPortIsOutput, - }; - virtual ~Port (); - static nframes_t port_offset() { return _port_offset; } - - static void set_port_offset (nframes_t off) { - _port_offset = off; - } - static void increment_port_offset (nframes_t n) { - _port_offset += n; + static void set_connecting_blocked( bool yn ) { + _connecting_blocked = yn; } - static void set_buffer_size (nframes_t sz) { - _buffer_size = sz; + static bool connecting_blocked() { + return _connecting_blocked; } /** @return Port short name */ @@ -64,7 +59,7 @@ public: int set_name (std::string const &); /** @return flags */ - Flags flags () const { + PortFlags flags () const { return _flags; } @@ -92,55 +87,87 @@ public: virtual int connect (Port *); int disconnect (Port *); - void ensure_monitor_input (bool); + void request_input_monitoring (bool); + void ensure_input_monitoring (bool); bool monitoring_input () const; - nframes_t total_latency () const; int reestablish (); int reconnect (); - void request_monitor_input (bool); - void set_latency (nframes_t); + + bool last_monitor() const { return _last_monitor; } + void set_last_monitor (bool yn) { _last_monitor = yn; } + + PortEngine::PortHandle port_handle() { return _port_handle; } + + void get_connected_latency_range (LatencyRange& range, bool playback) const; + + void set_private_latency_range (LatencyRange& range, bool playback); + const LatencyRange& private_latency_range (bool playback) const; + + void set_public_latency_range (LatencyRange& range, bool playback) const; + LatencyRange public_latency_range (bool playback) const; virtual void reset (); - - /** @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; virtual DataType type () const = 0; - virtual void cycle_start (nframes_t) = 0; - virtual void cycle_end (nframes_t) = 0; + virtual void cycle_start (pframes_t); + virtual void cycle_end (pframes_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_t offset = 0) {} - - static void set_engine (AudioEngine *); + virtual Buffer& get_buffer (pframes_t nframes) = 0; + virtual void flush_buffers (pframes_t /*nframes*/) {} + virtual void transport_stopped () {} + virtual void realtime_locate () {} + + bool physically_connected () const; - sigc::signal MonitorInputChanged; + PBD::Signal1 MonitorInputChanged; + static PBD::Signal2,boost::shared_ptr > PostDisconnect; + static PBD::Signal0 PortDrop; + + static void set_cycle_framecnt (pframes_t n) { + _cycle_nframes = n; + } + 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; + } + static void increment_global_port_buffer_offset (pframes_t n) { + _global_port_buffer_offset += n; + } + + virtual void increment_port_buffer_offset (pframes_t n); + + virtual XMLNode& get_state (void) const; + virtual int set_state (const XMLNode&, int version); + + static std::string state_node_name; protected: - - Port (std::string const &, DataType, Flags); - jack_port_t* _jack_port; ///< JACK port + Port (std::string const &, DataType, PortFlags); - static nframes_t _port_offset; - static nframes_t _buffer_size; + PortEngine::PortHandle _port_handle; - static AudioEngine* _engine; ///< the 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 */ -private: - friend class AudioEngine; + framecnt_t _port_buffer_offset; /* access only from process() tree */ - void recompute_total_latency () const; - - /* XXX */ - bool _last_monitor; + LatencyRange _private_playback_latency; + LatencyRange _private_capture_latency; +private: std::string _name; ///< port short name - Flags _flags; ///< flags + PortFlags _flags; ///< flags + bool _last_monitor; /** ports that we are connected to, kept so that we can - reconnect to JACK when required */ + reconnect to the backend when required + */ std::set _connections; + + void drop (); + PBD::ScopedConnection drop_connection; }; }