.\" t .fam H .\" Understrike macro .de us \\$1\l'|0\(ul' .. . . .\" Turn hyphenation off .nh .\" Load monospace fonts .if n \{\ . mso tty-char.tmac . ftr CR R . ftr CI I . ftr CB B .\} .if '\*[.T]'dvi' \ . ftr CB CW . . .\" Start the document .TH "BSE-Functions" "3" "25 May 2005" "BEAST-0.6.6-rc1" "BEAST-0.6.6-rc1" .SH NAME .PP BSE-Functions - BSE Function Reference .PP \fIDocument Revised:\fP Wed May 25 23:38:22 2005 .br .SH SYNOPSIS .PP .na \fB\f(CBBseEngineAccessFunc\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBBseEnginePollFunc\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CItimeout_p\fP\f1, \fI\f(CIn_fds\fP\f1, \fI\f(CIfds\fP\f1, \fI\f(CIrevents_filled\fP\f1); .br \fB\f(CBBseEngineProbeFunc\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CIoblocks\fP\f1); .br \fB\f(CBBseGlueBoxedToRec\fP\f1(\fI\f(CIboxed\fP\f1); .br \fB\f(CBBseGlueBoxedToSeq\fP\f1(\fI\f(CIboxed\fP\f1); .br \fB\f(CBBseStorageRestoreLink\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIstorage\fP\f1, \fI\f(CIfrom_item\fP\f1, \fI\f(CIto_item\fP\f1, \fI\f(CIerror\fP\f1); .br \fB\f(CBbse_approx2_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx2_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx3_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx3_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx4_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx4_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx5_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx5_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx6_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx6_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx7_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx7_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx8_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx8_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx9_exp2\fP\f1(\fI\f(CIex\fP\f1); .br \fB\f(CBbse_approx9_tanh\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx_atan1\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx_atan1_prescale\fP\f1(\fI\f(CIboost_amount\fP\f1); .br \fB\f(CBbse_approx_qcircle1\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx_qcircle2\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx_qcircle3\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_approx_qcircle4\fP\f1(\fI\f(CIx\fP\f1); .br \fB\f(CBbse_engine_add_user_callback\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .br \fB\f(CBbse_engine_configure\fP\f1(\fI\f(CIlatency_ms\fP\f1, \fI\f(CIsample_freq\fP\f1, \fI\f(CIcontrol_freq\fP\f1); .br \fB\f(CBbse_engine_constrain\fP\f1(\fI\f(CIlatency_ms\fP\f1, \fI\f(CIsample_freq\fP\f1, \fI\f(CIcontrol_freq\fP\f1, \fI\f(CIblock_size_p\fP\f1, \fI\f(CIcontrol_raster_p\fP\f1); .br \fB\f(CBbse_engine_dispatch\fP\f1(); .br \fB\f(CBbse_engine_garbage_collect\fP\f1(); .br \fB\f(CBbse_engine_init\fP\f1(\fI\f(CIrun_threaded\fP\f1); .br \fB\f(CBbse_engine_tick_stamp_from_systime\fP\f1(\fI\f(CIsystime\fP\f1); .br \fB\f(CBbse_engine_wait_on_trans\fP\f1(); .br \fB\f(CBbse_glue_boxed_to_value\fP\f1(\fI\f(CIboxed_type\fP\f1, \fI\f(CIboxed\fP\f1); .br \fB\f(CBbse_idle_notify\fP\f1(\fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_idle_now\fP\f1(\fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_idle_remove\fP\f1(\fI\f(CIid\fP\f1); .br \fB\f(CBbse_idle_timed\fP\f1(\fI\f(CIusec_delay\fP\f1, \fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_item_cross_link\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1, \fI\f(CIuncross_func\fP\f1); .br \fB\f(CBbse_item_cross_unlink\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1, \fI\f(CIuncross_func\fP\f1); .br \fB\f(CBbse_item_gather_items\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIiseq\fP\f1, \fI\f(CIbase_type\fP\f1, \fI\f(CIccheck\fP\f1, \fI\f(CIpcheck\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_item_gather_items_typed\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIiseq\fP\f1, \fI\f(CIproxy_type\fP\f1, \fI\f(CIcontainer_type\fP\f1, \fI\f(CIallow_ancestor\fP\f1); .br \fB\f(CBbse_item_set_internal\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIinternal\fP\f1); .br \fB\f(CBbse_item_uncross_links\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1); .br \fB\f(CBbse_job_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .br \fB\f(CBbse_job_add_poll\fP\f1(\fI\f(CIpoll_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1, \fI\f(CIn_fds\fP\f1, \fI\f(CIfds\fP\f1); .br \fB\f(CBbse_job_add_timer\fP\f1(\fI\f(CItimer_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .br \fB\f(CBbse_job_boundary_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .br \fB\f(CBbse_job_boundary_discard\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_connect\fP\f1(\fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1, \fI\f(CIdest_module\fP\f1, \fI\f(CIdest_istream\fP\f1); .br \fB\f(CBbse_job_debug\fP\f1(\fI\f(CIdebug\fP\f1); .br \fB\f(CBbse_job_discard\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_disconnect\fP\f1(\fI\f(CIdest_module\fP\f1, \fI\f(CIdest_istream\fP\f1); .br \fB\f(CBbse_job_flow_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .br \fB\f(CBbse_job_force_reset\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_integrate\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_jconnect\fP\f1(\fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1, \fI\f(CIdest_module\fP\f1, \fI\f(CIdest_jstream\fP\f1); .br \fB\f(CBbse_job_jdisconnect\fP\f1(\fI\f(CIdest_module\fP\f1, \fI\f(CIdest_jstream\fP\f1, \fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1); .br \fB\f(CBbse_job_kill_inputs\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_kill_outputs\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_job_nop\fP\f1(); .br \fB\f(CBbse_job_remove_poll\fP\f1(\fI\f(CIpoll_func\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_job_request_probe\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIn_delay_samples\fP\f1, \fI\f(CIn_probe_values\fP\f1, \fI\f(CIochannel_bytemask\fP\f1, \fI\f(CIprobe_func\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_job_resume_at\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1); .br \fB\f(CBbse_job_suspend_now\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_midi_free_event\fP\f1(\fI\f(CIevent\fP\f1); .br \fB\f(CBbse_midi_signal_default\fP\f1(\fI\f(CItype\fP\f1); .br \fB\f(CBbse_module_has_source\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIistream\fP\f1); .br \fB\f(CBbse_module_is_scheduled\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_module_new\fP\f1(\fI\f(CIklass\fP\f1, \fI\f(CIuser_data\fP\f1); .br \fB\f(CBbse_module_new_virtual\fP\f1(\fI\f(CIn_iostreams\fP\f1, \fI\f(CIuser_data\fP\f1, \fI\f(CIfree_data\fP\f1); .br \fB\f(CBbse_module_tick_stamp\fP\f1(\fI\f(CImodule\fP\f1); .br \fB\f(CBbse_msg_handler\fP\f1(\fI\f(CIlmsg\fP\f1); .br \fB\f(CBbse_object_strdup_debug_handle\fP\f1(\fI\f(CIobject\fP\f1); .br \fB\f(CBbse_procedure_collect_input_args\fP\f1(\fI\f(CIproc\fP\f1, \fI\f(CIfirst_value\fP\f1, \fI\f(CIvar_args\fP\f1, \fI\f(CIivalues\fP\f1); .br \fB\f(CBbse_procedure_marshal_valist\fP\f1(\fI\f(CIproc_type\fP\f1, \fI\f(CIfirst_value\fP\f1, \fI\f(CImarshal\fP\f1, \fI\f(CImarshal_data\fP\f1, \fI\f(CIskip_ovalues\fP\f1, \fI\f(CIvar_args\fP\f1); .br \fB\f(CBbse_saturate_branching\fP\f1(\fI\f(CIvalue\fP\f1, \fI\f(CIlimit\fP\f1); .br \fB\f(CBbse_saturate_hard\fP\f1(\fI\f(CIvalue\fP\f1, \fI\f(CIlimit\fP\f1); .br \fB\f(CBbse_server_get\fP\f1(); .br \fB\f(CBbse_snet_intern_child\fP\f1(\fI\f(CIself\fP\f1, \fI\f(CIchild\fP\f1); .br \fB\f(CBbse_storage_parse_item_link\fP\f1(\fI\f(CIself\fP\f1, \fI\f(CIfrom_item\fP\f1, \fI\f(CIrestore_link\fP\f1, \fI\f(CIdata\fP\f1); .br \fB\f(CBbse_trans_add\fP\f1(\fI\f(CItrans\fP\f1, \fI\f(CIjob\fP\f1); .br \fB\f(CBbse_trans_commit\fP\f1(\fI\f(CItrans\fP\f1); .br \fB\f(CBbse_trans_commit_delayed\fP\f1(\fI\f(CItrans\fP\f1, \fI\f(CItick_stamp\fP\f1); .br \fB\f(CBbse_trans_dismiss\fP\f1(\fI\f(CItrans\fP\f1); .br \fB\f(CBbse_trans_merge\fP\f1(\fI\f(CItrans1\fP\f1, \fI\f(CItrans2\fP\f1); .br \fB\f(CBbse_trans_open\fP\f1(); .br \fB\f(CBbse_transact\fP\f1(\fI\f(CIjob\fP\f1, \fI\f(CI...\fP\f1); .br \fB\f(CBgsl_data_clip_sample\fP\f1(\fI\f(CIdhandle\fP\f1, \fI\f(CIcconfig\fP\f1, \fI\f(CIresult\fP\f1); .br \fB\f(CBgsl_data_find_block\fP\f1(\fI\f(CIhandle\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CIvalues\fP\f1, \fI\f(CIepsilon\fP\f1); .br \fB\f(CBgsl_data_handle_new_crop\fP\f1(\fI\f(CIsrc_handle\fP\f1, \fI\f(CIn_head_cut\fP\f1, \fI\f(CIn_tail_cut\fP\f1); .br \fB\f(CBgsl_data_handle_new_cut\fP\f1(\fI\f(CIsrc_handle\fP\f1, \fI\f(CIcut_offset\fP\f1, \fI\f(CIn_cut_values\fP\f1); .br \fB\f(CBgsl_data_make_fade_ramp\fP\f1(\fI\f(CIdhandle\fP\f1, \fI\f(CImin_pos\fP\f1, \fI\f(CImax_pos\fP\f1, \fI\f(CIlength_p\fP\f1); .br \fB\f(CBgsl_filter_butter_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_butter_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_butter_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_butter_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_fir_approx\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIvalue\fP\f1); .br \fB\f(CBgsl_filter_sine_scan\fP\f1(\fI\f(CIorder\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIn_values\fP\f1); .br \fB\f(CBgsl_filter_tscheb1_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb1_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb1_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb1_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_steepness\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIc_freq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIresidue\fP\f1); .br \fB\f(CBgsl_filter_tscheb2_steepness_db\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIc_freq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIstopband_db\fP\f1); .br \fB\f(CBgsl_hfile_close\fP\f1(\fI\f(CIhfile\fP\f1); .br \fB\f(CBgsl_hfile_open\fP\f1(\fI\f(CIfile_name\fP\f1); .br \fB\f(CBgsl_hfile_pread\fP\f1(\fI\f(CIhfile\fP\f1, \fI\f(CIoffset\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .br \fB\f(CBgsl_hfile_zoffset\fP\f1(\fI\f(CIhfile\fP\f1); .br \fB\f(CBgsl_power2_fftac\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .br \fB\f(CBgsl_power2_fftar\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIr_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .br \fB\f(CBgsl_power2_fftsc\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .br \fB\f(CBgsl_power2_fftsr\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIr_values_out\fP\f1); .br \fB\f(CBgsl_rfile_close\fP\f1(\fI\f(CIrfile\fP\f1); .br \fB\f(CBgsl_rfile_length\fP\f1(\fI\f(CIrfile\fP\f1); .br \fB\f(CBgsl_rfile_name\fP\f1(\fI\f(CIrfile\fP\f1); .br \fB\f(CBgsl_rfile_open\fP\f1(\fI\f(CIfile_name\fP\f1); .br \fB\f(CBgsl_rfile_position\fP\f1(\fI\f(CIrfile\fP\f1); .br \fB\f(CBgsl_rfile_pread\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIoffset\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .br \fB\f(CBgsl_rfile_read\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .br \fB\f(CBgsl_rfile_seek_set\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIoffset\fP\f1); .br \fB\f(CBgsl_thread_awake_before\fP\f1(\fI\f(CItick_stamp\fP\f1); .br \fB\f(CBgsl_tick_stamp\fP\f1(); .br \fB\f(CBgsl_tick_stamp_last\fP\f1(); .br .ad .SH DESCRIPTION .TP .PD 0 \fB\f(CBBseEngineAccessFunc\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CImodule\fP\f1; T{ Module to operate on T} \fI\f(CIdata\fP\f1; T{ Accessor data T} .TE .ad The BseEngineAccessFunc is a user supplied callback function which can access a module in times it is not processing. Accessors are usually used to either read out a module's current state, or to modify its state. An accessor may only operate on the \fI\f(CIdata\fP\f1 and the \fI\f(CImodule\fP\f1 passed in to it. .TP .PD 0 \fB\f(CBBseEnginePollFunc\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CItimeout_p\fP\f1, \fI\f(CIn_fds\fP\f1, \fI\f(CIfds\fP\f1, \fI\f(CIrevents_filled\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdata\fP\f1; T{ Data of poll function T} \fI\f(CIn_values\fP\f1; T{ Minimum number of values the engine wants to process T} \fI\f(CItimeout_p\fP\f1; T{ Location of timeout value T} \fI\f(CIn_fds\fP\f1; T{ Number of file descriptors used for polling T} \fI\f(CIfds\fP\f1; T{ File descriptors to be used for polling T} \fI\f(CIrevents_filled\fP\f1; T{ Indicates whether \fI\f(CIfds\fP\f1 actually have their ->revents field filled with valid data. T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ A boolean value indicating whether the engine should process data right now T} .TE .ad The BseEnginePollFunc is a user supplied callback function which can be hooked into the BSE Engine. The engine uses the poll functions to determine whether processing of \fI\f(CIn_values\fP\f1 in its module network is necessary. In order for the poll functions to react to extern events, such as device driver status changes, the engine will \fB\f(CBpoll(\fC2\f1)\fP\f1 the \fI\f(CIfds\fP\f1 of the poll function and invoke the callback with \fI\f(CIrevents_filled\fP\f1==\fCTRUE\f1 if any of its \fI\f(CIfds\fP\f1 changed state. The callback may also be invoked at other random times with \fI\f(CIrevents_filled\fP\f1=\fCFALSE\f1. It is supposed to return \fCTRUE\f1 if network processing is currently necessary, and \fCFALSE\f1 if not. If \fCFALSE\f1 is returned, \fI\f(CItimeout_p\fP\f1 may be filled with the number of milliseconds the engine should use for polling at maximum. .TP .PD 0 \fB\f(CBBseEngineProbeFunc\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CIoblocks\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdata\fP\f1; T{ user data passed in to \fB\f(CBbse_job_probe_request()\fP\f1 T} \fI\f(CItick_stamp\fP\f1; T{ engine time in microseconds of the probe T} \fI\f(CIn_values\fP\f1; T{ number of values probed T} \fI\f(CIoblocks\fP\f1; T{ array of probe value block per output channel T} .TE .ad A \fB\f(CBBseEngineProbeFunc()\fP\f1 is provided by users as a means to be notified about a completed probe. This function is executed in the user thread. Per each output channel that a probe has been requested through \fB\f(CBbse_job_request_probe()\fP\f1, a block of probe values is supplied as \fI\f(CIoblocks\fP\f1[channel-index]. These blocks are allocate via \fB\f(CBg_new()\fP\f1 and may be "stolen" by assigning NULL to the respective pointer (the caller then is responsible to \fB\f(CBg_free()\fP\f1 the block). Note that n_values may be \fC0\f1 in case the module to be probed was inactive. The blocks still contain \fB\f(CBbse_engine_block_size()\fP\f1 values regardless. .TP .PD 0 \fB\f(CBBseGlueBoxedToRec\fP\f1(\fI\f(CIboxed\fP\f1); .na .TS nokeep; l l l. \fI\f(CIboxed\fP\f1; T{ the boxed value to be converted into a record T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a GC owned SfiRec* T} .TE .ad Construct a new \fI\f(CISfiRec\fP\f1 from a boxed value. .TP .PD 0 \fB\f(CBBseGlueBoxedToSeq\fP\f1(\fI\f(CIboxed\fP\f1); .na .TS nokeep; l l l. \fI\f(CIboxed\fP\f1; T{ the boxed value to be converted into a sequence T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a GC owned SfiSeq* T} .TE .ad Construct a new \fI\f(CISfiSeq\fP\f1 from a boxed value. .TP .PD 0 \fB\f(CBBseStorageRestoreLink\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIstorage\fP\f1, \fI\f(CIfrom_item\fP\f1, \fI\f(CIto_item\fP\f1, \fI\f(CIerror\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdata\fP\f1; T{ user data T} \fI\f(CIstorage\fP\f1; T{ \fI\f(CIBseStorage\fP\f1 instance T} \fI\f(CIfrom_item\fP\f1; T{ link owner T} \fI\f(CIto_item\fP\f1; T{ link target or NULL T} \fI\f(CIerror\fP\f1; T{ error string describing failing link lookups T} .TE .ad \fB\f(CBBseStorageRestoreLink()\fP\f1 is a user supplied handler to be called at the end of a parsing stage, once object references could be resolved. Failing resolutions are indicated by non \fCNULL\f1\fI\f(CIerror\fP\f1 strings. .TP .PD 0 \fB\f(CBbse_approx2_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC0.01275\f1 which corresponds to a sample precision of \fC6.2\f1 bit, the average error amounts to \fC0.001914\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC12.81\f1 ns. .TP .PD 0 \fB\f(CBbse_approx2_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC0.00436\f1 which corresponds to a sample precision of \fC7.8\f1 bit, the average error amounts to \fC0.00069220\f1. On a 2GHz machine, execution takes roughly \fC24.48\f1 ns. .TP .PD 0 \fB\f(CBbse_approx3_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC0.001123415\f1 which corresponds to a sample precision of \fC9.7\f1 bit, the average error amounts to \fC0.000133\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC13.74\f1 ns. .TP .PD 0 \fB\f(CBbse_approx3_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC0.0003857\f1 which corresponds to a sample precision of \fC7.8\f1 bit, the average error amounts to \fC0.00004827\f1. On a 2GHz machine, execution takes roughly \fC25.78\f1 ns. .TP .PD 0 \fB\f(CBbse_approx4_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC7.876055e-05\f1 which corresponds to a sample precision of \fC13.6\f1 bit, the average error amounts to \fC7.7012792e-06\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC16.46\f1 ns. .TP .PD 0 \fB\f(CBbse_approx4_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC2.7017507e-05\f1 which corresponds to a sample precision of \fC15.1\f1 bit, the average error amounts to \fC2.799594e-06\f1. On a 2GHz machine, execution takes roughly \fC28.41\f1 ns. .TP .PD 0 \fB\f(CBbse_approx5_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.60807023e-06\f1 which corresponds to a sample precision of \fC17.7\f1 bit, the average error amounts to \fC3.842199e-07\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC18.51\f1 ns. .TP .PD 0 \fB\f(CBbse_approx5_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC1.582042006e-06\f1 which corresponds to a sample precision of \fC19.2\f1 bit, the average error amounts to \fC1.42780810e-07\f1. On a 2GHz machine, execution takes roughly \fC30.35\f1 ns. .TP .PD 0 \fB\f(CBbse_approx6_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC2.5505813e-07\f1 which corresponds to a sample precision of \fC21.9\f1 bit, the average error amounts to \fC2.1028377e-08\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC21.84\f1 ns. .TP .PD 0 \fB\f(CBbse_approx6_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC9.7878796e-08\f1 which corresponds to a sample precision of \fC23.2\f1 bit, the average error amounts to \fC1.3016999e-08\f1. On a 2GHz machine, execution takes roughly \fC34.29\f1 ns. .TP .PD 0 \fB\f(CBbse_approx7_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.1074325e-08\f1 which corresponds to a sample precision of \fC24.5\f1 bit, the average error amounts to \fC7.7448985e-09\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC23.79\f1 ns. .TP .PD 0 \fB\f(CBbse_approx7_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.4375671e-08\f1 which corresponds to a sample precision of \fC24.4\f1 bit, the average error amounts to \fC9.5028421e-09\f1. On a 2GHz machine, execution takes roughly \fC36.86\f1 ns. .TP .PD 0 \fB\f(CBbse_approx8_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.1074325e-08\f1 which corresponds to a sample precision of \fC24.5\f1 bit, the average error amounts to \fC7.6776048e-09\f1. Note that there is no significant precision increment over \fB\f(CBbse_approx7_exp2()\fP\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC26.59\f1 ns. .TP .PD 0 \fB\f(CBbse_approx8_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.4375671e-08\f1 which corresponds to a sample precision of \fC24.4\f1 bit, the average error amounts to \fC9.49155722e-09\f1. Note that there is no significant precision increment over \fB\f(CBbse_approx7_tanh()\fP\f1. On a 2GHz machine, execution takes roughly \fC42.03\f1 ns. .TP .PD 0 \fB\f(CBbse_approx9_exp2\fP\f1(\fI\f(CIex\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIex\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fC2\f1^ex T} .TE .ad Fast approximation of \fC2\f1 raised to the power of ex. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.1074325e-08\f1 which corresponds to a sample precision of \fC24.5\f1 bit, the average error amounts to \fC7.677515903e-09\f1. Note that there is no significant precision increment over \fB\f(CBbse_approx7_exp2()\fP\f1. For integer values of \fI\f(CIex\fP\f1 (i.e. \fI\f(CIex\fP\f1 - floor (\fI\f(CIex\fP\f1) -> \fC0\f1), the error approaches zero. On a 2GHz machine, execution takes roughly \fC29.40\f1 ns. .TP .PD 0 \fB\f(CBbse_approx9_tanh\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIfloat \fP\f1 \fI\f(CIx\fP\f1; T{ exponent within [-\fC127\f1..+\fC127\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y approximating \fB\f(CBtanh(x)\fP\f1 T} .TE .ad Fast approximation of the hyperbolic tangent of x. Within -\fC1\f1..+\fC1\f1, the error stays below \fC4.4375671e-08\f1 which corresponds to a sample precision of \fC24.4\f1 bit, the average error amounts to \fC9.49141881e-09\f1. Note that there is no significant precision increment over \fB\f(CBbse_approx7_tanh()\fP\f1. On a 2GHz machine, execution takes roughly \fC43.83\f1 ns. .TP .PD 0 \fB\f(CBbse_approx_atan1\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIregister double \fP\f1 \fI\f(CIx\fP\f1; T{ x as in \fB\f(CBatan(x)\fP\f1 T} .TE .ad Fast \fB\f(CBatan(x)\fP\f1/(PI/\fC2\f1) approximation, with maximum error < \fC0.01\f1 and \fB\f(CBbse_approx_atan1(\fC0\f1)\fP\f1==\fC0\f1, according to the formula: n1 = -\fC0.41156875521951602506487246309908\f1; n2 = -\fC1.0091272542790025586079663559158\f1; d1 = \fC0.81901156857081841441890603235599\f1; d2 = \fC1.0091272542790025586079663559158\f1; \fB\f(CBpositive_atan1(x)\fP\f1 = \fC1\f1 + (n1 * x + n2) / ((\fC1\f1 + d1 * x) * x + d2); .TP .PD 0 \fB\f(CBbse_approx_atan1_prescale\fP\f1(\fI\f(CIboost_amount\fP\f1); .na .TS nokeep; l l l. \fI\f(CIboost_amount\fP\f1; T{ boost amount between [\fC0\f1..\fC1\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ prescale factor for \fB\f(CBbse_approx_atan1()\fP\f1 T} .TE .ad Calculate the prescale factor for \fB\f(CBbse_approx_atan1(x*prescale)\fP\f1 from a linear boost factor, where \fC0.5\f1 amounts to prescale=\fC1.0\f1, \fC1.0\f1 results in maximum boost and \fC0.0\f1 results in maximum attenuation. .TP .PD 0 \fB\f(CBbse_approx_qcircle1\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIregister double \fP\f1 \fI\f(CIx\fP\f1; T{ x within [\fC0\f1..\fC1\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y for circle approximation within [\fC0\f1..\fC1\f1] T} .TE .ad Fast approximation of the upper right quadrant of a circle. Errors at x=\fC0\f1 and x=\fC1\f1 are zero, for the rest of the curve, the error wasn't minimized, but distributed to best fit the curverture of a quarter circle. The maximum error is below \fC0.092\f1. .TP .PD 0 \fB\f(CBbse_approx_qcircle2\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIregister double \fP\f1 \fI\f(CIx\fP\f1; T{ x within [\fC0\f1..\fC1\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y for circle approximation within [\fC0\f1..\fC1\f1] T} .TE .ad Fast approximation of the upper left quadrant of a circle. Errors at x=\fC0\f1 and x=\fC1\f1 are zero, for the rest of the curve, the error wasn't minimized, but distributed to best fit the curverture of a quarter circle. The maximum error is below \fC0.092\f1. .TP .PD 0 \fB\f(CBbse_approx_qcircle3\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIregister double \fP\f1 \fI\f(CIx\fP\f1; T{ x within [\fC0\f1..\fC1\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y for circle approximation within [\fC0\f1..\fC1\f1] T} .TE .ad Fast approximation of the lower left quadrant of a circle. Errors at x=\fC0\f1 and x=\fC1\f1 are zero, for the rest of the curve, the error wasn't minimized, but distributed to best fit the curverture of a quarter circle. The maximum error is below \fC0.092\f1. .TP .PD 0 \fB\f(CBbse_approx_qcircle4\fP\f1(\fI\f(CIx\fP\f1); .na .TS nokeep; l l l. \fI\f(CIregister double \fP\f1 \fI\f(CIx\fP\f1; T{ x within [\fC0\f1..\fC1\f1] T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ y for circle approximation within [\fC0\f1..\fC1\f1] T} .TE .ad Fast approximation of the lower right quadrant of a circle. Errors at x=\fC0\f1 and x=\fC1\f1 are zero, for the rest of the curve, the error wasn't minimized, but distributed to best fit the curverture of a quarter circle. The maximum error is below \fC0.092\f1. .TP .PD 0 \fB\f(CBbse_engine_add_user_callback\fP\f1(\fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data passed in to the free_func T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 (executed in user thread) T} .TE .ad Queues data to be collected by \fB\f(CBbse_engine_garbage_collect()\fP\f1, so \fI\f(CIfree_func\fP\f1() will be called with \fI\f(CIdata\fP\f1 as argument during the next garbage collection cycle in the user thread. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_engine_configure\fP\f1(\fI\f(CIlatency_ms\fP\f1, \fI\f(CIsample_freq\fP\f1, \fI\f(CIcontrol_freq\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint \fP\f1 \fI\f(CIlatency_ms\fP\f1; T{ calculation latency in milli seconds T} \fI\f(CIguint \fP\f1 \fI\f(CIsample_freq\fP\f1; T{ mixing frequency T} \fI\f(CIguint \fP\f1 \fI\f(CIcontrol_freq\fP\f1; T{ frequency at which to check control values or \fC0\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ whether reconfiguration was successful T} .TE .ad Reconfigure engine parameters. This function may only be called after engine initialization and can only succeed if no modules are currently integrated. .TP .PD 0 \fB\f(CBbse_engine_constrain\fP\f1(\fI\f(CIlatency_ms\fP\f1, \fI\f(CIsample_freq\fP\f1, \fI\f(CIcontrol_freq\fP\f1, \fI\f(CIblock_size_p\fP\f1, \fI\f(CIcontrol_raster_p\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint \fP\f1 \fI\f(CIlatency_ms\fP\f1; T{ calculation latency in milli seconds T} \fI\f(CIguint \fP\f1 \fI\f(CIsample_freq\fP\f1; T{ mixing frequency T} \fI\f(CIguint \fP\f1 \fI\f(CIcontrol_freq\fP\f1; T{ frequency at which to check control values or \fC0\f1 T} \fI\f(CIguint*\fP\f1 \fI\f(CIblock_size_p\fP\f1; T{ location of number of values to process block wise T} \fI\f(CIguint*\fP\f1 \fI\f(CIcontrol_raster_p\fP\f1; T{ location of number of values to skip between control values T} .TE .ad Calculate a suitable block size and control raster for a \fI\f(CIsample_freq\fP\f1 at a specific \fI\f(CIlatency_ms\fP\f1 (the latency should be > \fC0\f1). The \fI\f(CIcontrol_freq\fP\f1 if specified should me much smaller than the \fI\f(CIsample_freq\fP\f1. It determines how often control values are to be checked when calculating blocks of sample values. The block size determines the amount by which the global tick stamp (see \fB\f(CBgsl_tick_stamp()\fP\f1) is updated everytime the whole module network completed processing block size values. This function is MT-safe and may be called prior to engine initialization. .TP .PD 0 \fB\f(CBbse_engine_dispatch\fP\f1(); Perform necessary work the engine has to handle in the user thread. This function may only be called from the user thread, since it will invoke \fB\f(CBBseFreeFunc()\fP\f1 functions (see \fB\f(CBbse_engine_garbage_collect()\fP\f1) and do other things which are guranteed to be executed in the user thread. .TP .PD 0 \fB\f(CBbse_engine_garbage_collect\fP\f1(); BSE Engine user thread function. Collects processed jobs and transactions from the engine and frees them. This involves callback invocation of \fB\f(CBBseFreeFunc()\fP\f1 functions, e.g. from \fB\f(CBbse_job_access()\fP\f1 or \fB\f(CBbse_job_flow_access()\fP\f1 jobs. This function may only be called from the user thread, as \fB\f(CBBseFreeFunc()\fP\f1 functions are guranteed to be executed in the user thread. .TP .PD 0 \fB\f(CBbse_engine_init\fP\f1(\fI\f(CIrun_threaded\fP\f1); .na .TS nokeep; l l l. \fI\f(CIgboolean \fP\f1 \fI\f(CIrun_threaded\fP\f1; T{ whether the engine should be run threaded T} .TE .ad Initialize the BSE Engine, this function must be called prior to any other engine related function and can only be invoked once. .TP .PD 0 \fB\f(CBbse_engine_tick_stamp_from_systime\fP\f1(\fI\f(CIsystime\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint64 \fP\f1 \fI\f(CIsystime\fP\f1; T{ System time in micro seconds. T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ Engine tick stamp value T} .TE .ad Depending on the engine's sample frequency and the time of the last global tick stamp update, calculate the corresponding engine tick stamp from a given system time. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_engine_wait_on_trans\fP\f1(); Wait until all pending transactions have been processed by the BSE Engine. This function, when done waiting, will run a garbage collection cycle before returning. See \fB\f(CBbse_engine_garbage_collect()\fP\f1, the same restrictions apply to invokations of this function. .TP .PD 0 \fB\f(CBbse_glue_boxed_to_value\fP\f1(\fI\f(CIboxed_type\fP\f1, \fI\f(CIboxed\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGType \fP\f1 \fI\f(CIboxed_type\fP\f1; T{ type of the boxed value T} \fI\f(CIgpointer \fP\f1 \fI\f(CIboxed\fP\f1; T{ the boxed value T} .TE .ad Covert a boxed value into a \fI\f(CISfiGlueValue\fP\f1 (usually holding either a sequence or a record). The returned value is owned by the GC. .TP .PD 0 \fB\f(CBbse_idle_notify\fP\f1(\fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGSourceFunc \fP\f1 \fI\f(CIfunction\fP\f1; T{ user function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ user data T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ idle handler id, suitable for \fB\f(CBbse_idle_remove()\fP\f1 T} .TE .ad Queue \fI\f(CIfunction\fP\f1(\fI\f(CIdata\fP\f1) for execution inside the main BSE thread, similar to \fB\f(CBbse_idle_now()\fP\f1, albeit with a lower priority. This funciton is intended to be used by code which emits asyncronous notifications. This funciton is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_idle_now\fP\f1(\fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGSourceFunc \fP\f1 \fI\f(CIfunction\fP\f1; T{ user function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ user data T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ idle handler id, suitable for \fB\f(CBbse_idle_remove()\fP\f1 T} .TE .ad Execute \fI\f(CIfunction\fP\f1(\fI\f(CIdata\fP\f1) inside the main BSE thread as soon as possible. This funciton is intended to be used by code which for some reason has to be executed asyncronously. This funciton is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_idle_remove\fP\f1(\fI\f(CIid\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint \fP\f1 \fI\f(CIid\fP\f1; T{ idle handler id T} .TE .ad Remove or unqueue an idle handler queued by \fB\f(CBbse_idle_now()\fP\f1 or one of its variants. This funciton is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_idle_timed\fP\f1(\fI\f(CIusec_delay\fP\f1, \fI\f(CIfunction\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint64 \fP\f1 \fI\f(CIusec_delay\fP\f1; T{ microsecond delay T} \fI\f(CIGSourceFunc \fP\f1 \fI\f(CIfunction\fP\f1; T{ user function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ user data T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ idle handler id, suitable for \fB\f(CBbse_idle_remove()\fP\f1 T} .TE .ad Execute \fI\f(CIfunction\fP\f1(\fI\f(CIdata\fP\f1) with the main BSE thread, similar to \fB\f(CBbse_idle_now()\fP\f1, after a delay period of \fI\f(CIusec_delay\fP\f1 has passed. This funciton is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_item_cross_link\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1, \fI\f(CIuncross_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseItem*\fP\f1 \fI\f(CIowner\fP\f1; T{ reference owner T} \fI\f(CIBseItem*\fP\f1 \fI\f(CIlink\fP\f1; T{ item to be referenced by \fI\f(CIowner\fP\f1 T} \fI\f(CIBseItemUncross \fP\f1 \fI\f(CIuncross_func\fP\f1; T{ notifier to be executed on uncrossing T} .TE .ad Install a weak cross reference from \fI\f(CIowner\fP\f1 to \fI\f(CIlink\fP\f1. The two items must have a common ancestor when the cross link is installed. Once their ancestry changes so that they don't have a common ancestor anymore, \fI\f(CIuncross_func\fP\f1() is executed. .TP .PD 0 \fB\f(CBbse_item_cross_unlink\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1, \fI\f(CIuncross_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseItem*\fP\f1 \fI\f(CIowner\fP\f1; T{ reference owner T} \fI\f(CIBseItem*\fP\f1 \fI\f(CIlink\fP\f1; T{ item referenced by \fI\f(CIowner\fP\f1 T} \fI\f(CIBseItemUncross \fP\f1 \fI\f(CIuncross_func\fP\f1; T{ notifier queued to be executed on uncrossing T} .TE .ad Removes a cross link previously installed via \fB\f(CBbse_item_cross_link()\fP\f1 without executing \fI\f(CIuncross_func\fP\f1(). .TP .PD 0 \fB\f(CBbse_item_gather_items\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIiseq\fP\f1, \fI\f(CIbase_type\fP\f1, \fI\f(CIccheck\fP\f1, \fI\f(CIpcheck\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseItem*\fP\f1 \fI\f(CIitem\fP\f1; T{ valid \fI\f(CIBseItem\fP\f1 from which to start gathering T} \fI\f(CIBseItemSeq*\fP\f1 \fI\f(CIiseq\fP\f1; T{ T} \fI\f(CIGType \fP\f1 \fI\f(CIbase_type\fP\f1; T{ base type of the items to gather T} \fI\f(CIBseItemCheckContainer \fP\f1 \fI\f(CIccheck\fP\f1; T{ container filter function T} \fI\f(CIBseItemCheckProxy \fP\f1 \fI\f(CIpcheck\fP\f1; T{ proxy filter function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ \fI\f(CIdata\fP\f1 pointer to \fI\f(CIccheck\fP\f1 and \fI\f(CIpcheck\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ returns \fI\f(CIitems\fP\f1 T} .TE .ad This function gathers items from an object hirachy, walking upwards, starting out with \fI\f(CIitem\fP\f1. For each container passing \fI\f(CIccheck\fP\f1(), all immediate children are tested for addition with \fI\f(CIpcheck\fP\f1. .TP .PD 0 \fB\f(CBbse_item_gather_items_typed\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIiseq\fP\f1, \fI\f(CIproxy_type\fP\f1, \fI\f(CIcontainer_type\fP\f1, \fI\f(CIallow_ancestor\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseItem*\fP\f1 \fI\f(CIitem\fP\f1; T{ valid \fI\f(CIBseItem\fP\f1 from which to start gathering T} \fI\f(CIBseItemSeq*\fP\f1 \fI\f(CIiseq\fP\f1; T{ T} \fI\f(CIGType \fP\f1 \fI\f(CIproxy_type\fP\f1; T{ base type of the items to gather T} \fI\f(CIGType \fP\f1 \fI\f(CIcontainer_type\fP\f1; T{ base type of the containers to check for items T} \fI\f(CIgboolean \fP\f1 \fI\f(CIallow_ancestor\fP\f1; T{ if \fCFALSE\f1, ancestors of \fI\f(CIitem\fP\f1 are omitted T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ returns \fI\f(CIitems\fP\f1 T} .TE .ad Variant of \fB\f(CBbse_item_gather_items()\fP\f1, the containers and items are simply filtered by checking derivation from \fI\f(CIcontainer_type\fP\f1 and \fI\f(CIproxy_type\fP\f1 respectively. Gathered items may not be ancestors of \fI\f(CIitem\fP\f1 if \fI\f(CIallow_ancestor\fP\f1 is \fCFALSE\f1. .TP .PD 0 \fB\f(CBbse_item_set_internal\fP\f1(\fI\f(CIitem\fP\f1, \fI\f(CIinternal\fP\f1); .na .TS nokeep; l l l. \fI\f(CIgpointer \fP\f1 \fI\f(CIitem\fP\f1; T{ valid \fI\f(CIBseItem\fP\f1 T} \fI\f(CIgboolean \fP\f1 \fI\f(CIinternal\fP\f1; T{ \fCTRUE\f1 or \fCFALSE\f1 T} .TE .ad Set whether an item should be considered internal to the BSE implementation (or implementation of another BSE object). Internal items are not stored with their parents and undo is not recorded for internal items either. Marking containers internal also affects any children they contain, in effect, the whole posterity spawned by the container is considered internal. .TP .PD 0 \fB\f(CBbse_item_uncross_links\fP\f1(\fI\f(CIowner\fP\f1, \fI\f(CIlink\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseItem*\fP\f1 \fI\f(CIowner\fP\f1; T{ reference owner T} \fI\f(CIBseItem*\fP\f1 \fI\f(CIlink\fP\f1; T{ item referenced by \fI\f(CIowner\fP\f1 T} .TE .ad Destroys all existing cross links from \fI\f(CIowner\fP\f1 to \fI\f(CIlink\fP\f1 by executing the associated notifiers. .TP .PD 0 \fB\f(CBbse_job_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to access T} \fI\f(CIBseEngineAccessFunc \fP\f1 \fI\f(CIaccess_func\fP\f1; T{ The accessor function (executed in master thread) T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data passed in to the accessor T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 (executed in user thread) T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which will invoke \fI\f(CIaccess_func\fP\f1 on \fI\f(CImodule\fP\f1 with \fI\f(CIdata\fP\f1 when the transaction queue is processed to modify the module's state. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_add_poll\fP\f1(\fI\f(CIpoll_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1, \fI\f(CIn_fds\fP\f1, \fI\f(CIfds\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseEnginePollFunc \fP\f1 \fI\f(CIpoll_func\fP\f1; T{ Poll function to add T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data of poll function T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 T} \fI\f(CIguint \fP\f1 \fI\f(CIn_fds\fP\f1; T{ Number of poll file descriptors T} \fI\f(CIconst GPollFD*\fP\f1 \fI\f(CIfds\fP\f1; T{ File descriptors to \fB\f(CBselect(\fC2\f1)\fP\f1 or \fB\f(CBpoll(\fC2\f1)\fP\f1 on T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which adds a poll function to the engine. The poll function is used by the engine to determine whether processing is currently necessary. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_add_timer\fP\f1(\fI\f(CItimer_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseEngineTimerFunc \fP\f1 \fI\f(CItimer_func\fP\f1; T{ Timer function to add T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data of timer function T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which adds a timer function to the engine. The timer function is called after the engine caused new tick stamp updates. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_boundary_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to access T} \fI\f(CIguint64 \fP\f1 \fI\f(CItick_stamp\fP\f1; T{ Engine time stamp T} \fI\f(CIBseEngineAccessFunc \fP\f1 \fI\f(CIaccess_func\fP\f1; T{ The accessor function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data passed in to the accessor T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which inserts \fI\f(CIaccess_func\fP\f1 with \fI\f(CIdata\fP\f1 into the boundary job queue of \fI\f(CImodule\fP\f1. Boundary jobs are executed at block boundaries, after all ordinary jobs have been processed and before global time stamp counter passed \fI\f(CItick_stamp\fP\f1. Boundary jobs queued for executaion after a node's destruction will not be executed but destroyed together with the node. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_boundary_discard\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to access T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Discard \fI\f(CImodule\fP\f1 at block boundaries, after all ordinary jobs have been processed. This job type should be used instead of jobs from \fB\f(CBbse_job_discard()\fP\f1 in situations where queueing of past-discard jobs before the next block boundary is hard to avoid (such as queing disconnection/suspend jobs from within \fB\f(CBprocess()\fP\f1). This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_connect\fP\f1(\fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1, \fI\f(CIdest_module\fP\f1, \fI\f(CIdest_istream\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CIsrc_module\fP\f1; T{ Module with output stream T} \fI\f(CIguint \fP\f1 \fI\f(CIsrc_ostream\fP\f1; T{ Index of output stream of \fI\f(CIsrc_module\fP\f1 T} \fI\f(CIBseModule*\fP\f1 \fI\f(CIdest_module\fP\f1; T{ Module with unconnected input stream T} \fI\f(CIguint \fP\f1 \fI\f(CIdest_istream\fP\f1; T{ Index of input stream of \fI\f(CIdest_module\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which connects the ouput stream \fI\f(CIsrc_ostream\fP\f1 of module \fI\f(CIsrc_module\fP\f1 to the input stream \fI\f(CIdest_istream\fP\f1 of module \fI\f(CIdest_module\fP\f1 (it is an error if the input stream is already connected by the time the job is executed). This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_debug\fP\f1(\fI\f(CIdebug\fP\f1); .na .TS nokeep; l l l. \fI\f(CIconst gchar*\fP\f1 \fI\f(CIdebug\fP\f1; T{ Debug message T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which issues \fI\f(CIdebug\fP\f1 message when the job is executed. This function is meant for debugging purposes during development phase only and shouldn't be used in production code. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_discard\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to discard T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which removes \fI\f(CImodule\fP\f1 from the engine and destroys it. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_disconnect\fP\f1(\fI\f(CIdest_module\fP\f1, \fI\f(CIdest_istream\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CIdest_module\fP\f1; T{ Module with connected input stream T} \fI\f(CIguint \fP\f1 \fI\f(CIdest_istream\fP\f1; T{ Index of input stream of \fI\f(CIdest_module\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which causes the input stream \fI\f(CIdest_istream\fP\f1 of \fI\f(CIdest_module\fP\f1 to be disconnected (it is an error if the input stream isn't connected by the time the job is executed). This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_flow_access\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1, \fI\f(CIaccess_func\fP\f1, \fI\f(CIdata\fP\f1, \fI\f(CIfree_func\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to access T} \fI\f(CIguint64 \fP\f1 \fI\f(CItick_stamp\fP\f1; T{ Engine time stamp T} \fI\f(CIBseEngineAccessFunc \fP\f1 \fI\f(CIaccess_func\fP\f1; T{ The accessor function T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data passed in to the accessor T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_func\fP\f1; T{ Function to free \fI\f(CIdata\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which inserts \fI\f(CIaccess_func\fP\f1 with \fI\f(CIdata\fP\f1 into the flow job queue of \fI\f(CImodule\fP\f1. Flow jobs are jobs with limited impact on modules, which are executed during flow system progress at specific times. Once the time stamp counter of \fI\f(CImodule\fP\f1 passed \fI\f(CItick_stamp\fP\f1, \fI\f(CIaccess_func\fP\f1 is called to modify the module's state. Flow jobs queued for executaion after a node's destruction will not be executed but destroyed together with the node. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_force_reset\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to be reset T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Forces a reset of \fI\f(CImodule\fP\f1 before its next call to \fB\f(CBprocess()\fP\f1, if its class provides a \fB\f(CBreset()\fP\f1 implementation. This is usually not a good idea, as forcing an immediate reset can lead to multiple unnecessary \fB\f(CBreset()\fP\f1 invocations. The logic used to invoke \fB\f(CBreset()\fP\f1 automatically is usually good enough to cover all required cases. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_integrate\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ The module to integrate T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job to integrate \fI\f(CImodule\fP\f1 into the engine. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_jconnect\fP\f1(\fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1, \fI\f(CIdest_module\fP\f1, \fI\f(CIdest_jstream\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CIsrc_module\fP\f1; T{ Module with output stream T} \fI\f(CIguint \fP\f1 \fI\f(CIsrc_ostream\fP\f1; T{ Index of output stream of \fI\f(CIsrc_module\fP\f1 T} \fI\f(CIBseModule*\fP\f1 \fI\f(CIdest_module\fP\f1; T{ Module with unconnected joint input stream T} \fI\f(CIguint \fP\f1 \fI\f(CIdest_jstream\fP\f1; T{ Index of joint input stream of \fI\f(CIdest_module\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which connects the ouput stream \fI\f(CIsrc_ostream\fP\f1 of module \fI\f(CIsrc_module\fP\f1 to the joint input stream \fI\f(CIdest_istream\fP\f1 of module \fI\f(CIdest_module\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_jdisconnect\fP\f1(\fI\f(CIdest_module\fP\f1, \fI\f(CIdest_jstream\fP\f1, \fI\f(CIsrc_module\fP\f1, \fI\f(CIsrc_ostream\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CIdest_module\fP\f1; T{ Module with connected input stream T} \fI\f(CIguint \fP\f1 \fI\f(CIdest_jstream\fP\f1; T{ Index of input stream of \fI\f(CIdest_module\fP\f1 T} \fI\f(CIBseModule*\fP\f1 \fI\f(CIsrc_module\fP\f1; T{ Module with output stream T} \fI\f(CIguint \fP\f1 \fI\f(CIsrc_ostream\fP\f1; T{ Index of output stream of \fI\f(CIsrc_module\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which causes the joint input stream \fI\f(CIdest_jstream\fP\f1 of \fI\f(CIdest_module\fP\f1 to be disconnected from the output stream \fI\f(CIsrc_ostream\fP\f1 of \fI\f(CIsrc_module\fP\f1 (it is an error if this connection isn't established by the time the job is executed). Beware, the order of \fI\f(CIdest_module\fP\f1 and \fI\f(CIsrc_module\fP\f1 is different from \fB\f(CBbse_job_jconnect()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_kill_inputs\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ Module with input streams T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which causes all connected input streams of \fI\f(CImodule\fP\f1 to be disconnected, like it's done upon discarding the module. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_kill_outputs\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ Module with output streams T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which causes all connected output streams of \fI\f(CImodule\fP\f1 to be disconnected, like it's done upon discarding the module. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_nop\fP\f1(); .na .TS nokeep; l l l. \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which does nothing. The job enforces a roundtrip to the engine's master thread however, which may be relevant when comitting otherwise empty transactions and calling \fB\f(CBbse_engine_wait_on_trans()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_remove_poll\fP\f1(\fI\f(CIpoll_func\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseEnginePollFunc \fP\f1 \fI\f(CIpoll_func\fP\f1; T{ Poll function to remove T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ Data of poll function T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which removes a previously inserted poll function from the engine. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_request_probe\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIn_delay_samples\fP\f1, \fI\f(CIn_probe_values\fP\f1, \fI\f(CIochannel_bytemask\fP\f1, \fI\f(CIprobe_func\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CImodule\fP\f1; T{ The module to access T} \fI\f(CIn_delay_samples\fP\f1; T{ Number of samples to wait before taking probes T} \fI\f(CIn_probe_values\fP\f1; T{ Number of probe values to take T} \fI\f(CIochannel_bytemask\fP\f1; T{ One byte per ochannel, bytes != \fC0\f1 indicate a probe request T} \fI\f(CIprobe_func\fP\f1; T{ Function invoked with \fI\f(CIdata\fP\f1 in the user thread T} \fI\f(CIdata\fP\f1; T{ Data passed in to the accessor T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which inserts \fI\f(CIprobe_func\fP\f1 with \fI\f(CIdata\fP\f1 into the job queue of \fI\f(CImodule\fP\f1. Probe jobs are jobs which collect data from a given set of output channels of a module as probe data. The job then returns to the user thread before the next block boundary, and \fI\f(CIprobe_func\fP\f1() will be invoked as early as possible. There's no \fB\f(CBfree_func()\fP\f1 supplied to delete \fI\f(CIdata\fP\f1, because such a function would always be called immediately after \fI\f(CIprobe_func\fP\f1(). So instead, any \fI\f(CIdata\fP\f1 specific release handling should be integrated into \fI\f(CIprobe_func\fP\f1(). The \fI\f(CIochannel_bytemask\fP\f1 must point to an array of bytes with a size equal to the number of output channels of \fI\f(CImodule\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_resume_at\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CItick_stamp\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ Module to resume T} \fI\f(CIguint64 \fP\f1 \fI\f(CItick_stamp\fP\f1; T{ Sample tick at which to resume \fI\f(CImodule\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which inserts a resumption event into the job queue of \fI\f(CImodule\fP\f1. Once the time stamp counter of \fI\f(CImodule\fP\f1 passed \fI\f(CItick_stamp\fP\f1, if it is supended, its \fB\f(CBreset()\fP\f1 method is called and the module is resumed, causing it's \fB\f(CBprocess()\fP\f1 method to be called again. Resuming a module also resumes all input modules it has, unless those were explicitely suspended via \fB\f(CBbse_job_suspend_now()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_job_suspend_now\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ Module not currently suspended T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ New job suitable for \fB\f(CBbse_trans_add()\fP\f1 T} .TE .ad Create a new transaction job which suspends the \fI\f(CImodule\fP\f1 and all it's input modules which don't have other non-suspended output connections. Suspension of a module prevents it's \fB\f(CBprocess()\fP\f1 method from being called, it's outputs are simply filled with zero's instead. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_midi_free_event\fP\f1(\fI\f(CIevent\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseMidiEvent*\fP\f1 \fI\f(CIevent\fP\f1; T{ BseMidiEvent structure T} .TE .ad Free the \fI\f(CIevent\fP\f1 and all data associated with it. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_midi_signal_default\fP\f1(\fI\f(CItype\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseMidiSignalType \fP\f1 \fI\f(CItype\fP\f1; T{ BseMidiSignalType type T} .TE .ad Get the initial default value for a midi signal. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_module_has_source\fP\f1(\fI\f(CImodule\fP\f1, \fI\f(CIistream\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ a BSE Engine Module T} \fI\f(CIguint \fP\f1 \fI\f(CIistream\fP\f1; T{ Index of input stream T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ whether the module has a possible input T} .TE .ad Check whether \fI\f(CIistream\fP\f1 may be disconnected via \fB\f(CBbse_job_disconnect()\fP\f1. This is not an indication for whether BSE_MODULE_ISTREAM (\fI\f(CImodule\fP\f1, \fI\f(CIistream\fP\f1).connected will be \fCTRUE\f1 during \fB\f(CBprocess()\fP\f1, as the source may be a dangling virtual module, resulting in BSE_MODULE_ISTREAM (\fI\f(CImodule\fP\f1, \fI\f(CIistream\fP\f1).connected being \fCFALSE\f1. See also \fB\f(CBbse_module_new_virtual()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_module_is_scheduled\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ a BSE Engine Module T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ whether the module is scheduled T} .TE .ad Check whether \fI\f(CImodule\fP\f1 is part of the schedule required to calculate the signal flow up to the consumer modules. This state may frequently change with for instance connection changes of other modules. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_module_new\fP\f1(\fI\f(CIklass\fP\f1, \fI\f(CIuser_data\fP\f1); .na .TS nokeep; l l l. \fI\f(CIconst BseModuleClass*\fP\f1 \fI\f(CIklass\fP\f1; T{ the BseModuleClass which determines the module's behaviour T} \fI\f(CIgpointer \fP\f1 \fI\f(CIuser_data\fP\f1; T{ user data pointer T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a newly created module T} .TE .ad Create a new module with methods specified in \fI\f(CIklass\fP\f1 and a user_data field set to \fI\f(CIuser_data\fP\f1. The returned module can then be integrated into the engine with \fB\f(CBbse_job_integrate()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_module_new_virtual\fP\f1(\fI\f(CIn_iostreams\fP\f1, \fI\f(CIuser_data\fP\f1, \fI\f(CIfree_data\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint \fP\f1 \fI\f(CIn_iostreams\fP\f1; T{ number of input and output streams T} \fI\f(CIgpointer \fP\f1 \fI\f(CIuser_data\fP\f1; T{ user data, stored in module->user_data T} \fI\f(CIBseFreeFunc \fP\f1 \fI\f(CIfree_data\fP\f1; T{ function to free user_data when the module is discarded T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a newly created module T} .TE .ad Create a new virtual module which has \fI\f(CIn_iostreams\fP\f1 input streams and \fI\f(CIn_iostreams\fP\f1 output streams. Simply put, virtual modules just pass all input stream signals through to the corresponsding output stream. However, they are cheaper to compute than a literal module implementation that just passes through all data in its \fB\f(CBprogress()\fP\f1 method, because the connections can be virtualized in a connection optimization stage during scheduling, so that they don't end up in the list of modules which need to be processed during calculation phase. Beware though, flow jobs may not be scheduled on virtual modules (thusly, suspend jobs cannot be queued on them either), as virtual modules are ignored during calculation phase. They do, however, work just like ordinary modules with regards to suspension propagation, so the suspension state from output modules does only propagate across the virtual module to its input modules, if all its outputs are suspended. Instead of a single virtual module with multiple input/output streams, multiple virtual modules can be used if suspension is desired to propagate per stream. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_module_tick_stamp\fP\f1(\fI\f(CImodule\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseModule*\fP\f1 \fI\f(CImodule\fP\f1; T{ a BSE Engine Module T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ the module's tick stamp, indicating its process status T} .TE .ad Any thread may call this function on a valid engine module. The module specific tick stamp is updated to \fB\f(CBgsl_tick_stamp()\fP\f1 + \fI\f(CIn_values\fP\f1 every time its \fB\f(CBBseProcessFunc()\fP\f1 function was called. See also \fB\f(CBgsl_tick_stamp()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_msg_handler\fP\f1(\fI\f(CIlmsg\fP\f1); .na .TS nokeep; l l l. \fI\f(CIconst SfiMessage*\fP\f1 \fI\f(CIlmsg\fP\f1; T{ T} .TE .ad BSE log handler, suitable for \fB\f(CBsfi_msg_set_thread_handler()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_object_strdup_debug_handle\fP\f1(\fI\f(CIobject\fP\f1); .na .TS nokeep; l l l. \fI\f(CIgpointer \fP\f1 \fI\f(CIobject\fP\f1; T{ supposedly valid \fI\f(CIGObject\fP\f1 pointer T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ newly allocated string T} .TE .ad Construct a debugging identifier for \fI\f(CIobject\fP\f1. No mutable object members are accessed, so as long as the caller keeps \fI\f(CIobject\fP\f1 alive for the duration of the function call, this function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_procedure_collect_input_args\fP\f1(\fI\f(CIproc\fP\f1, \fI\f(CIfirst_value\fP\f1, \fI\f(CIvar_args\fP\f1, \fI\f(CIivalues\fP\f1); .na .TS nokeep; l l l. \fI\f(CIproc\fP\f1; T{ valid \fI\f(CIBseProcedureClass\fP\f1 T} \fI\f(CIfirst_value\fP\f1; T{ the first input argument if not to be collected T} \fI\f(CIvar_args\fP\f1; T{ \fI\f(CIva_list\fP\f1 to collect input args from T} \fI\f(CIivalues\fP\f1; T{ uninitialized GValue array with at least proc->n_in_pspecs members T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ \fI\f(CIBseErrorType\fP\f1 value of error if any occoured during collection T} .TE .ad Collect input arguments for a procedure call from a \fI\f(CIva_list\fP\f1. The first value may be supplied as \fI\f(CIfirst_value\fP\f1 and will then not be collected. \fI\f(CIivalues\fP\f1 must be at least \fI\f(CIproc\fP\f1->n_in_pspecs elements long and all elements will be initialized after the function returns (even in error cases). \fI\f(CIfirst_value\fP\f1 may be the same adress as \fI\f(CIivalues\fP\f1, in whic hcase the first argument is entirely ignored and collection simply starts out with the second argument. .TP .PD 0 \fB\f(CBbse_procedure_marshal_valist\fP\f1(\fI\f(CIproc_type\fP\f1, \fI\f(CIfirst_value\fP\f1, \fI\f(CImarshal\fP\f1, \fI\f(CImarshal_data\fP\f1, \fI\f(CIskip_ovalues\fP\f1, \fI\f(CIvar_args\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGType \fP\f1 \fI\f(CIproc_type\fP\f1; T{ a type derived from \fCBSE_TYPE_PROCEDURE\f1 T} \fI\f(CIconst GValue*\fP\f1 \fI\f(CIfirst_value\fP\f1; T{ the first input argument if not to be collected T} \fI\f(CIBseProcedureMarshal \fP\f1 \fI\f(CImarshal\fP\f1; T{ function marshalling the procedure call or \fCNULL\f1 T} \fI\f(CIgpointer \fP\f1 \fI\f(CImarshal_data\fP\f1; T{ data passed in to \fI\f(CImarshal\fP\f1 T} \fI\f(CIgboolean \fP\f1 \fI\f(CIskip_ovalues\fP\f1; T{ whether return value locations should be collected and filled in T} \fI\f(CIva_list \fP\f1 \fI\f(CIvar_args\fP\f1; T{ \fI\f(CIva_list\fP\f1 to collect input args from T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ \fI\f(CIBseErrorType\fP\f1 value of error if any occoured T} .TE .ad Collect input arguments for a procedure call from a \fI\f(CIva_list\fP\f1 and call the procedure, optionally via \fI\f(CImarshal\fP\f1. If \fI\f(CIskip_ovalues\fP\f1 is \fCFALSE\f1, the procedure return values will be stored in return value locations also collected from \fI\f(CIvar_args\fP\f1. .TP .PD 0 \fB\f(CBbse_saturate_branching\fP\f1(\fI\f(CIvalue\fP\f1, \fI\f(CIlimit\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdouble \fP\f1 \fI\f(CIvalue\fP\f1; T{ value to saturate T} \fI\f(CIdouble \fP\f1 \fI\f(CIlimit\fP\f1; T{ limit not to be exceeded by value T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ \fI\f(CIvalue\fP\f1 bounded by -\fI\f(CIlimit\fP\f1 and \fI\f(CIlimit\fP\f1 T} .TE .ad Clamp \fI\f(CIvalue\fP\f1 within -\fI\f(CIlimit\fP\f1 and +\fI\f(CIlimit\fP\f1. Limiting is performed by executing conditions and branches, so it will probably run slower than \fB\f(CBbse_saturate_hard()\fP\f1 on many machines. On a 2GHz machine, execution takes roughly \fC8.29\f1 ns. .TP .PD 0 \fB\f(CBbse_saturate_hard\fP\f1(\fI\f(CIvalue\fP\f1, \fI\f(CIlimit\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdouble \fP\f1 \fI\f(CIvalue\fP\f1; T{ value to saturate T} \fI\f(CIdouble \fP\f1 \fI\f(CIlimit\fP\f1; T{ limit not to be exceeded by value T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ \fI\f(CIvalue\fP\f1 bounded by -\fI\f(CIlimit\fP\f1 and \fI\f(CIlimit\fP\f1 T} .TE .ad Clamp \fI\f(CIvalue\fP\f1 within -\fI\f(CIlimit\fP\f1 and +\fI\f(CIlimit\fP\f1. Limiting is performed by floating point operations only, thus executing faster than condition based branching code on most modern architectures. On a 2GHz machine, execution takes roughly \fC6.86\f1 ns. .TP .PD 0 \fB\f(CBbse_server_get\fP\f1(); .na .TS nokeep; l l l. \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ Global BSE Server T} .TE .ad Retrieve the global BSE server object. .TP .PD 0 \fB\f(CBbse_snet_intern_child\fP\f1(\fI\f(CIself\fP\f1, \fI\f(CIchild\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseSNet*\fP\f1 \fI\f(CIself\fP\f1; T{ valid \fI\f(CIBseSNet\fP\f1 T} \fI\f(CIgpointer \fP\f1 \fI\f(CIchild\fP\f1; T{ valid \fI\f(CIBseItem\fP\f1, which is a child of \fI\f(CIself\fP\f1 T} .TE .ad Mark \fI\f(CIchild\fP\f1 as internal via \fB\f(CBbse_item_set_internal()\fP\f1 and add special protection so to not destroy it automatically upon \fB\f(CBg_object_dispose()\fP\f1. .TP .PD 0 \fB\f(CBbse_storage_parse_item_link\fP\f1(\fI\f(CIself\fP\f1, \fI\f(CIfrom_item\fP\f1, \fI\f(CIrestore_link\fP\f1, \fI\f(CIdata\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseStorage*\fP\f1 \fI\f(CIself\fP\f1; T{ T} \fI\f(CIBseItem*\fP\f1 \fI\f(CIfrom_item\fP\f1; T{ link owner T} \fI\f(CIBseStorageRestoreLink \fP\f1 \fI\f(CIrestore_link\fP\f1; T{ BseStorageRestoreLink handler to be called once the link was resolved T} \fI\f(CIgpointer \fP\f1 \fI\f(CIdata\fP\f1; T{ user data passed into \fI\f(CIrestore_link\fP\f1() T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ expected token in case of a parsing error (\fCG_TOKEN_NONE\f1 on success) T} .TE .ad Parse an item link statement and return the expected token if a parsing error occours. Item links are resolved at the end of the parsing stage by calling the user supplied handler \fI\f(CIrestore_link\fP\f1() with the link target amongst its arguments (see \fB\f(CBBseStorageRestoreLink()\fP\f1). .TP .PD 0 \fB\f(CBbse_trans_add\fP\f1(\fI\f(CItrans\fP\f1, \fI\f(CIjob\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans\fP\f1; T{ Opened transaction T} \fI\f(CIBseJob*\fP\f1 \fI\f(CIjob\fP\f1; T{ Job to add T} .TE .ad Append a job to an opened transaction. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_trans_commit\fP\f1(\fI\f(CItrans\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans\fP\f1; T{ open transaction T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ tick stamp of job execution T} .TE .ad Close the transaction and commit it to the engine. The engine will execute the jobs contained in this transaction as soon as it has completed its current processing cycle, at which point \fB\f(CBgsl_tick_stamp()\fP\f1 matches the returned tick stamp. The jobs will be executed in the exact order they were added to the transaction. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_trans_commit_delayed\fP\f1(\fI\f(CItrans\fP\f1, \fI\f(CItick_stamp\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans\fP\f1; T{ open transaction T} \fI\f(CIguint64 \fP\f1 \fI\f(CItick_stamp\fP\f1; T{ earliest stamp T} .TE .ad Commit the transaction like \fB\f(CBbse_trans_commit()\fP\f1, but make sure that the commit happens no earlier than \fI\f(CItick_stamp\fP\f1. This function will block until the commit occoured, so it will not return any earlier than \fI\f(CItick_stamp\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_trans_dismiss\fP\f1(\fI\f(CItrans\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans\fP\f1; T{ Opened transaction T} .TE .ad Close and discard the transaction, causes destruction of all jobs currently contained in it and prevents their execution. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_trans_merge\fP\f1(\fI\f(CItrans1\fP\f1, \fI\f(CItrans2\fP\f1); .na .TS nokeep; l l l. \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans1\fP\f1; T{ open transaction T} \fI\f(CIBseTrans*\fP\f1 \fI\f(CItrans2\fP\f1; T{ open transaction T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ open transaction T} .TE .ad Merge two open transactions by appending the jobs of \fI\f(CItrans2\fP\f1 to the jobs of \fI\f(CItrans1\fP\f1, returning the resulting transaction. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_trans_open\fP\f1(); .na .TS nokeep; l l l. \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ Newly opened empty transaction T} .TE .ad Open up a new transaction to commit jobs to the BSE Engine. While the distinct functions to operate on a transaction are MT-safe, the caller has to take measures himself, to assure that only one function operates on the transaction at a time. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBbse_transact\fP\f1(\fI\f(CIjob\fP\f1, \fI\f(CI...\fP\f1); .na .TS nokeep; l l l. \fI\f(CIjob\fP\f1; T{ First job T} \fI\f(CI...\fP\f1; T{ \fCNULL\f1 terminated job list T} .TE .ad Convenience function which openes up a new transaction, collects the \fCNULL\f1 terminated job list passed to the function, and commits the transaction. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_data_clip_sample\fP\f1(\fI\f(CIdhandle\fP\f1, \fI\f(CIcconfig\fP\f1, \fI\f(CIresult\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslDataHandle*\fP\f1 \fI\f(CIdhandle\fP\f1; T{ valid and opened \fI\f(CIGslDataHandle\fP\f1 T} \fI\f(CIGslDataClipConfig*\fP\f1 \fI\f(CIcconfig\fP\f1; T{ clip configuration T} \fI\f(CIGslDataClipResult*\fP\f1 \fI\f(CIresult\fP\f1; T{ clip result T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ error code as stored in \fI\f(CIresult\fP\f1 T} .TE .ad Clip silence at head and/or tail of a data handle according to a given threshold and optionally produce a fade ramp. .TP .PD 0 \fB\f(CBgsl_data_find_block\fP\f1(\fI\f(CIhandle\fP\f1, \fI\f(CIn_values\fP\f1, \fI\f(CIvalues\fP\f1, \fI\f(CIepsilon\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslDataHandle*\fP\f1 \fI\f(CIhandle\fP\f1; T{ an open GslDataHandle T} \fI\f(CIguint \fP\f1 \fI\f(CIn_values\fP\f1; T{ amount of values to look for T} \fI\f(CIconst gfloat*\fP\f1 \fI\f(CIvalues\fP\f1; T{ values to find T} \fI\f(CIgfloat \fP\f1 \fI\f(CIepsilon\fP\f1; T{ maximum difference upon comparisions T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ position of values in data handle or -\fC1\f1 T} .TE .ad Find the position of a block of values within a data handle, where all values compare to the reference values with a delta smaller than epsilon. .TP .PD 0 \fB\f(CBgsl_data_handle_new_crop\fP\f1(\fI\f(CIsrc_handle\fP\f1, \fI\f(CIn_head_cut\fP\f1, \fI\f(CIn_tail_cut\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslDataHandle*\fP\f1 \fI\f(CIsrc_handle\fP\f1; T{ source GslDataHandle T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_head_cut\fP\f1; T{ number of values to cut at data handle head T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_tail_cut\fP\f1; T{ number of values to cut at data handle tail T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a newly created data handle T} .TE .ad Create a new data handle containing the contents of \fI\f(CIsrc_handle\fP\f1 minus \fI\f(CIn_head_cut\fP\f1 values at the start and \fI\f(CIn_tail_cut\fP\f1 values at the end. .TP .PD 0 \fB\f(CBgsl_data_handle_new_cut\fP\f1(\fI\f(CIsrc_handle\fP\f1, \fI\f(CIcut_offset\fP\f1, \fI\f(CIn_cut_values\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslDataHandle*\fP\f1 \fI\f(CIsrc_handle\fP\f1; T{ source GslDataHandle T} \fI\f(CIGslLong \fP\f1 \fI\f(CIcut_offset\fP\f1; T{ offset of gap into \fI\f(CIsrc_handle\fP\f1 T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_cut_values\fP\f1; T{ length of gap in \fI\f(CIsrc_handle\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a newly created data handle T} .TE .ad Create a new data handle containing the contents of \fI\f(CIsrc_handle\fP\f1 minus \fI\f(CIn_cut_values\fP\f1 at offset \fI\f(CIcut_offset\fP\f1. .TP .PD 0 \fB\f(CBgsl_data_make_fade_ramp\fP\f1(\fI\f(CIdhandle\fP\f1, \fI\f(CImin_pos\fP\f1, \fI\f(CImax_pos\fP\f1, \fI\f(CIlength_p\fP\f1); .na .TS nokeep; l l l. \fI\f(CIdhandle\fP\f1; T{ valid and opened \fI\f(CIGslDataHandle\fP\f1 T} \fI\f(CImin_pos\fP\f1; T{ position within \fI\f(CIdhandle\fP\f1 T} \fI\f(CImax_pos\fP\f1; T{ position within \fI\f(CIdhandle\fP\f1 T} \fI\f(CIlength_p\fP\f1; T{ location to store the length of the fade ramp in T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ newly allocated float block with fade ramp T} .TE .ad Create a float value block of abs (\fI\f(CImax_pos\fP\f1 - \fI\f(CImin_pos\fP\f1) values, which contain a fade ramp of values from \fI\f(CIdhandle\fP\f1, with \fI\f(CImin_pos\fP\f1 indicating the minimum of the fade ramp and \fI\f(CImax_pos\fP\f1 indicating its maximum. .TP .PD 0 \fB\f(CBgsl_filter_butter_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Butterworth bandpass filter. .TP .PD 0 \fB\f(CBgsl_filter_butter_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Butterworth bandstop filter. .TP .PD 0 \fB\f(CBgsl_filter_butter_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ passband frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Butterworth highpass filter. .TP .PD 0 \fB\f(CBgsl_filter_butter_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ cutoff frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at cutoff frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Butterworth lowpass filter. .TP .PD 0 \fB\f(CBgsl_filter_fir_approx\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIvalue\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ order of the filter (must be oven, >= \fC2\f1) T} \fI\f(CIfreq\fP\f1; T{ the frequencies of the transfer function T} \fI\f(CIvalue\fP\f1; T{ the desired value of the transfer function T} .TE .ad Approximates a given transfer function with an iorder-coefficient FIR filter. It is recommended to provide enough frequency values, so that \fI\f(CIn_points\fP\f1 >= \fI\f(CIiorder\fP\f1. .TP .PD 0 \fB\f(CBgsl_filter_sine_scan\fP\f1(\fI\f(CIorder\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIn_values\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint \fP\f1 \fI\f(CIorder\fP\f1; T{ order of the iir filter T} \fI\f(CIconst gdouble*\fP\f1 \fI\f(CIa\fP\f1; T{ root polynomial coefficients of the filter a[\fC0\f1..order] T} \fI\f(CIconst gdouble*\fP\f1 \fI\f(CIb\fP\f1; T{ pole polynomial coefficients of the filter b[\fC0\f1..order] T} \fI\f(CIgdouble \fP\f1 \fI\f(CIfreq\fP\f1; T{ frequency to test T} \fI\f(CIguint \fP\f1 \fI\f(CIn_values\fP\f1; T{ number of samples T} .TE .ad This function sends a sine signal of the desired frequency through an IIR filter, to test the value of the transfer function at a given point. It uses gsl_iir_filter_eval to do so. Compared to a "mathematical approach" of finding the transfer function, this function makes it possible to see the effects of finite arithmetic during filter evaluation. The first half of the output signal is not considered, since a lot of IIR filters have a transient phase where also overshoot is possible. For n_values, you should specify a reasonable large value. It should be a lot larger than the filter order, and large enough to let the input signal become (close to) \fC1.0\f1 multiple times. .TP .PD 0 \fB\f(CBgsl_filter_tscheb1_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC1\f1 bandpass filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb1_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC1\f1 bandstop filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb1_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ passband frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC1\f1 highpass filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb1_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ cutoff frequency (\fC0\f1..pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at cutoff frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC1\f1 lowpass filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_bp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIsteepness\fP\f1; T{ frequency steepness factor T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC2\f1 bandpass filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_bs\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq1\fP\f1, \fI\f(CIfreq2\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order (must be even) T} \fI\f(CIfreq1\fP\f1; T{ passband end frequency (\fC0\f1..pi) T} \fI\f(CIfreq2\fP\f1; T{ stopband end frequency (\fC0\f1..pi) T} \fI\f(CIsteepness\fP\f1; T{ frequency steepness factor T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC2\f1 bandstop filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_hp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ stopband frequency (\fC0\f1..pi) T} \fI\f(CIsteepness\fP\f1; T{ frequency steepness T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC2\f1 highpass filter. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_lp\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIfreq\fP\f1, \fI\f(CIsteepness\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIa\fP\f1, \fI\f(CIb\fP\f1); .na .TS nokeep; l l l. \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIfreq\fP\f1; T{ passband cutoff frequency (\fC0\f1..pi) T} \fI\f(CIsteepness\fP\f1; T{ frequency steepness (c_freq * steepness < pi) T} \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIa\fP\f1; T{ root polynomial coefficients a[\fC0\f1..iorder] T} \fI\f(CIb\fP\f1; T{ pole polynomial coefficients b[\fC0\f1..iorder] T} .TE .ad Tschebyscheff type \fC2\f1 lowpass filter. To gain a transition band between freq1 and freq2, pass arguements \fI\f(CIfreq\fP\f1=freq1 and \fI\f(CIsteepness\fP\f1=freq2/freq1. To specify the transition band width in fractions of octaves, pass \fI\f(CIsteepness\fP\f1=\fC2\f1^octave_fraction. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_steepness\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIc_freq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIresidue\fP\f1); .na .TS nokeep; l l l. \fI\f(CIunsigned int \fP\f1 \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIdouble \fP\f1 \fI\f(CIc_freq\fP\f1; T{ passband cutoff frequency (\fC0\f1..pi) T} \fI\f(CIdouble \fP\f1 \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIdouble \fP\f1 \fI\f(CIresidue\fP\f1; T{ maximum of transfer function in stopband (\fC0\f1..\fC1\f1) T} .TE .ad Calculates the steepness parameter for Tschebyscheff type \fC2\f1 lowpass filter, based on ripple residue in the stop band. .TP .PD 0 \fB\f(CBgsl_filter_tscheb2_steepness_db\fP\f1(\fI\f(CIiorder\fP\f1, \fI\f(CIc_freq\fP\f1, \fI\f(CIepsilon\fP\f1, \fI\f(CIstopband_db\fP\f1); .na .TS nokeep; l l l. \fI\f(CIunsigned int \fP\f1 \fI\f(CIiorder\fP\f1; T{ filter order T} \fI\f(CIdouble \fP\f1 \fI\f(CIc_freq\fP\f1; T{ passband cutoff frequency (\fC0\f1..pi) T} \fI\f(CIdouble \fP\f1 \fI\f(CIepsilon\fP\f1; T{ fall off at passband frequency (\fC0\f1..\fC1\f1) T} \fI\f(CIdouble \fP\f1 \fI\f(CIstopband_db\fP\f1; T{ reduction in stopband in dB (>= \fC0\f1) T} .TE .ad Calculates the steepness parameter for Tschebyscheff type \fC2\f1 lowpass filter, based on the ripple residue in the stop band. .TP .PD 0 \fB\f(CBgsl_hfile_close\fP\f1(\fI\f(CIhfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslHFile*\fP\f1 \fI\f(CIhfile\fP\f1; T{ valid \fI\f(CIGslHFile\fP\f1 T} .TE .ad Close and destroy a \fI\f(CIGslHFile\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_hfile_open\fP\f1(\fI\f(CIfile_name\fP\f1); .na .TS nokeep; l l l. \fI\f(CIconst gchar*\fP\f1 \fI\f(CIfile_name\fP\f1; T{ name of the file to open T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a new opened \fI\f(CIGslHFile\fP\f1 or NULL if an error occoured (errno set) T} .TE .ad Open a file for reading and return the associated GSL hashed file. The motivation for using a \fI\f(CIGslHFile\fP\f1 over normal unix file descriptors is to reduce the amount of opened unix file descriptors and to ensure thread safety upon reading offset relative byte blocks. Multiple open \fI\f(CIGslHFiles\fP\f1 with equal file names will share a single unix file descriptor as long as the file wasn't modified meanwhile. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_hfile_pread\fP\f1(\fI\f(CIhfile\fP\f1, \fI\f(CIoffset\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslHFile*\fP\f1 \fI\f(CIhfile\fP\f1; T{ valid GslHFile T} \fI\f(CIGslLong \fP\f1 \fI\f(CIoffset\fP\f1; T{ offset in bytes within \fC0\f1 and file end T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_bytes\fP\f1; T{ number of bytes to read T} \fI\f(CIgpointer \fP\f1 \fI\f(CIbytes\fP\f1; T{ buffer to store read bytes T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ amount of bytes read or -\fC1\f1 if an error occoured (errno set) T} .TE .ad Read a block of bytes from a GslHFile. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_hfile_zoffset\fP\f1(\fI\f(CIhfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslHFile*\fP\f1 \fI\f(CIhfile\fP\f1; T{ valid GslHFile T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ offset of first zero byte or -\fC1\f1 T} .TE .ad Find the offset of the first zero byte in a GslHFile. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_power2_fftac\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .na .TS nokeep; l l l. \fI\f(CIn_values\fP\f1; T{ Number of complex values T} \fI\f(CIri_values_in\fP\f1; T{ Complex sample values [\fC0\f1..n_values*\fC2\f1-\fC1\f1] T} \fI\f(CIri_values_out\fP\f1; T{ Complex frequency values [\fC0\f1..n_values*\fC2\f1-\fC1\f1] T} .TE .ad This function performs a decimation in time fourier transformation in forward direction, where the input values are equidistant sampled data, and the output values contain the frequency proportions of the input. The input and output arrays are complex values with real and imaginery portions interleaved, adressable in the range [\fC0\f1..\fC2\f1*n_values-\fC1\f1], where n_values must be a power of two. Frequencies are stored in-order, the K-th output corresponds to the frequency K/n_values. (If you want to interpret negative frequencies, note that the frequencies -K/n_values and (n_values-K)/n_values are equivalent). Note that the transformation is performed out of place, the input array is not modified, and may not overlap with the output array. .TP .PD 0 \fB\f(CBgsl_power2_fftar\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIr_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .na .TS nokeep; l l l. \fI\f(CIn_values\fP\f1; T{ Number of complex values T} \fI\f(CIr_values_in\fP\f1; T{ Real sample values [\fC0\f1..n_values-\fC1\f1] T} \fI\f(CIri_values_out\fP\f1; T{ Complex frequency values [\fC0\f1..n_values-\fC1\f1] T} .TE .ad Real valued variant of \fB\f(CBgsl_power2_fftac()\fP\f1, the input array contains real valued equidistant sampled data [\fC0\f1..n_values-\fC1\f1], and the output array contains the positive frequency half of the complex valued fourier transform. Note, that the complex valued fourier transform H of a purely real valued set of data, satisfies \fB\f(CBH(-f)\fP\f1 = Conj(\fB\f(CBH(f)\fP\f1), where \fB\f(CBConj()\fP\f1 denotes the complex conjugate, so that just the positive frequency half suffices to describe the entire frequency spectrum. Even so, the resulting n_values/\fC2\f1 complex frequencies are one value off in storage size, but the resulting frequencies \fB\f(CBH(\fC0\f1)\fP\f1 and \fB\f(CBH(n_values/\fC2\f1)\fP\f1 are both real valued, so the real portion of \fB\f(CBH(n_values/\fC2\f1)\fP\f1 is stored in ri_values_out[\fC1\f1] (the imaginery part of \fB\f(CBH(\fC0\f1)\fP\f1), so that both r_values_in and ri_values_out can be of size n_values. Note that the transformation is performed out of place, the input array is not modified, and may not overlap with the output array. .TP .PD 0 \fB\f(CBgsl_power2_fftsc\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIri_values_out\fP\f1); .na .TS nokeep; l l l. \fI\f(CIn_values\fP\f1; T{ Number of complex values T} \fI\f(CIri_values_in\fP\f1; T{ Complex frequency values [\fC0\f1..n_values*\fC2\f1-\fC1\f1] T} \fI\f(CIri_values_out\fP\f1; T{ Complex sample values [\fC0\f1..n_values*\fC2\f1-\fC1\f1] T} .TE .ad This function performs a decimation in time fourier transformation in backwards direction with normalization. As such, this function represents the counterpart to \fB\f(CBgsl_power2_fftac()\fP\f1, that is, a value array which is transformed into the frequency domain with \fB\f(CBgsl_power2_fftac()\fP\f1 can be reconstructed by issuing \fB\f(CBgsl_power2_fftsc()\fP\f1 on the transform. Note that the transformation is performed out of place, the input array is not modified, and may not overlap with the output array. .TP .PD 0 \fB\f(CBgsl_power2_fftsr\fP\f1(\fI\f(CIn_values\fP\f1, \fI\f(CIri_values_in\fP\f1, \fI\f(CIr_values_out\fP\f1); .na .TS nokeep; l l l. \fI\f(CIn_values\fP\f1; T{ Number of complex values T} \fI\f(CIri_values_in\fP\f1; T{ Complex frequency values [\fC0\f1..n_values-\fC1\f1] T} \fI\f(CIr_values_out\fP\f1; T{ Real sample values [\fC0\f1..n_values-\fC1\f1] T} .TE .ad Real valued variant of \fB\f(CBgsl_power2_fftsc()\fP\f1, counterpart to \fB\f(CBgsl_power2_fftar()\fP\f1, using the same frequency storage format. A real valued data set transformed into the frequency domain with \fB\f(CBgsl_power2_fftar()\fP\f1 can be reconstructed using this function. Note that the transformation is performed out of place, the input array is not modified, and may not overlap with the output array. .TP .PD 0 \fB\f(CBgsl_rfile_close\fP\f1(\fI\f(CIrfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid \fI\f(CIGslRFile\fP\f1 T} .TE .ad Close and destroy a \fI\f(CIGslRFile\fP\f1. .TP .PD 0 \fB\f(CBgsl_rfile_length\fP\f1(\fI\f(CIrfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid \fI\f(CIGslRFile\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ total length of the \fI\f(CIGslRFile\fP\f1 in bytes T} .TE .ad Retrieve the file length of \fI\f(CIrfile\fP\f1 in bytes. .TP .PD 0 \fB\f(CBgsl_rfile_name\fP\f1(\fI\f(CIrfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid \fI\f(CIGslRFile\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ the file name used to open this file T} .TE .ad Retrieve the file name used to open \fI\f(CIrfile\fP\f1. .TP .PD 0 \fB\f(CBgsl_rfile_open\fP\f1(\fI\f(CIfile_name\fP\f1); .na .TS nokeep; l l l. \fI\f(CIconst gchar*\fP\f1 \fI\f(CIfile_name\fP\f1; T{ name of the file to open T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ a new opened \fI\f(CIGslRFile\fP\f1 or NULL if an error occoured (errno set) T} .TE .ad Open a file for reading and create a GSL read only file handle for it. The motivation for using a \fI\f(CIGslRFile\fP\f1 over normal unix files is to reduce the amount of opened unix file descriptors by using a \fI\f(CIGslHFile\fP\f1 for the actual IO. .TP .PD 0 \fB\f(CBgsl_rfile_position\fP\f1(\fI\f(CIrfile\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid \fI\f(CIGslRFile\fP\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ current position within \fC0\f1 and \fB\f(CBgsl_rfile_length()\fP\f1 T} .TE .ad Retrieve the current \fI\f(CIGslRFile\fP\f1 seek position. .TP .PD 0 \fB\f(CBgsl_rfile_pread\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIoffset\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid GslRFile T} \fI\f(CIGslLong \fP\f1 \fI\f(CIoffset\fP\f1; T{ offset in bytes within \fC0\f1 and \fB\f(CBgsl_rfile_length()\fP\f1 T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_bytes\fP\f1; T{ number of bytes to read T} \fI\f(CIgpointer \fP\f1 \fI\f(CIbytes\fP\f1; T{ buffer to store read bytes T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ amount of bytes read or -\fC1\f1 if an error occoured (errno set) T} .TE .ad Read a block of bytes from a GslRFile at a specified position. .TP .PD 0 \fB\f(CBgsl_rfile_read\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIn_bytes\fP\f1, \fI\f(CIbytes\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid GslRFile T} \fI\f(CIGslLong \fP\f1 \fI\f(CIn_bytes\fP\f1; T{ number of bytes to read T} \fI\f(CIgpointer \fP\f1 \fI\f(CIbytes\fP\f1; T{ buffer to store read bytes T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ amount of bytes read or -\fC1\f1 if an error occoured (errno set) T} .TE .ad Read a block of bytes from a GslRFile from the current seek position and advance the seek position. .TP .PD 0 \fB\f(CBgsl_rfile_seek_set\fP\f1(\fI\f(CIrfile\fP\f1, \fI\f(CIoffset\fP\f1); .na .TS nokeep; l l l. \fI\f(CIGslRFile*\fP\f1 \fI\f(CIrfile\fP\f1; T{ valid \fI\f(CIGslRFile\fP\f1 T} \fI\f(CIGslLong \fP\f1 \fI\f(CIoffset\fP\f1; T{ new seek position within \fC0\f1 and \fB\f(CBgsl_rfile_length()\fP\f1+\fC1\f1 T} \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ resulting position within \fC0\f1 and \fB\f(CBgsl_rfile_length()\fP\f1+\fC1\f1 T} .TE .ad Set the current \fI\f(CIGslRFile\fP\f1 seek position. .TP .PD 0 \fB\f(CBgsl_thread_awake_before\fP\f1(\fI\f(CItick_stamp\fP\f1); .na .TS nokeep; l l l. \fI\f(CIguint64 \fP\f1 \fI\f(CItick_stamp\fP\f1; T{ tick stamp update to trigger wakeup T} .TE .ad Wakeup the currently running thread upon the last global tick stamp update (see \fB\f(CBgsl_tick_stamp()\fP\f1) that happens prior to updating the global tick stamp to \fI\f(CItick_stamp\fP\f1. (If the moment of wakeup has already passed by, the thread is woken up at the next global tick stamp update.) .TP .PD 0 \fB\f(CBgsl_tick_stamp\fP\f1(); .na .TS nokeep; l l l. \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ GSL's execution tick stamp as unsigned 64bit integer T} .TE .ad Retrieve the global GSL tick counter stamp. GSL increments its global tick stamp at certain intervals, by specific amounts (refer to \fB\f(CBbse_engine_init()\fP\f1 for further details). The tick stamp is a non-wrapping, unsigned 64bit integer greater than \fC0.\f1 Threads can schedule sleep interruptions at certain tick stamps with \fB\f(CBsfi_thread_awake_after()\fP\f1 and \fB\f(CBsfi_thread_awake_before()\fP\f1. Tick stamp updating occours at GSL engine block processing boundaries, so code that can guarantee to not run across those boundaries (for instance \fB\f(CBBseProcessFunc()\fP\f1 functions) may use the macro \fCGSL_TICK_STAMP\f1 to retrieve the current tick in a faster manner (not involving mutex locking). See also \fB\f(CBbse_module_tick_stamp()\fP\f1. This function is MT-safe and may be called from any thread. .TP .PD 0 \fB\f(CBgsl_tick_stamp_last\fP\f1(); .na .TS nokeep; l l l. \h'-2m'\fI\f(CIRETURNS:\fP\f1 T{ Current tick stamp and system time in micro seconds T} .TE .ad Get the system time of the last GSL global tick stamp update. This function is MT-safe and may be called from any thread. .SH SEE ALSO .PP BSE Procedures (bse-procs(3)) .br .PP \fIDocument Revised:\fP Wed May 25 23:38:22 2005 .br