From c54ea4c759f5c02ed8b00115be58f071c314a51f Mon Sep 17 00:00:00 2001 From: "Will S. Medrano" Date: Sun, 22 Jan 2017 15:54:26 -0800 Subject: [PATCH] document progress --- README.md | 8 ++ ffi_completeness.md | 205 ++++++++++++++++++++++++++++++++++ src/port/port.rs | 9 ++ src/test/test_client_cback.rs | 4 +- src/test/test_client_port.rs | 18 ++- 5 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 ffi_completeness.md diff --git a/README.md b/README.md index 52d0bbab9..dfa6a7cbe 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,14 @@ Nice Rust bindings for Check out the `examples` directory. +## Completeness + +For details on which functions from the JACK headers have been implemented, see `ffi_completeness.md`. + +More high-level, creating clients, creating/reading/writing/connecting ports, audio, and midi are supported. + +Missing categories include, JACK threading, synchronous processing, transport and control functionality. + ## Running * `libjack` is required. Consult your package manager or the [official](http://www.jackaudio.org/downloads/) website. diff --git a/ffi_completeness.md b/ffi_completeness.md new file mode 100644 index 000000000..ed1c52174 --- /dev/null +++ b/ffi_completeness.md @@ -0,0 +1,205 @@ +# FFI Used +`jack_client_open` +`jack_client_close` +`jack_client_name_size` +`jack_get_client_name` +`jack_get_client_name_by_uuid` +`jack_activate` +`jack_deactivate` +`jack_set_thread_init_callback` +`jack_on_info_shutdown` +`jack_set_process_callback` +`jack_set_freewheel_callback` +`jack_set_buffer_size_callback` +`jack_set_sample_rate_callback` +`jack_set_client_registration_callback` +`jack_set_port_registration_callback` +`jack_set_port_connect_callback` +`jack_set_port_rename_callback` +`jack_set_graph_order_callback` +`jack_set_xrun_callback` +`jack_set_latency_callback` +`jack_set_freewheel` +`jack_set_buffer_size` +`jack_get_sample_rate` +`jack_get_buffer_size` +`jack_cpu_load` +`jack_port_register` +`jack_port_unregister` +`jack_port_get_buffer` +`jack_port_name` +`jack_port_short_name` +`jack_port_flags` +`jack_port_type` +`jack_port_is_mine` +`jack_port_connected` +`jack_port_connected_to` +`jack_port_set_name` +`jack_port_set_alias` +`jack_port_unset_alias` +`jack_port_get_aliases` +`jack_port_request_monitor` +`jack_port_request_monitor_by_name` +`jack_port_ensure_monitor` +`jack_port_monitoring_input` +`jack_connect` +`jack_disconnect` +`jack_port_disconnect` +`jack_port_name_size` +`jack_port_type_size` +`jack_port_type_get_buffer_size` +`jack_get_ports` +`jack_port_by_name` +`jack_port_by_id` +`jack_frames_since_cycle_start` +`jack_frame_time` +`jack_last_frame_time` +`jack_get_cycle_times` +`jack_frames_to_time` +`jack_time_to_frames` +`jack_get_time` +`jack_set_error_function` +`jack_set_info_function` +`jack_free` +`jack_midi_get_event_count` +`jack_midi_event_get` +`jack_midi_clear_buffer` +`jack_midi_max_event_size` +`jack_midi_event_write` +`jack_midi_get_lost_event_count` + +# FFI Unused +`jack_release_timebase` +`jack_set_sync_callback` +`jack_set_sync_timeout` +`jack_set_timebase_callback` +`jack_transport_locate` +`jack_transport_query` +`jack_get_current_transport_frame` +`jack_transport_reposition` +`jack_transport_start` +`jack_transport_stop` +`jack_get_transport_info` +`jack_set_transport_info` +`jack_get_version` +`jack_get_version_string` +`jack_get_uuid_for_client_name` +`jack_get_client_pid` +`jack_client_thread_id` +`jack_is_realtime` +`jack_thread_wait` +`jack_cycle_wait` +`jack_cycle_signal` +`jack_set_process_thread` +`jack_on_shutdown` - similar to on shutdown info +`jack_port_uuid` +`jack_port_type_id` +`jack_port_get_connections` +`jack_port_get_all_connections` +`jack_port_get_latency_range` +`jack_port_set_latency_range` +`jack_recompute_total_latencies` +`jack_client_real_time_priority` +`jack_client_max_real_time_priority` +`jack_acquire_real_time_scheduling` +`jack_client_create_thread` +`jack_drop_real_time_scheduling` +`jack_client_stop_thread` +`jack_client_kill_thread` +`jack_set_thread_creator` +`jack_set_session_callback` +`jack_session_reply` +`jack_session_event_free` +`jack_client_get_uuid` +`jack_session_notify` +`jack_session_commands_free` +`jack_reserve_client_name` +`jack_client_has_session_callback` +`jackctl_setup_signals` +`jackctl_wait_signals` +`jackctl_server_create` +`jackctl_server_destroy` +`jackctl_server_open` +`jackctl_server_start` +`jackctl_server_stop` +`jackctl_server_close` +`jackctl_server_get_drivers_list` +`jackctl_server_get_parameters` +`jackctl_server_get_internals_list` +`jackctl_server_load_internal` +`jackctl_server_unload_internal` +`jackctl_server_add_slave` +`jackctl_server_remove_slave` +`jackctl_server_switch_master` +`jackctl_driver_get_name` +`jackctl_driver_get_type` +`jackctl_driver_get_parameters` +`jackctl_driver_params_parse` +`jackctl_internal_get_name` +`jackctl_internal_get_parameters` +`jackctl_parameter_get_name` +`jackctl_parameter_get_short_description` +`jackctl_parameter_get_long_description` +`jackctl_parameter_get_type` +`jackctl_parameter_get_id` +`jackctl_parameter_is_set` +`jackctl_parameter_reset` +`jackctl_parameter_get_value` +`jackctl_parameter_set_value` +`jackctl_parameter_get_default_value` +`jackctl_parameter_has_range_constraint` +`jackctl_parameter_has_enum_constraint` +`jackctl_parameter_get_enum_constraints_count` +`jackctl_parameter_get_enum_constraint_value` +`jackctl_parameter_get_enum_constraint_description` +`jackctl_parameter_get_range_constraint` +`jackctl_parameter_constraint_is_strict` +`jackctl_parameter_constraint_is_fake_value` +`jack_error` - causes link error +`jack_info` - causes link error +`jack_log` - causes link error +`jack_set_property` +`jack_get_property` +`jack_free_description` +`jack_get_properties` +`jack_get_all_properties` +`jack_remove_property` +`jack_remove_properties` +`jack_remove_all_properties` +`jack_set_property_change_callback` +`jack_get_internal_client_name` +`jack_internal_client_handle` +`jack_internal_client_load` +`jack_internal_client_unload` +`jack_get_max_delayed_usecs` +`jack_get_xrun_delayed_usecs` +`jack_reset_max_delayed_usecs` +`jack_midi_reset_buffer` +`jack_midi_event_reserve` +`jack_ringbuffer_create` +`jack_ringbuffer_free` +`jack_ringbuffer_get_read_vector` +`jack_ringbuffer_get_write_vector` +`jack_ringbuffer_read` +`jack_ringbuffer_peek` +`jack_ringbuffer_read_advance` +`jack_ringbuffer_read_space` +`jack_ringbuffer_mlock` +`jack_ringbuffer_reset` +`jack_ringbuffer_reset_size` +`jack_ringbuffer_write` +`jack_ringbuffer_write_advance` +`jack_ringbuffer_write_space` + + +# FFI Deprecated +`jack_client_new` +`jack_internal_client_new` +`jack_internal_client_close` +`jack_engine_takeover_timebase` +`jack_port_tie` +`jack_port_untie` +`jack_port_get_latency` +`jack_port_get_total_latency` +`jack_port_set_latency` +`jack_recompute_total_latency` diff --git a/src/port/port.rs b/src/port/port.rs index d05c0031e..5f9ae2b13 100644 --- a/src/port/port.rs +++ b/src/port/port.rs @@ -92,6 +92,15 @@ impl Port { } } + /// Remove connections to/from port `self`. + pub fn disconnect(&self) -> Result<(), JackErr> { + let res = unsafe { j::jack_port_disconnect(self.client_ptr(), self.as_ptr()) }; + match res { + 0 => Ok(()), + _ => Err(JackErr::PortDisconnectionError), + } + } + /// Get the alias names for `self`. /// /// Will return a vector of strings of up to 2 elements. diff --git a/src/test/test_client_cback.rs b/src/test/test_client_cback.rs index 129fb07cf..12f30cb45 100644 --- a/src/test/test_client_cback.rs +++ b/src/test/test_client_cback.rs @@ -86,8 +86,8 @@ fn client_cback_calls_process() { fn client_cback_calls_buffer_size() { let ac = active_test_client("client_cback_calls_process"); let initial = ac.buffer_size(); - let second = 2 * initial; - let third = 2 * second; + let second = initial / 2; + let third = second / 2; ac.set_buffer_size(second).unwrap(); ac.set_buffer_size(third).unwrap(); ac.set_buffer_size(initial).unwrap(); diff --git a/src/test/test_client_port.rs b/src/test/test_client_port.rs index 02b56e763..abbb43fa4 100644 --- a/src/test/test_client_port.rs +++ b/src/test/test_client_port.rs @@ -192,8 +192,6 @@ fn client_port_recognizes_already_connected_ports() { in_p.name().to_string()))); } - - #[test] fn client_port_fails_to_connect_nonexistant_ports() { let client = open_test_client("client_port_ftcnp"); @@ -203,6 +201,22 @@ fn client_port_fails_to_connect_nonexistant_ports() { "also_no_exist".to_string()))); } +#[test] +fn client_port_can_disconnect_port_from_all() { + let mut client = open_test_client("client_port_cdpfa"); + + // initialize ports + let in_p = client.register_port("conna", AudioInSpec::default()).unwrap(); + let out_p = client.register_port("connb", AudioOutSpec::default()).unwrap(); + + // start client + let client = client.activate(DummyHandler).unwrap(); + + // connect and disconnect + client.connect_ports(&out_p, &in_p).unwrap(); + in_p.disconnect().unwrap(); +} + #[test] fn client_port_can_disconnect_ports() { let mut client = open_test_client("client_port_cdp");