add backend support for port properties (CoreAudio)
[ardour.git] / libs / backends / coreaudio / coreaudio_backend.h
index 0460e57476b7531cc761fb38dca090d9a8250166..b36c53105c17c4d08413f42ec3602b5ecd53e828 100644 (file)
@@ -65,9 +65,11 @@ class CoreBackendPort {
                virtual ~CoreBackendPort ();
 
                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;
 
@@ -87,7 +89,7 @@ class CoreBackendPort {
 
                virtual void* get_buffer (pframes_t nframes) = 0;
 
-               const LatencyRange& latency_range (bool for_playback) const
+               const LatencyRange latency_range (bool for_playback) const
                {
                        return for_playback ? _playback_latency_range : _capture_latency_range;
                }
@@ -107,6 +109,7 @@ class CoreBackendPort {
        private:
                CoreAudioBackend &_osx_backend;
                std::string _name;
+               std::string _pretty_name;
                const PortFlags _flags;
                LatencyRange _capture_latency_range;
                LatencyRange _playback_latency_range;
@@ -199,8 +202,8 @@ class CoreAudioBackend : public AudioBackend {
                bool can_set_systemic_midi_latencies () const { return false; /* XXX */}
 
                /* External control app */
-               std::string control_app_name () const { return std::string (); }
-               void launch_control_app () {}
+               std::string control_app_name () const { return std::string ("Apple"); }
+               void launch_control_app ();
 
                /* MIDI */
                std::vector<std::string> enumerate_midi_options () const;
@@ -214,6 +217,10 @@ class CoreAudioBackend : public AudioBackend {
                // really private, but needing static access:
                int process_callback();
                void error_callback();
+               void xrun_callback();
+               void buffer_size_callback();
+               void sample_rate_callback();
+               void hw_changed_callback();
 
        protected:
                /* State Control */
@@ -246,6 +253,7 @@ class CoreAudioBackend : public AudioBackend {
                int         set_port_name (PortHandle, const std::string&);
                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 get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
@@ -296,7 +304,7 @@ class CoreAudioBackend : public AudioBackend {
                void* get_buffer (PortHandle, pframes_t);
 
                void* freewheel_thread ();
-               void post_process ();
+               void pre_process ();
                void coremidi_rediscover ();
 
        private:
@@ -313,8 +321,12 @@ class CoreAudioBackend : public AudioBackend {
                bool  _freewheel_ack;
                bool  _reinit_thread_callback;
                bool  _measure_latency;
+
                pthread_mutex_t _process_callback_mutex;
 
+               pthread_mutex_t _freewheel_mutex;
+               pthread_cond_t  _freewheel_signal;
+
                static std::vector<std::string> _midi_options;
                static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
                static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
@@ -333,6 +345,9 @@ class CoreAudioBackend : public AudioBackend {
                uint32_t _systemic_audio_input_latency;
                uint32_t _systemic_audio_output_latency;
 
+               /* coreaudio specific  */
+               uint32_t name_to_id(std::string) const;
+
                /* midi settings */
                struct CoreMidiDeviceInfo {
                        bool     enabled;
@@ -371,7 +386,6 @@ class CoreAudioBackend : 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 ();
                void unregister_ports (bool system_only = false);
 
                std::vector<CoreBackendPort *> _ports;
@@ -380,9 +394,6 @@ class CoreAudioBackend : public AudioBackend {
                std::vector<CoreBackendPort *> _system_midi_in;
                std::vector<CoreBackendPort *> _system_midi_out;
 
-               //std::vector<CoreMidiOut *> _rmidi_out;
-               //std::vector<CoreMidiIn  *> _rmidi_in;
-
                struct PortConnectData {
                        std::string a;
                        std::string b;
@@ -421,6 +432,15 @@ class CoreAudioBackend : public AudioBackend {
                        return NULL;
                }
 
+               CoreBackendPort * find_port_in (std::vector<CoreBackendPort *> plist, const std::string& port_name) const {
+                       for (std::vector<CoreBackendPort*>::const_iterator it = plist.begin (); it != plist.end (); ++it) {
+                               if ((*it)->name () == port_name) {
+                                       return *it;
+                               }
+                       }
+                       return NULL;
+               }
+
 }; // class CoreAudioBackend
 
 } // namespace