2 Copyright (C) 2009 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __ardour_port_h__
21 #define __ardour_port_h__
26 #include <jack/jack.h>
27 #include <boost/utility.hpp>
28 #include "pbd/signals.h"
30 #include "ardour/data_type.h"
31 #include "ardour/types.h"
38 class Port : public boost::noncopyable
42 IsInput = JackPortIsInput,
43 IsOutput = JackPortIsOutput,
48 static void set_buffer_size (pframes_t sz) {
51 static void set_connecting_blocked( bool yn ) {
52 _connecting_blocked = yn;
54 static bool connecting_blocked() {
55 return _connecting_blocked;
58 /** @return Port short name */
59 std::string name () const {
63 int set_name (std::string const &);
66 Flags flags () const {
70 /** @return true if this Port receives input, otherwise false */
71 bool receives_input () const {
72 return _flags & IsInput;
75 /** @return true if this Port sends output, otherwise false */
76 bool sends_output () const {
77 return _flags & IsOutput;
80 bool connected () const;
81 int disconnect_all ();
82 int get_connections (std::vector<std::string> &) const;
84 /* connection by name */
85 bool connected_to (std::string const &) const;
86 int connect (std::string const &);
87 int disconnect (std::string const &);
89 /* connection by Port* */
90 bool connected_to (Port *) const;
91 virtual int connect (Port *);
92 int disconnect (Port *);
94 void ensure_monitor_input (bool);
95 bool monitoring_input () const;
96 framecnt_t total_latency () const;
99 void request_monitor_input (bool);
100 void set_latency (framecnt_t);
102 void get_connected_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const;
103 void set_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const;
105 virtual void reset ();
107 /** @return the size of the raw buffer (bytes) for duration @a nframes (audio frames) */
108 virtual size_t raw_buffer_size (pframes_t nframes) const = 0;
110 virtual DataType type () const = 0;
111 virtual void cycle_start (pframes_t) = 0;
112 virtual void cycle_end (pframes_t) = 0;
113 virtual void cycle_split () = 0;
114 virtual Buffer& get_buffer (framecnt_t nframes, framecnt_t offset = 0) = 0;
115 virtual void flush_buffers (pframes_t nframes, framepos_t /*time*/, framecnt_t offset = 0) {
116 assert (offset < nframes);
118 virtual void transport_stopped () {}
120 bool physically_connected () const;
122 static void set_engine (AudioEngine *);
124 PBD::Signal1<void,bool> MonitorInputChanged;
128 Port (std::string const &, DataType, Flags);
130 jack_port_t* _jack_port; ///< JACK port
132 static pframes_t _buffer_size;
133 static bool _connecting_blocked;
135 static AudioEngine* _engine; ///< the AudioEngine
138 friend class AudioEngine;
140 void recompute_total_latency () const;
145 std::string _name; ///< port short name
146 Flags _flags; ///< flags
148 /** ports that we are connected to, kept so that we can
149 reconnect to JACK when required */
150 std::set<std::string> _connections;
155 #endif /* __ardour_port_h__ */