X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Faudioengine.h;h=cb5a6d72ceedd6c1a236b655727ddfb8df142365;hb=6698f5f686bef82b0c9568558c83a3b9b3344700;hp=6f3de184737e419be0026a909ee8b503e7aee509;hpb=fe13d08874f08b723df53116e5655c3d229a657e;p=ardour.git diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 6f3de18473..cb5a6d72ce 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_audioengine_h__ @@ -31,10 +30,13 @@ #include +#include + #include #include #include -#include +#include +#include namespace ARDOUR { @@ -44,12 +46,16 @@ class Port; class AudioEngine : public sigc::trackable { public: + typedef std::set Ports; + AudioEngine (std::string client_name); virtual ~AudioEngine (); jack_client_t* jack() const { return _jack; } bool connected() const { return _jack != 0; } + bool is_realtime () const; + std::string client_name() const { return jack_client_name; } int reconnect_to_jack (); @@ -58,34 +64,36 @@ class AudioEngine : public sigc::trackable bool will_reconnect_at_halt (); void set_reconnect_at_halt (bool); - int stop (); + int stop (bool forever = false); int start (); bool running() const { return _running; } Glib::Mutex& process_lock() { return _process_lock; } - jack_nframes_t frame_rate(); - jack_nframes_t frames_per_cycle(); + nframes_t frame_rate(); + nframes_t frames_per_cycle(); int usecs_per_cycle () const { return _usecs_per_cycle; } - jack_nframes_t frames_since_cycle_start () { + bool get_sync_offset (nframes_t& offset) const; + + nframes_t frames_since_cycle_start () { if (!_running || !_jack) return 0; return jack_frames_since_cycle_start (_jack); } - jack_nframes_t frame_time () { + nframes_t frame_time () { if (!_running || !_jack) return 0; return jack_frame_time (_jack); } - jack_nframes_t transport_frame () const { + nframes_t transport_frame () const { if (!_running || !_jack) return 0; return jack_get_current_transport_frame (_jack); } - int request_buffer_size (jack_nframes_t); + int request_buffer_size (nframes_t); - jack_nframes_t set_monitor_check_interval (jack_nframes_t); + nframes_t set_monitor_check_interval (nframes_t); float get_cpu_load() { if (!_running || !_jack) return 0; @@ -105,34 +113,36 @@ class AudioEngine : public sigc::trackable virtual const char *what() const throw() { return "could not connect to engine backend"; } }; - Port *register_input_port (Buffer::Type type, const std::string& portname); - Port *register_output_port (Buffer::Type type, const std::string& portname); - int unregister_port (Port *); + Port *register_input_port (DataType type, const std::string& portname); + Port *register_output_port (DataType type, const std::string& portname); + int unregister_port (Port &); int connect (const std::string& source, const std::string& destination); int disconnect (const std::string& source, const std::string& destination); - int disconnect (Port *); + int disconnect (Port &); const char ** get_ports (const std::string& port_name_pattern, const std::string& type_name_pattern, uint32_t flags); uint32_t n_physical_outputs () const; uint32_t n_physical_inputs () const; - std::string get_nth_physical_output (uint32_t n) { - return get_nth_physical (n, JackPortIsInput); + void get_physical_outputs (std::vector&); + void get_physical_inputs (std::vector&); + + std::string get_nth_physical_output (DataType type, uint32_t n) { + return get_nth_physical (type, n, JackPortIsInput); } - std::string get_nth_physical_input (uint32_t n) { - return get_nth_physical (n, JackPortIsOutput); + std::string get_nth_physical_input (DataType type, uint32_t n) { + return get_nth_physical (type, n, JackPortIsOutput); } - jack_nframes_t get_port_total_latency (const Port&); + nframes_t get_port_total_latency (const Port&); void update_total_latencies (); + void update_total_latency (const Port&); - /* the caller may not delete the object pointed to by - the return value + /** Caller may not delete the object pointed to by the return value */ - Port *get_port_by_name (const std::string& name, bool keep = true); enum TransportState { @@ -144,7 +154,7 @@ class AudioEngine : public sigc::trackable void transport_start (); void transport_stop (); - void transport_locate (jack_nframes_t); + void transport_locate (nframes_t); TransportState transport_state (); int reset_timebase (); @@ -158,7 +168,7 @@ class AudioEngine : public sigc::trackable the regular process() call to session->process() is not made. */ - sigc::signal Freewheel; + sigc::signal Freewheel; sigc::signal Xrun; @@ -168,7 +178,7 @@ class AudioEngine : public sigc::trackable /* this signal is emitted if the sample rate changes */ - sigc::signal SampleRateChanged; + sigc::signal SampleRateChanged; /* this signal is sent if JACK ever disconnects us */ @@ -185,54 +195,54 @@ class AudioEngine : public sigc::trackable std::string make_port_name_non_relative (std::string); private: - ARDOUR::Session *session; - jack_client_t *_jack; - std::string jack_client_name; - Glib::Mutex port_lock; - Glib::Mutex _process_lock; - Glib::Mutex session_remove_lock; - Glib::Cond session_removed; - bool session_remove_pending; - bool _running; - bool _has_run; - jack_nframes_t _buffer_size; - jack_nframes_t _frame_rate; - jack_nframes_t monitor_check_interval; - jack_nframes_t last_monitor_check; - jack_nframes_t _processed_frames; - bool _freewheeling; - bool _freewheel_thread_registered; - sigc::slot freewheel_action; - bool reconnect_on_halt; - int _usecs_per_cycle; - - typedef std::set Ports; - Ports ports; - - int process_callback (jack_nframes_t nframes); + ARDOUR::Session *session; + jack_client_t *_jack; + std::string jack_client_name; + Glib::Mutex _process_lock; + Glib::Cond session_removed; + bool session_remove_pending; + bool _running; + bool _has_run; + nframes_t _buffer_size; + nframes_t _frame_rate; + /// number of frames between each check for changes in monitor input + nframes_t monitor_check_interval; + /// time of the last monitor check in frames + nframes_t last_monitor_check; + /// the number of frames processed since start() was called + nframes_t _processed_frames; + bool _freewheeling; + bool _freewheel_thread_registered; + sigc::slot freewheel_action; + bool reconnect_on_halt; + int _usecs_per_cycle; + + SerializedRCUManager ports; + + int process_callback (nframes_t nframes); void remove_all_ports (); typedef std::pair PortConnection; typedef std::list PortConnections; PortConnections port_connections; - void remove_connections_for (Port*); + void remove_connections_for (Port&); - std::string get_nth_physical (uint32_t which, int flags); + std::string get_nth_physical (DataType type, uint32_t n, int flags); static int _xrun_callback (void *arg); static int _graph_order_callback (void *arg); - static int _process_callback (jack_nframes_t nframes, void *arg); - static int _sample_rate_callback (jack_nframes_t nframes, void *arg); - static int _bufsize_callback (jack_nframes_t nframes, void *arg); - static void _jack_timebase_callback (jack_transport_state_t, jack_nframes_t, jack_position_t*, int, void*); + static int _process_callback (nframes_t nframes, void *arg); + static int _sample_rate_callback (nframes_t nframes, void *arg); + static int _bufsize_callback (nframes_t nframes, void *arg); + static void _jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int, void*); static int _jack_sync_callback (jack_transport_state_t, jack_position_t*, void *arg); static void _freewheel_callback (int , void *arg); - void jack_timebase_callback (jack_transport_state_t, jack_nframes_t, jack_position_t*, int); + void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int); int jack_sync_callback (jack_transport_state_t, jack_position_t*); - int jack_bufsize_callback (jack_nframes_t); - int jack_sample_rate_callback (jack_nframes_t); + int jack_bufsize_callback (nframes_t); + int jack_sample_rate_callback (nframes_t); static void halted (void *); @@ -240,10 +250,12 @@ class AudioEngine : public sigc::trackable void meter_thread (); void start_metering_thread (); - Glib::Thread* m_meter_thread; - mutable gint m_meter_exit; + void stop_metering_thread (); + + Glib::Thread* m_meter_thread; + static gint m_meter_exit; }; -}; /* namespace ARDOUR */ +} // namespace ARDOUR #endif /* __ardour_audioengine_h__ */