X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fbackends%2Fcoreaudio%2Fcoreaudio_backend.h;h=55aaf473895be569c7c916e6e5bc8bf9dbd1ba6d;hb=fa32fa1abe76d6fc363789fc406881b78b002832;hp=ecc7107c71d43dc4d9c5ef9590e10975b70ebfca;hpb=659a8a26aeb8358b5bf4589d90248e014b6b69e0;p=ardour.git diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index ecc7107c71..55aaf47389 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -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; @@ -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; @@ -162,9 +165,15 @@ class CoreAudioBackend : public AudioBackend { std::string name () const; bool is_realtime () const; + bool use_separate_input_and_output_devices () const { return true; } std::vector enumerate_devices () const; + std::vector enumerate_input_devices () const; + std::vector enumerate_output_devices () const; + std::vector available_sample_rates (const std::string& device) const; + std::vector available_sample_rates2 (const std::string&, const std::string&) const; std::vector available_buffer_sizes (const std::string& device) const; + std::vector available_buffer_sizes2 (const std::string&, const std::string&) const; uint32_t available_input_channel_count (const std::string& device) const; uint32_t available_output_channel_count (const std::string& device) const; @@ -172,6 +181,8 @@ class CoreAudioBackend : public AudioBackend { bool can_change_buffer_size_when_running () const; int set_device_name (const std::string&); + int set_input_device_name (const std::string&); + int set_output_device_name (const std::string&); int set_sample_rate (float); int set_buffer_size (uint32_t); int set_interleaved (bool yn); @@ -179,13 +190,15 @@ class CoreAudioBackend : public AudioBackend { int set_output_channels (uint32_t); int set_systemic_input_latency (uint32_t); int set_systemic_output_latency (uint32_t); - int set_systemic_midi_input_latency (std::string const, uint32_t); - int set_systemic_midi_output_latency (std::string const, uint32_t); + int set_systemic_midi_input_latency (std::string const, uint32_t) { return 0; } + int set_systemic_midi_output_latency (std::string const, uint32_t) { return 0; } int reset_device () { return 0; }; /* Retrieving parameters */ std::string device_name () const; + std::string input_device_name () const; + std::string output_device_name () const; float sample_rate () const; uint32_t buffer_size () const; bool interleaved () const; @@ -193,8 +206,8 @@ class CoreAudioBackend : public AudioBackend { uint32_t output_channels () const; uint32_t systemic_input_latency () const; uint32_t systemic_output_latency () const; - uint32_t systemic_midi_input_latency (std::string const) const; - uint32_t systemic_midi_output_latency (std::string const) const; + uint32_t systemic_midi_input_latency (std::string const) const { return 0; } + uint32_t systemic_midi_output_latency (std::string const) const { return 0; } bool can_set_systemic_midi_latencies () const { return false; /* XXX */} @@ -207,12 +220,18 @@ class CoreAudioBackend : public AudioBackend { int set_midi_option (const std::string&); std::string midi_option () const; - std::vector enumerate_midi_devices () const; - int set_midi_device_enabled (std::string const, bool); - bool midi_device_enabled (std::string const) const; + std::vector enumerate_midi_devices () const { + return std::vector (); + } + int set_midi_device_enabled (std::string const, bool) { + return true; + } + bool midi_device_enabled (std::string const) const { + return false; + } // really private, but needing static access: - int process_callback(); + int process_callback(uint32_t, uint64_t); void error_callback(); void xrun_callback(); void buffer_size_callback(); @@ -250,6 +269,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&) const; @@ -300,7 +320,7 @@ class CoreAudioBackend : public AudioBackend { void* get_buffer (PortHandle, pframes_t); void* freewheel_thread (); - void post_process (); + void pre_process (); void coremidi_rediscover (); private: @@ -317,13 +337,22 @@ class CoreAudioBackend : public AudioBackend { bool _freewheel_ack; bool _reinit_thread_callback; bool _measure_latency; + + uint64_t _last_process_start; + pthread_mutex_t _process_callback_mutex; + pthread_mutex_t _freewheel_mutex; + pthread_cond_t _freewheel_signal; + static std::vector _midi_options; - static std::vector _audio_device_status; + static std::vector _input_audio_device_status; + static std::vector _output_audio_device_status; + static std::vector _duplex_audio_device_status; static std::vector _midi_device_status; - mutable std::string _audio_device; + mutable std::string _input_audio_device; + mutable std::string _output_audio_device; std::string _midi_driver_option; /* audio settings */ @@ -340,21 +369,6 @@ class CoreAudioBackend : public AudioBackend { /* coreaudio specific */ uint32_t name_to_id(std::string) const; - /* midi settings */ - struct CoreMidiDeviceInfo { - bool enabled; - uint32_t systemic_input_latency; - uint32_t systemic_output_latency; - CoreMidiDeviceInfo() - : enabled (true) - , systemic_input_latency (0) - , systemic_output_latency (0) - {} - }; - - mutable std::map _midi_devices; - struct CoreMidiDeviceInfo * midi_device_info(std::string const) const; - /* processing */ float _dsp_load; uint64_t _processed_samples; @@ -433,6 +447,46 @@ class CoreAudioBackend : public AudioBackend { return NULL; } +#ifdef USE_MIDI_PARSER + + bool midi_process_byte (const uint8_t); + + void midi_record_byte (uint8_t byte) { + if (_total_bytes < sizeof (_parser_buffer)) { + _parser_buffer[_total_bytes] = byte; + } else { + ++_unbuffered_bytes; + } + ++_total_bytes; + } + + void midi_prepare_byte_event (const uint8_t byte) { + _parser_buffer[0] = byte; + _parser_bytes = 1; + } + + bool midi_prepare_buffered_event () { + const bool result = _unbuffered_bytes == 0; + if (result) { + _parser_bytes = _total_bytes; + } + _total_bytes = 0; + _unbuffered_bytes = 0; + if (_status_byte >= 0xf0) { + _expected_bytes = 0; + _status_byte = 0; + } + return result; + } + + size_t _unbuffered_bytes; + size_t _total_bytes; + size_t _expected_bytes; + uint8_t _status_byte; + uint8_t _parser_buffer[128]; + uint8_t _parser_bytes; +#endif + }; // class CoreAudioBackend } // namespace