X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fbackends%2Falsa%2Falsa_audiobackend.h;h=bc2620ed9e6ce173c90967eb217c7a9fea5e8669;hb=335debfa2fed045dc80c43fb2ef62d89262fc8f8;hp=1dca7ec14989f0a410d574ffdf8a41d61dcb5781;hpb=990fd75c5fb41588128199587b8a05be1b65a1ab;p=ardour.git diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index 1dca7ec149..bc2620ed9e 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -30,6 +30,7 @@ #include +#include "pbd/natsort.h" #include "ardour/audio_backend.h" #include "ardour/dsp_load_calculator.h" #include "ardour/system_exec.h" @@ -70,9 +71,11 @@ class AlsaPort { virtual ~AlsaPort (); const std::string& name () const { return _name; } + const std::string& pretty_name () const { return _pretty_name; } PortFlags flags () const { return _flags; } int set_name (const std::string &name) { _name = name; return 0; } + int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; } virtual DataType type () const = 0; @@ -84,7 +87,7 @@ class AlsaPort { bool is_connected (const AlsaPort *port) const; bool is_physically_connected () const; - const std::vector& get_connections () const { return _connections; } + const std::set& get_connections () const { return _connections; } int connect (AlsaPort *port); int disconnect (AlsaPort *port); @@ -112,10 +115,11 @@ class AlsaPort { private: AlsaAudioBackend &_alsa_backend; std::string _name; + std::string _pretty_name; const PortFlags _flags; LatencyRange _capture_latency_range; LatencyRange _playback_latency_range; - std::vector _connections; + std::set _connections; void _connect (AlsaPort* , bool); void _disconnect (AlsaPort* , bool); @@ -168,6 +172,7 @@ class AlsaAudioBackend : public AudioBackend { bool is_realtime () const; bool use_separate_input_and_output_devices () const { return true; } + bool match_input_output_devices_or_none () const { return true; } bool can_set_period_size () const { return true; } std::vector enumerate_devices () const; @@ -184,6 +189,8 @@ class AlsaAudioBackend : public AudioBackend { bool can_change_sample_rate_when_running () const; bool can_change_buffer_size_when_running () const; + bool can_change_systemic_latency_when_running () const { return true; } + int set_device_name (const std::string&); int set_input_device_name (const std::string&); int set_output_device_name (const std::string&); @@ -262,6 +269,9 @@ class AlsaAudioBackend : public AudioBackend { std::string get_port_name (PortHandle) const; PortHandle get_port_by_name (const std::string&) const; + int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const; + int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type); + int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector&) const; DataType port_data_type (PortHandle) const; @@ -393,18 +403,33 @@ class AlsaAudioBackend : public AudioBackend { /* port engine */ PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags); int register_system_audio_ports (); - int register_system_midi_ports (); + int register_system_midi_ports (const std::string device = ""); void unregister_ports (bool system_only = false); - std::vector _ports; std::vector _system_inputs; std::vector _system_outputs; std::vector _system_midi_in; std::vector _system_midi_out; + struct SortByPortName + { + bool operator ()(const AlsaPort* lhs, const AlsaPort* rhs) const + { + return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ()); + } + }; + + typedef std::map PortMap; // fast lookup in _ports + typedef std::set PortIndex; // fast lookup in _ports + PortMap _portmap; + PortIndex _ports; + std::vector _rmidi_out; std::vector _rmidi_in; + unsigned _midi_ins; + unsigned _midi_outs; + struct PortConnectData { std::string a; std::string b; @@ -431,18 +456,20 @@ class AlsaAudioBackend : public AudioBackend { } bool valid_port (PortHandle port) const { - return std::find (_ports.begin (), _ports.end (), (AlsaPort*)port) != _ports.end (); + return std::find (_ports.begin(), _ports.end(), static_cast(port)) != _ports.end (); } - AlsaPort * find_port (const std::string& port_name) const { - for (std::vector::const_iterator it = _ports.begin (); it != _ports.end (); ++it) { - if ((*it)->name () == port_name) { - return *it; - } + AlsaPort* find_port (const std::string& port_name) const { + PortMap::const_iterator it = _portmap.find (port_name); + if (it == _portmap.end()) { + return NULL; } - return NULL; + return (*it).second; } + void update_systemic_audio_latencies (); + void update_systemic_midi_latencies (); + }; // class AlsaAudioBackend } // namespace